w DemoModel()
{
T1 = D1 + 1,
T2 = D2 + "77777",
T3 = D3.AddDays(1)
}
);
}
public DemoModel HelloSendModel(DemoModel model)
{
model.T1 = model.T1 + 10;
model.T2 = model.T2 + "11";
model.T3 = model.T3.AddDays(12);
return model;
}
public DemoModel HelloSendModelParm(string name, DemoModel model)
{
model.T1 = model.T1 + 10;
model.T2 = model.T2 + "11";
model.T3 = model.T3.AddDays(12);
if (model.Child != null)
{
model.Child.C1 = name+"说:"+ model.Child.C1;
}
return model;
}
public List<DemoModel> HelloSendModelList(List<DemoModel> model)
{
return model.Select(t => new DemoModel() { T1=t.T1+10,T2=t.T2+"13",T3=t.T3.AddYears(1),Child=t.Child }).ToList();
}
}
}
然后启动服务端监听。
class Program
{
static void Main(string[] args)
{
var host = new HostBuilder()
.ConfigureHostConfiguration(i => i.AddJsonFile("CzarConfig.json"))
.ConfigureLogging((hostContext, configLogging) =>
{
configLogging.AddConsole();
})
.UseCodec<JsonCodec>()
.UseLibuvTcpHost()
.UseProxy()
.UseConsoleLifetime()
.Build();
host.RunAsync().Wait();
}
}
启用外部使用CzarConfig.json的配置文件,注意需要设置成始终复制。
{
"CzarHost": {
"Port": 7711, //监听端口
"QuietPeriodSeconds": 2, //退出静默时间 DotNetty特性
"ShutdownTimeoutSeconds": 2, //关闭超时时间 DotNetty特性
"IsSsl": "false", //是否启用 SSL, 客户端需要保持一致
"PfxPath": "cert/datasync.pfx", //证书
"PfxPassword": "123456" //证书密钥
}
}
到此服务器端搭载完成。
3、客户端
新建客户端控制台程序Czar.Rpc.Client
,然后配置Rpc调用信息。
{
"CzarHost": {
"ProxyEndPoint": true, //是否启用动态服务地址,就是指定服务端IP
"IsSsl": "false", //是否启用SSL
"PfxPath": "cert/datasync.pfx", //证书
"PfxPassword": "123456", //证书密钥
"ClientConfig": { //客户端配置
"Demo.Rpc.Hello": { //对应服务[CzarRpc("Demo.Rpc.Hello")] 值
"Host": "127.0.0.1", //服务端IP 如果ProxyEndPoint=false 时使用
"Port": 7711, //服务端端口 如果ProxyEndPoint=false 时使用
"Timeout": 10, //调用超时时间
"WriterIdleTimeSeconds";30 //空闲超时时间,默认为30秒,非内网环境建议设置成5分钟内。
}
}
}
}
现在开始启用客户端信息。
class Program
{
public static IServiceProvider service;
public static IConfiguration config;
static async Task Main(string[] args)
{
try
{
var builder = new ConfigurationBuilder();
config = builder.AddJsonFile("CzarConfig.json").Build();
service = new ServiceCollection()
.AddSingleton(config)
.AddLogging(j => j.AddConsole())
.AddLibuvTcpClient(config)
.AddProxy()
.BuildDynamicProxyServiceProvider();
var rpc = service.GetRequiredService<IHelloRpc>();
//使用的内部指定的服务器地址
rpc.CzarEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7711);
var result = string.Empty;
string t = "基本调用";
result = rpc.Hello(18, t);
Console.WriteLine(result);
result = "无返回结果";
rpc.HelloHolder(1, out result);
Console.WriteLine(result);
result = await rpc.HelloTask(2, "异步任务");
Console.WriteLine(result);
result = "单向";
rpc.HelloOneway(3, "单向调用");
Console.WriteLine(result);
result = await rpc.HelloValueTask(4, "ValueTask任务");
Console.Wr