dubbo 支持的7种协议
建议看原文 转自:https://blog.csdn.net/xiaojin21cen/article/details/79834222  1、dubbo 协议 (默认)
2、rmi 协议
3、hessian 协议
4、http 协议
5、webservice 协议
6、thrift 协议
7、memcached 协议
8、redis 协议
面试题:
Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的。下面我们就针对Dubbo的每种协议详解讲解,以便我们在实际应用中能够正确取舍。1、dubbo 协议 (默认)

缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。

连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian 二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用
1、dubbo默认采用dubbo协议,dubbo协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
2、他不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。配置如下:
<dubbo:protocol name="dubbo" port="20880" />
<!-- Set default protocol: -->
<dubbo:provider protocol="dubbo" />
<~-- Set service protocol -->
<dubbo:service protocol="dubbo" />
<!-- Multi port -->
<dubbo:protocol id="dubbo1" name="dubbo" port="20880" />
<dubbo:protocol id="dubbo2" name="dubbo" port="20881" />.
<!-- Dubbo protocol options: -->
<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” />3、Dubbo协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接。<dubbo:protocol name="dubbo" connections="2" />
<dubbo:service connections=”0”>或<dubbo:reference connections=”0”>表示该服务使用JVM共享长连接。(缺省)
<dubbo:service connections=”1”>或<dubbo:reference connections=”1”>表示该服务使用独立长连接。
<dubbo:service connections=”2”>或<dubbo:reference connections=”2”>表示该服务使用独立两条长连接。4、为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护<dubbo:protocol name="dubbo" accepts="1000" />为什么要消费者比提供者个数多? 
因dubbo协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte),根据测试经验数据每条连接最多只能压满7MByte(不同的环境可能不一样,供参考),理论上1个服务提供者需要20个服务消费者才能压满网卡为什么不能传大包? 
因dubbo协议采用单一长连接,如果每次请求的数据包大小为500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大7MByte(不同的环境可能不一样,供参考),单个服务提供者的TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。单个消费者调用单个服务提供者的TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为瓶颈。为什么采用异步单一长连接? 
因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,比如Morgan的提供者只有6台提供者,却有上百台消费者,每天有1.5亿次调用,如果采用常规的hessian服务,服务提供者很容易就被压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,并使用异步IO,复用线程池,防止C10K问题。接口增加方法,对客户端无影响,如果该方法不是客户端需要的,客户端不需要重新部署;
输入参数和结果集中增加属性,对客户端无影响,如果客户端并不需要新属性,不用重新
部署;输入参数和结果集属性名变化,对客户端序列化无影响,但是如果客户端不重新部署,不管输入还是输出,属性名变化的属性值是获取不到的。总结:服务器端 和 客户端 对 领域对象 并不需要完全一致,而是按照最大匹配原则。如果不是集成Spring,单独配置如下:dubbo.service.protocol=dubbo

