RPC框架主要组成
- 通信框架
- 通信协议
- 序列化和反序列化格式
1 分类
RPC框架主要分为:
1.1 绑定语言平台
1.1.1 Dubbo
国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持Java
架构
- Consumer 服务消费者
- Provider 服务提供者
- Registry 注册中心
- Monitor是监控系统
交互流程
- Consumer通过Registry获取到Provider节点
- 再通过Dubbo的客户端SDK与Provider建立连接,并发起调用
- Provider通过Dubbo的服务端SDK接收到Consumer请求
- 处理后再把结果返回给Consumer
服务消费者、提供者都需引入Dubbo的SDK才来完成RPC调用,因为Dubbo是用Java实现,所以要求服务消费者、提供者也都必须用Java。
主要实现
- 默认采用Netty作为通信框架
- 除了支持私有的Dubbo协议外,还支持RMI、Hession、HTTP、Thrift
- 支持多种序列化格式,比如Dubbo、Hession、JSON、Kryo、FST
1.1.2 Motan
微博内部使用的RPC框架,于2016年对外开源,仅支持Java。
架构
与Dubbo类似,都要在Client端(服务消费者)和Server端(服务提供者)引入SDK
- register
和注册中心交互,包括注册服务、订阅服务、服务变更通知、服务心跳发送等功能。Server端会在系统初始化时通过register模块注册服务,Client端会在系统初始化时通过register模块订阅到具体提供服务的Server列表,当Server列表发生变更时也由register模块通知Client。 - protocol
用来进行RPC服务的描述和RPC服务的配置管理,这一层还可以添加不同功能的filter用来完成统计、并发限制等功能。 - serialize
将RPC请求中的参数、结果等对象进行序列化与反序列化,即进行对象与字节流的互相转换,默认使用对Java更友好的Hessian 2进行序列化。 - transport
用来进行远程通信,默认使用Netty NIO的TCP长链接方式。 - cluster
Client端使用的模块,cluster是一组可用的Server在逻辑上的封装,包含若干可以提供RPC服务的Server,实际请求时会根据不同的高可用与负载均衡策略选择一个可用的Server发起远程调用。