知识点整理(四)——dubbo中支持的RPC协议

dobbo中目前支持的RPC协议

对比

协议 链接个数 链接方式 传输协议 传输方式 序列化 适用范围 适用场景
dubbo 单连接 长连接 TCP NIO异步传输 hessian二进制序列化 传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。 常规远程服务方法调用
http 多连接 短连接 HTTP 同步传输 表单序列化 传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。 需同时给应用程序和浏览器 JS 使用的服务。
hessian 多连接 短连接 HTTP 同步传输 Hessian二进制序列化 传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。 页面传输,文件传输,或与原生hessian服务互操作
rmi 多连接 短连接 TCP 同步传输 java标准二进制序列化 传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。 常规远程服务方法调用,与原生RMI服务互操作

dubbo协议

Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

  • Transporter: mina, netty, grizzy
  • Serialization: dubbo, hessian2, java, json
  • Dispatcher: all, direct, message, execution, connection
  • ThreadPool: fixed, cached
链接个数 链接方式 传输协议 传输方式 序列化 适用范围 适用场景
单连接 长连接 TCP NIO异步传输 hessian二进制序列化 传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。 常规远程服务方法调用

http协议

基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现

链接个数 链接方式 传输协议 传输方式 序列化 适用范围 适用场景
多连接 短连接 HTTP 同步传输 表单序列化 传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。 需同时给应用程序和浏览器 JS 使用的服务。

hessian协议

Hessian 1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。

链接个数 链接方式 传输协议 传输方式 序列化 适用范围 适用场景
多连接 短连接 HTTP 同步传输 Hessian二进制序列化 传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。 页面传输,文件传输,或与原生hessian服务互操作

rmi协议

RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。

链接个数 链接方式 传输协议 传输方式 序列化 适用范围 适用场景
多连接 短连接 TCP 同步传输 java标准二进制序列化 传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。 常规远程服务方法调用,与原生RMI服务互操作

其他

redis协议

基于 Redis 1 实现的 RPC 协议。

thrift协议

当前 dubbo 支持的 thrift 协议是对 thrift 原生协议 1 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。

gRPC协议

Dubbo 自 2.7.5 版本开始支持 gRPC 协议,对于计划使用 HTTP/2 通信,或者想利用 gRPC 带来的 Stream、反压、Reactive 编程等能力的开发者来说, 都可以考虑启用 gRPC 协议。

memcached 协议

基于 memcached 实现的 RPC 协议。

webservice协议

基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现。

Triple协议

Triple 协议是 Dubbo3 的主力协议,完整兼容 gRPC over HTTP/2,并在协议层面扩展了负载均衡和流量控制相关机制。