2、rmi 协议
Java标准的远程调用协议。连接个数:多连接
连接方式:短连接
传输协议:TCP
传输方式:同步传输
序列化:Java标准二进制序列化
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
适用场景:常规远程服务方法调用,与原生RMI服务互操作
1、RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式
注:
如果正在使用RMI提供服务给外部访问(公司内网环境应该不会有攻击风险),同时应用里依赖了老的common-collections包(dubbo不会依赖这个包,请排查自己的应用有没有使用)的情况下,存在反序列化安全风险。
请检查应用:
将commons-collections3 请升级到3.2.2版本:
https://commons.apache.org/proper/commons-collections/release_3_2_2.html
将commons-collections4 请升级到4.1版本:https://commons.apache.org/proper/commons-collections/release_4_1.html
新版本的commons-collections解决了该问题如果服务接口继承了java.rmi.Remote接口,可以和原生RMI互操作,即:
提供者用Dubbo的RMI协议暴露服务,消费者直接用标准RMI接口调用,或者提供方用标准RMI暴露服务,消费方用Dubbo的RMI协议调用。如果服务接口没有继承java.rmi.Remote接口,缺省Dubbo将自动生成一个com.xxx.XxxService$Remote的接口,并继承java.rmi.Remote接口,并以此接口暴露服务,但如果设置了<dubbo:protocol name="rmi" codec="spring" />,将不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服务,和Spring兼容。<!-- Define rmi protocol -->
<dubbo:protocol name="rmi" port="1099" />.
<!-- Set default protocol: -->
<dubbo:provider protocol="rmi" />
<!-- Set service protocol: -->
<dubbo:service protocol="rmi" />
<!-- Multi port -->
<dubbo:protocol id="rmi1" name="rmi" port="1099" />
<dubbo:protocol id="rmi2" name="rmi" port="2099" />
<dubbo:service protocol="rmi1" />
<!-- Spring compatible: -->
<dubbo:protocol name="rmi" codec="spring" />
3、hessian 协议
基于Hessian的远程调用协议。连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器JS使用的服务。
1、Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
2、Hessian是Caucho开源的一个RPC框架:http://hessian.caucho.com,其通讯效率高于WebService和Java自带的序列化。 
依赖:<dependency><groupId>com.caucho</groupId><artifactId>hessian</artifactId><version>4.0.7</version>
</dependency>可以和原生Hessian服务互操作,即:
提供者用Dubbo的Hessian协议暴露服务,消费者直接用标准Hessian接口调用,或者提供方用标准Hessian暴露服务,消费方用Dubbo的Hessian协议调用。约束
1、参数及返回值需实现Serializable接口 
2、参数及返回值不能自定义实现List, Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失。<!-- Define hessian protocol: -->
<dubbo:protocol name="hessian" port="8080" server="jetty" />
<!-- Set default protocol: -->
<dubbo:provider protocol="hessian" />
<!-- Set service protocol: -->
<dubbo:service protocol="hessian" />
<!-- Multi port: -->
<dubbo:protocol id="hessian1" name="hessian" port="8080" />
<dubbo:protocol id="hessian2" name="hessian" port="8081" />
<!-- Directly provider: -->
<dubbo:reference id="helloService" interface="HelloWorld" url="hessian://10.20.153.10:8080/helloWorld" />
<!-- Jetty Server -->
<dubbo:protocol ... server="jetty" />
<!-- Servlet Bridge Server -->
<dubbo:protocol ... server="servlet" />web.xml配置:<servlet><servlet-name>dubbo</servlet-name><servlet-class>com.alibaba.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派发请求
协议的端口必须与servlet容器的端口相同,
协议的上下文路径必须与servlet应用的上下文路径相同。

