搞定Dubbo的序列化协议

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. 适用场景:常规远程服务方法调用
<!--配置协议 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 多端口 -->
<dubbo:protocol id="dubbo1" name="dubbo" port="20880" />
<dubbo:protocol id="dubbo2" name="dubbo" port="20881" />

<!-- 配置协议选项 -->
<dubbo:protocol name="dubbo" port="9090" 
		server="netty" client="netty" 
		codec="dubbo" serialization="hessian2" 
		charset="UTF-8" 
		threadpool="fixed" threads="100"
		queues="0" iothreads="9" 
		buffer="8192" accepts="1000" payload="8388608" />

<!-- 默认单一长连接,如果数据量过大,也可以使用多个连接-->
<dubbo:protocol name="dubbo" connections="2" />

<!-- 为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护-->
<dubbo:protocol name="dubbo" accepts="1000" />

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

二、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使用的服务。

配置,

<!-- 配置协议:-->
<dubbo:protocol   name="http"  port="8080" />

<!-- 配置 Jetty Server (默认):-->
<dubbo:protocol ...  server="jetty" />

<!-- 配置 Servlet Bridge Server (推荐使用): -->
<dubbo:protocol ... server="servlet" />

配置DispatcherServlet,

<servlet>
         <servlet-name>dubbo</servlet-name>
         <servlet-class>org.apache.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
         <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
         <servlet-name>dubbo</servlet-name>
         <url-pattern>/*</url-pattern>
</servlet-mapping>

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

  • 协议的端口 <dubbo:protocol port="8080" /> 必须与 servlet 容器的端口相同,
  • 协议的上下文路径 <dubbo:protocol contextpath="foo" /> 必须与 servlet 应用的上下文路径相同。

五、webservice协议

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

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

六、其他协议

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

七、多协议配置

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    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"> 
    
    <dubbo:application name="world"  />
    <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
    
    <!-- 多协议配置 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <dubbo:protocol name="rmi" port="1099" />
    
    <!-- 指定使用 dubbo协议 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
    
    <!-- 指定使用 rmi协议 -->
    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /> 
    
</beans>

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    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">
    
    <dubbo:application name="world"  />
    <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
    
    <!-- 多协议配置 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <dubbo:protocol name="hessian" port="8080" />
    
    <!-- 使用多个协议暴露服务 -->
    <dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
    
</beans>

 

发布了125 篇原创文章 · 获赞 116 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shipfei_csdn/article/details/103851815