创建rpc服务
一、说明
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
过程是什么? 过程就是业务处理、计算任务,更直白的说,就是程序,就是想调用本地方法一样调用远程的过程。
TouchRpc支持服务器与客户端互相调用,也支持客户端之间相互调用。
二、定义服务
- 在被调用端中新建一个类名为MyRpcServer。
- 继承于RpcServer类、或实现IRpcServer。亦或者将服务器声明为瞬时生命的服务,继承TransientRpcServer、或ITransientRpcServer。
- 在该类中写公共方法,并用TouchRpc属性标签标记。
public class MyRpcServer : RpcServer
{
[Description("登录")]//服务描述,在生成代理时,会变成注释。
[TouchRpc("Login")]//服务注册的函数键,此处为显式指定。默认不传参的时候,为该函数类全名+方法名的全小写。
public bool Login(string account,string password)
{
if (account=="123"&&password=="abc")
{
return true;
}
return false;
}
}
public class MyRpcServer : TransientRpcServer
{
[Description("登录")]//服务描述,在生成代理时,会变成注释。
[TouchRpc("Login")]//服务注册的函数键,此处为显式指定。默认不传参的时候,为该函数类全名+方法名的全小写。
public bool Login(string account,string password)
{
if (account=="123"&&password=="abc")
{
return true;
}
return false;
}
}
提示
瞬时生命的服务,最大的特点就是,每个请求,都会创建一个新的服务类对象。然后可以通过this.CallContext直接访问当前的调用上下文。
三、启动Rpc服务器
以下仅示例基于Tcp协议TouchRpc。其他协议的服务器请看创建TouchRpc服务器
var service =new TcpTouchRpcService();
TouchSocketConfig config= new TouchSocketConfig()//配置
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
.ConfigureRpcStore(a=>
{
a.RegisterServer<MyRpcServer>();//注册服务
})
.SetVerifyToken("TouchRpc");
service.Setup(config)
.Start();
service.Logger.Info($"{service.GetType().Name}已启动");
四、调用Rpc
4.1 直接调用
直接调用,则是不使用任何代理,使用字符串和参数直接Call Rpc,使用比较简单。
下列以TcpTouchRpcClient为例,其他客户端一模一样。
TcpTouchRpcClient client = new TcpTouchRpcClient();
client.Setup(new TouchSocketConfig()
.SetRemoteIPHost("127.0.0.1:7789")
.SetVerifyToken("TouchRpc"));
client.Connect();
//直接调用时,第一个参数为调用键
//第二个参数为调用配置参数,可设置调用超时时间,取消调用等功能。示例中使用的预设,实际上可以自行new InvokeOption();
//后续参数为调用参数。
//泛型为 返回值类型。
bool result = client.Invoke<bool>("Login", InvokeOption.WaitInvoke, 123, "abc");