4、http 协议
基于http表单的远程调用协议。参见:[HTTP协议使用说明]连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器JS使用的服务。
1、采用Spring的 HttpInvoker 实现
配置<dubbo:protocol name="http" port="8080" />
<!-- Jetty Server -->
<dubbo:protocol ... server="jetty" />
<!-- Servlet Bridge Server -->
<dubbo:protocol ... server="servlet" />web.xml配置<servlet><servlet-name>dubbo</servlet-name><servlet-class>com.alibaba.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应用的上下文路径相同。
5、webservice 协议
基于WebService的远程调用协议连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:SOAP文本序列化
适用场景:系统集成,跨语言调用
1、基于CXF的 frontend-simple 和 transports-http 实现。
2、CXF是Apache开源的一个RPC框架:http://cxf.apache.org,由Xfire和Celtix合并而来 。依赖<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-simple</artifactId><version>2.6.1</version>
</dependency>
<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>2.6.1</version>
</dependency>可以和原生WebService服务互操作,即:
提供者用Dubbo的WebService协议暴露服务,消费者直接用标准WebService接口调用,或者提供方用标准WebService暴露服务,消费方用Dubbo的WebService协议调用。约束:
参数及返回值需实现Serializable接口
参数尽量使用基本类型和POJO。<!-- Define webservice protocol -->
<dubbo:protocol name="webservice" port="8080" server="jetty" />
<!-- Set default protocol -->
<dubbo:provider protocol="webservice" />
<!-- Set service protocol -->
<dubbo:service protocol="webservice" />
<!-- Multi port -->
<dubbo:protocol id="webservice1" name="webservice" port="8080" />
<dubbo:protocol id="webservice2" name="webservice" port="8081" />
<!-- Directly provider -->
<dubbo:reference id="helloService" interface="HelloWorld" url="webservice://10.20.153.10:8080/com.foo.HelloWorld" />
<!-- WSDL -->
http://10.20.153.10:8080/com.foo.HelloWorld?wsdl
<!-- Jetty Server: (default) -->
<dubbo:protocol ... server="jetty" />
<!-- Servlet Bridge Server: (recommend) -->
<dubbo:protocol ... server="servlet" />web.xml<servlet><servlet-name>dubbo</servlet-name><servlet-class>com.alibaba.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派发请求:
协议的端口必须与servlet容器的端口相同,
协议的上下文路径必须与servlet应用的上下文路径相同。6、thrift 协议
当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码,后续版本中会在这方面做一些增强
依赖<dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><version>0.8.0</version>
</dependency>配置:<dubbo:protocol name="thrift" port="3030" />Thrift不支持null值,不能在协议中传null7、memcached 协议
可以通过脚本或监控中心手工填写表单注册memcached服务的地址:RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash"));然后在客户端使用时,不需要感知Memcached的地址:<dubbo:reference id="cache" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" group="member" />或者点对点直连<dubbo:reference id="cache" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" url="memcached://10.20.153.10:11211" />自定义接口<dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" />方法名建议和memcached的标准方法名相同,即:get(key), set(key, value), delete(key)。
如果方法名和memcached的标准方法名不相同,则需要配置映射关系:(其中”p:xxx”为spring的标准p标签)<dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" p:set="putFoo" p:get="getFoo" p:delete="removeFoo" />8、redis 协议
可以通过脚本或监控中心手工填写表单注册redis服务的地址:RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("redis://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash"));然后在客户端使用时,不需要感知Redis的地址:<dubbo:reference id="store" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" group="member" />点对点直连

<dubbo:reference id="store" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" url="redis://10.20.153.10:6379" />自定义接口<dubbo:reference id="store" interface="com.foo.StoreService" url="redis://10.20.153.10:6379" />方法名建议和redis的标准方法名相同,即:get(key), set(key, value), delete(key)。
如果方法名和redis的标准方法名不相同,则需要配置映射关系:(其中”p:xxx”为spring的标准p标签)<dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211"p:set="putFoo" p:get="getFoo" p:delete="removeFoo" />面试题:
1、dubbo 默认使用什么序列化框架,你知道的还有哪些? 
默认使用Hessian序列化。还有Duddo、FastJson、Java自带序列化。2、dubbo推荐用什么协议? 
默认使用dubbo协议。

posted on 2019-04-23 14:21 shoshana~ 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/shoshana-kong/p/10756154.html

