说明
一般的RPC服务都是客户端发起,服务器响应。但是有时候也需要服务器主动调用客户端,所以反向RPC应运而生。
定义、发布反向RPC服务
实际上,RpcClient也实现了IRpcParser接口,这意味着反向RPC其实也是RPC,只不过,当客户端和服务器建立连接以后,就不再区分谁是客户端,谁是服务器了。只关心,谁能提供服务,谁在调用服务。
- 在客户端项目中定义服务
- 用TouchRpc标记
public class ReverseCallbackServer : ServerProvider
{
[TouchRpc]
public int ConPerformance(int age)
{
return ++age;
}
}
【客户端发布服务】
发布服务,实际上是让TcpRpcClient也拥有提供RPC的能力。
RpcService service = new RpcService();
//service.ShareProxy(new IPHost(8848));//分享反向代理RPC代理文件,需要时调用
TcpRpcClient client = new TcpRpcClient();
service.AddRpcParser("client", client);//添加解析
service.RegisterServer<ReverseCallbackServer>();//注册服务
client.Setup(new RRQMConfig()
.SetRemoteIPHost(new IPHost("127.0.0.1:7789"))
.SetProxyToken("RPC"));
client.Connect("123RPC");
client.DiscoveryService("RPC");
Console.WriteLine("成功连接");
三、调用反向RPC
服务器回调客户端,最终必须通过RpcSocketClient或派生类来调用。
并且,RpcSocketClient已实现IRpcClient接口,意味着,反向RPC也可以使用代理调用。所有用法和RPC一致。
3.1 获取RpcSocketClient的途径
除了继承TcpService的获取方式以外,RPC还支持调用上下文获取。具体操作如下:
- RRQMRPC标签属性中声明IncludeCallContext
- 服务方法的第一个参数必须为ICallContext的接口或派生类。
【通过调用上下文】
[Description("测试调用上下文")]
[RRQMRPC(MethodFlags.IncludeCallContext)]
public string GetCallerID(ICallContext callContext)
{
if (callContext.Caller is RpcSocketClient socketClient)
{
return socketClient.ID;
}
return null;
}