RPC基本原理
什么是RPC
RPC是远程过程调用(Remote Procedure Call)的缩写。
像调用本地方法一样调用远程方法。
RPC原理
核心是代理机制
- 本地代理存根:Stub
- 生成了一个代理类
- 本地序列化/反序列化
- 借口/方法/参数序列化为二进制数据
- 网络通信
- 可以走各种协议:tcp/udp/http
- 远程序列化/反序列化
- 远程服务存根:Skeleton
- 找到实现类,负责去调用
- 调用实际业务服务
- 原路返回服务结果
- 返回给本地调用方
RPC是基于接口的远程服务调用。
- 设计:本地应用程序与远程应用程序需要共享什么信息,角色有什么不同
- 共享:POJO实体类定义,接口定义。注意,定义指的并非一定是一个java的实体类,也可以是其他选择:WSDL/WADL/IDL。好处:可以跨语言平台。
- 本地-》消费者,远程-》提供者
- 代理
- java:动态代理,字节码增强;c#有远程代理
- 深入理解java反射和字节码增强和面向对象的关系
- 字节码增强完全破坏了面向对象
- 序列化:序列化和反序列化的选择
- 语言原生的序列化:RMI,Remoting
- 二进制平台无关Hessian,avro,kyro,fst等
- 传输时数据包比较短小
- 文本/JSON/XML/JSON RPC等
- 网络传输
- TCP/SSL
- http/https
- 查找实现类:通过借口查找服务端实现类
- 一般是注册方式:dubbo默认将接口和实现类配置到spring
RPC技术框架
如何设计一个RPC
从哪些方面考虑
- 基于共享接口还是IDL(接口描述语言)
- 动态代理or aop
- 序列化用什么,文本 or 二进制
- 基于tcp还是http
- 服务端如何查找实现类
- 异常处理
从RPC到分布式服务化
分布式场景,除了能远程调用方法,还需要考虑什么
- 多个相同服务如何管理
- 服务的注册发现机制
- 如何负载均衡/路由等集群功能
- 熔断/限流等治理能力
- 重试等策略
- 高可用/监控/性能等
网友评论