Rpc功能
定义
命名空间:TouchSocket.Dmtp.Rpc
程序集:TouchSocket.Dmtp.dll
一、说明
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
过程是什么? 过程就是业务处理、计算任务,更直白的说,就是程序,就是想调用本地方法一样调用远程的过程。
本Rpc是基于Dmtp协议的Rpc组件。其功能包括:
- 支持客户端主动调用服务器。
- 支持服务主动调用客户端。
- 支持客户端之间互相调用。
- 支持绝大多数数据类型及自定义实体类。
- 支持自定义序列化。
- 支持out,ref关键字。
二、使用Rpc服务
2.1 定义服务
- 在服务器端中新建一个类名为MyRpcServer。
- 继承于RpcServer类、或实现IRpcServer。亦或者将服务器声明为瞬时生命的服务,继承TransientRpcServer、或ITransientRpcServer。
- 在该类中写公共方法,并用DmtpRpc属性标签标记。
public partial class MyRpcServer : RpcServer
{
[Description("登录")]//服务描述,在生成代理时,会变成注释。
[DmtpRpc(InvokeKey ="Login")]//服务注册的函数键,此处为显式指定。默认不传参的时候,为该函数类全名+方法名的全小写。
public bool Login(string account, string password)
{
if (account == "123" && password == "abc")
{
return true;
}
return false;
}
}
public partial class MyRpcServer : TransientRpcServer
{
[Description("登录")]//服务描述,在生成代理时,会变成注释。
[DmtpRpc(InvokeKey ="Login")]//服务注册的函数键,此处为显式指定。默认不传参的时候,为该函数类全名+方法名的全小写。
public bool Login(string account,string password)
{
if (account=="123"&&password=="abc")
{
return true;
}
return false;
}
}
信息
ITransientRpcServer
和IRpcServer
相比,意为瞬时生命服务,即实现ITransientRpcServer
的服务,在每次被调用时,都会创建一个新的服务实例。其优点为可以直接通过this.CallContext
属性获得调用上下文。其缺点则是每次调用时会多消耗一些性能。
2.2 启动Dmtp并注册Rpc服务
以下仅示例基于Tcp协议Dmtp。其他协议的服务器请看创建Dmtp服务器
更多注册Rpc的方法请看注册Rpc服务
var service = new TcpDmtpService();
var config = new TouchSocketConfig()//配置
.SetListenIPHosts(7789)
.ConfigureContainer(a=>
{
a.AddRpcStore(store =>
{
store.RegisterServer<MyRpcServer>();//注册服务
});
})
.ConfigurePlugins(a =>
{
a.UseDmtpRpc();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Rpc"//连接验证口令。
});
await service.SetupAsync(config);
await service.StartAsync();
service.Logger.Info($"{service.GetType().Name}已启动");