说明

一般的RPC服务都是客户端发起,服务器响应。但是有时候也需要服务器主动调用客户端,所以反向RPC应运而生。

定义、发布反向RPC服务

实际上,RpcClient也实现了IRpcParser接口,这意味着反向RPC其实也是RPC,只不过,当客户端和服务器建立连接以后,就不再区分谁是客户端,谁是服务器了。只关心,谁能提供服务,谁在调用服务

  1. 在客户端项目中定义服务
  2. TouchRpc标记
    1. public class ReverseCallbackServer : ServerProvider
    2. {
    3. [TouchRpc]
    4. public int ConPerformance(int age)
    5. {
    6. return ++age;
    7. }
    8. }

【客户端发布服务】
发布服务,实际上是让TcpRpcClient也拥有提供RPC的能力。

  1. RpcService service = new RpcService();
  2. //service.ShareProxy(new IPHost(8848));//分享反向代理RPC代理文件,需要时调用
  3. TcpRpcClient client = new TcpRpcClient();
  4. service.AddRpcParser("client", client);//添加解析
  5. service.RegisterServer<ReverseCallbackServer>();//注册服务
  6. client.Setup(new RRQMConfig()
  7. .SetRemoteIPHost(new IPHost("127.0.0.1:7789"))
  8. .SetProxyToken("RPC"));
  9. client.Connect("123RPC");
  10. client.DiscoveryService("RPC");
  11. Console.WriteLine("成功连接");

三、调用反向RPC

服务器回调客户端,最终必须通过RpcSocketClient或派生类来调用。
并且,RpcSocketClient已实现IRpcClient接口,意味着,反向RPC也可以使用代理调用。所有用法和RPC一致。
反向RPC(服务器主动Call客户端) - 图1

3.1 获取RpcSocketClient的途径

除了继承TcpService的获取方式以外,RPC还支持调用上下文获取。具体操作如下:

  1. RRQMRPC标签属性中声明IncludeCallContext
  2. 服务方法的第一个参数必须为ICallContext的接口或派生类。

【通过调用上下文】

  1. [Description("测试调用上下文")]
  2. [RRQMRPC(MethodFlags.IncludeCallContext)]
  3. public string GetCallerID(ICallContext callContext)
  4. {
  5. if (callContext.Caller is RpcSocketClient socketClient)
  6. {
  7. return socketClient.ID;
  8. }
  9. return null;
  10. }