RPC 框架

发布时间 2023-10-18 14:15:09作者: archaique

基本组成:

 

Client (客户端):服务调用方。
Server(服务端):服务提供方。
Client Stub(客户端存根):存放服务端的消息,负责将客户端的请求参数打包成网络消息,然后通过网络发送给服务提供方。
Server Stub(服务端存根):接收客户端发送的消息,再将客户端请求参数打包成网络消息,然后通过网络远程发送给服务方。

其它:

 

  • 序列化协议:
  • 网络协议:TCP, HTTP 等(TCP 更快(Dubbo),因为 HTTP header 内容过多(SpringCloud))
  • 注册中心:Zookeeper CP 保证一致性,Eureka AP 保证可用性

 

Dubbo

zookeeper 作为注册中心:

  • 提供者节点: /GLOBAL_REGISTRY/tuling.dubbo.server.UserService/providers
    • 存放的内容是一个所有注册的提供者的 URL List  [dubbo://127.0.0.1:12345/tuling.dubbo.server.UserService?application=myapp1&dubbo=2.0.2&protocal=dubbo&..., dubbo://..... ]
    • 在提供者中进行负载均衡
  • 消费者节点:/GLOBAL_REGISTRY/tuling.dubbo.server.UserService/consumers
    • 存放的内容是一个所有注册的提供者的 URL List  [consumer://127.0.0.1:12345/tuling.dubbo.server.UserService?application=myapp2&dubbo=2.0.2&protocal=dubbo&..., consumer://..... ]
  • 提供者动态配置节点:/GLOBAL_REGISTRY/tuling.dubbo.server.UserService/configurators
  • 消费者路由策略节点:/GLOBAL_REGISTRY/tuling.dubbo.server.UserService/routers

网络协议是 TCP

序列化协议是 Hessian

Dubbo序列化支持java、compactedjava、nativejava、fastjson、dubbo、fst、hessian2、kryo,其中默认hessian2。其中java、compactedjava、nativejava属于原生java的序列化。

  • dubbo 序列化:阿里尚未开发成熟的高效java序列化实现,阿里不建议在生产环境使用它。
  • hessian2 序列化:hessian是一种跨语言的高效二进制序列化方式。但这里实际不是原生的hessian2序列化,而是阿里修改过的,它是dubbo RPC默认启用的序列化方式。
  • json 序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实现的简单json库,但其实现都不是特别成熟,而且 json这种文本序列化性能一般不如上面两种二进制序列化。
  • java 序列化:主要是采用JDK自带的Java序列化实现,性能很不理想。

JDK Serializable中通过serialVersionUID控制序列化类的版本,如果序列化与反序列化版本不一致,则会抛出java.io.InvalidClassException异常信息,提示序列化与反序列化SUID不一致。

dubbo序列化主要由Serialization(序列化策略)、DataInput(反序列化,二进制->对象)、DataOutput(序列化,对象->二进制流) 来进行数据的序列化与反序列化。