搞定 Dubbo 系列(五):Dubbo的序列化协议

Love The Way You Lie 2023-06-27 11:08 126阅读 0赞

Dubbo是RPC服务端端框架的杰出代表,由于走TCP天生比HTTP快的原因,在springboot盛行的restful(http)情况下,dubbo依旧火热。今天来总结下dubbo常见的几种序列化协议。

一、dubbo协议(默认)

dubbo协议是默认推荐的协议。使用单一长连接NIO 异步通信基于 hessian 作为序列化协议。适用于:传输数据量小,并发量高的场景(一般消费者服务远多于提供者服务)。

  1. 连接个数:单连接
  2. 连接方式:长连接
  3. 传输协议:TCP
  4. 传输方式:NIO异步传输
  5. 序列化:Hessian 二进制序列化
  6. 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
  7. 适用场景:常规远程服务方法调用

长连接,就是建立连接过后可以持续发送请求,无须再建立连接。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoaXBmZWlfY3Nkbg_size_16_color_FFFFFF_t_70

二、hessian协议(较少使用)

Hessian 协议使用 Hessian二进制序列化,多个短连接,底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。

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

注:如果使用servlet派发请求,协议的端口<dubbo:protocol port="8080" />必须与servlet容器的端口相同;协议的上下文路径<dubbo:protocol contextpath="foo" />必须与servlet应用的上下文路径相同。

三、rmi协议(较少使用)

基于Java 二进制序列化,多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。采用JDK标准的java.rmi.*实现,采用阻塞式短连接JDK标准序列化方式 。

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

如果服务接口继承了java.rmi.Remote接口,可以和原生RMI互操作。如果服务接口没有继承java.rmi.Remote接口,缺省Dubbo将自动生成一个com.xxx.XxxService$Remote的接口,并继承java.rmi.Remote接口,并以此接口暴露服务。

四、http协议

基于http的远程调用协议,json序列化,和restful类似。

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

配置,

  1. <!-- 配置协议:-->
  2. <dubbo:protocol name="http" port="8080" />
  3. <!-- 配置 Jetty Server (默认):-->
  4. <dubbo:protocol ... server="jetty" />
  5. <!-- 配置 Servlet Bridge Server (推荐使用): -->
  6. <dubbo:protocol ... server="servlet" />

配置DispatcherServlet,

  1. <servlet>
  2. <servlet-name>dubbo</servlet-name>
  3. <servlet-class>org.apache.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>dubbo</servlet-name>
  8. <url-pattern>/*</url-pattern>
  9. </servlet-mapping>

注意,如果使用 servlet 派发请求:

  • 协议的端口 必须与 servlet 容器的端口相同,
  • 协议的上下文路径 必须与 servlet 应用的上下文路径相同。

五、webservice协议

基于 WebService 的远程调用协议,使用 SOAP 文本序列化。基于CXF的 frontend-simple 和 transports-http 实现。

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:HTTP
  • 传输方式:同步传输
  • 序列化:SOAP文本序列化
  • 适用场景:系统集成,跨语言调用

六、其他协议

dubbo总共支持9中序列化协议,除了以上五种,还有:rest、redis、memcached、thrift四种。

七、多协议配置

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

1、不同服务使用不同协议

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="world" />
  7. <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
  8. <!-- 多协议配置 -->
  9. <dubbo:protocol name="dubbo" port="20880" />
  10. <dubbo:protocol name="rmi" port="1099" />
  11. <!-- 指定使用 dubbo协议 -->
  12. <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
  13. <!-- 指定使用 rmi协议 -->
  14. <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" />
  15. </beans>

2、同一服务使用多种协议

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="world" />
  7. <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
  8. <!-- 多协议配置 -->
  9. <dubbo:protocol name="dubbo" port="20880" />
  10. <dubbo:protocol name="hessian" port="8080" />
  11. <!-- 使用多个协议暴露服务 -->
  12. <dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
  13. </beans>

#

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Dubbo序列对象

    序列化对象 Dubbo分为服务端,客户端 客户端调用服务,需要将pojo传递给客户端调用者 对象在传输过程中,需要序列化 在表现层,需要反序列化对象 对象序列