RPC(远程过程调用) 的架构最常见的是“动态代理”方式,事先定义好接口,用一个代理假装实现了这个接口(真正的实现放在服务端),供客户端调用,代理内部将该方法调用封装成一个网络请求送到服务端。服务端根据参数找到对应的注册好的对象处理,返回给客户端。
官网的gRPC的宏观的架构图如下:
客户端调用 stub 对象,所谓 stub 对象就类似代理对象一样。作为跟服务通讯的封装抽象。
在 gRPC 里,stub 对象将请求用 protobuf 方式序列化成字节流,用于线上传输,到 server 端后调用真正的实现对象处理。
Java 的客户端和服务器实现也是遵循这个架构的。
gRPC-Java 的插件会给我们自动产生一个 GreeterGrpc(招待员类)封装了三种跟服务器接口通讯的方案:
- 同步阻塞调用;
- 异步回调;
- 同步非阻塞。
对于 Stub ,可以用下面思维导图简单描述:
客户端的调用都是通过 Stub的。
所有 Stub 的 new 都需要传入一个 channel 参数。
管道层 gRPC 默认提供了 4钟 Channel,如下图:
参考资料:
gRPC 入门及源码分析
http://evthoriz.com/2015/07/07/gRPC-tutorial/