dubbo 支持的7种协议相关推荐

  1. dubbo 支持的9种协议

    Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,可是Dubbo官网是推荐咱们使用Dubbo协议的.html 目录 1.9种协议 一 ...

  2. dubbo协议_Dubbo框架支持多少种协议?各有什么特点?文中一一为你揭晓

    概述 Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议. 除了dubbo协议外, Dubbo框架还支持另外8种服务暴露协议,如rmi协议. hessian协议. ht ...

  3. 中dubbo所需要的依赖_Dubbo介绍、dubbo架构图、dubbo运行和执行流程、dubbo支持的协议以及支持的注册中心...

    第67次(Dubbo) 学习主题:Dubbo 学习目标: 掌握Dubbo的作用,理解Dubbo的架构图 掌握Dubbo支持的协议以及支持的注册中心 1. Dubbo介绍 1.1 什么是Dubbo? D ...

  4. Dubbo支持的协议

    注册中心做好了,那是先有provider还是先有consumer,肯定是provider,然后这里面我们知道,这些东西都可以单独的安装在不同的计算机中,他们之间通信的时候都是通过什么进行通信的,他们之 ...

  5. dubbo几种协议_Dubbo面试(简)

    Dubbo分布式系统详解:https://zhuanlan.zhihu.com/p/84506139 什么是Dubbo? Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来 ...

  6. 为什么都说Dubbo不适合传输大文件?Dubbo支持的协议

    背景 之前公司有一个 Dubbo 服务,内部封装了腾讯云的对象存储服务 SDK,是为了统一管理这种三方服务的SDK,其他系统直接调用这个对象存储的 Dubbo 服务.用来避免因平台 SDK 出现不兼容 ...

  7. 精通Dubbo——Dubbo支持的协议的详解

    Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的.下面我们就针对Dubbo的每种协 ...

  8. Dubbo 支持哪些序列化协议? Hessian 的数据结构?什么是PB ?为什么 PB 的效率是最高的?

    面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo 的基本工作原理 ...

  9. 【RPC Dubbo】各大开源rpc 框架 比较(dubbo支持的各种协议)

    文章目录 1. 前言 2. 服务 2.1 为什么要做服务 2.2 服务带来的挑战 2.3 服务未来的趋势 3. 框架 3.1 服务框架对比 3.1.1 Dubbo 3.1.2 Dubbox 3.1.3 ...

最新文章

  1. sharepoint站点Feature的定制与开发 以及 stsadm 常用命令
  2. socket php验证客户端验证,用Socket发送电子邮件(利用需要验证的SMTP服务器)_php基础...
  3. java parseint(12.0),如何实现一个parseInt
  4. Linux查找启动的隐藏服务,Linux服务器入侵检测排查方法
  5. Sublime Text, MikTeX (或TeXLive), SumatraPDF 配置LaTeX开发环境
  6. AI算力基础 -- TPU1.0
  7. php token过期时间,token过期是什么意思
  8. 互联网公司的完整开发流程是怎样的?
  9. Go go test测试机制介绍及实例【Go语言圣经笔记】
  10. 如何在 Kubernetes 集群中集成 Kata
  11. css3 - 图标元素动画效果4 - 动画延迟
  12. yarn WEB UI及reserved memory、spark WEB UI
  13. mysql列插入数据
  14. 2022企业邮箱移动oa办公系统使用攻略
  15. 陳三甲网络笔记:王力宏直播买课600多万,你能否年赚30万
  16. MarkDown-Typora MarkDown Reference
  17. 智能枕头方案/案列/APP
  18. LYNC客户端不显示通讯组里的用户的解决办法。
  19. 网防g01怎么防护个人计算机,为你的服务器安装公安1所研制的网防卫士G01
  20. ecmall mysql版本_ECMall的MySQL数据调用的简单方法

热门文章

  1. 通过淘宝API接口获取SKU标题、SKUID、SKU价格、总库存以及各SKU库存
  2. P、NP、NP-hard、NPC问题超简单理解
  3. Android 手把手完美教你美团wally(瓦力)多渠道打包 3种方法(针对签名V1和V2都会有很详细的介绍)
  4. python自动出题_Python出题
  5. CentOS 7 下关闭和开启防火墙
  6. mysql 邮箱长度_数据库中电子邮件地址的最佳长度是多less?
  7. java计算机毕业设计知识管理系统源码+数据库+系统+lw文档
  8. excel之非常实用的模糊查询
  9. 数值最优化-有效集法求解含有不等式约束的二次规划问题
  10. Photoshop CS5软件