协议参考手册
dubbo://
< 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” />
|
- Transporter
- mina, netty, grizzy
- Serialization
- dubbo, hessian2, java, json
- Dispatcher
- all, direct, message, execution, connection
- ThreadPool
- fixed, cached
< 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”>表示该服务使用独立两条长连接。
< dubbo:protocol name = "dubbo" accepts = "1000" />
|
缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
- 连接个数:单连接
- 连接方式:长连接
- 传输协议:TCP
- 传输方式:NIO异步传输
- 序列化:Hessian二进制序列化
- 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
- 适用场景:常规远程服务方法调用
为什么要消费者比提供者个数多:
因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问题。
(1) 约束:
- 参数及返回值需实现Serializable接口
- 参数及返回值不能自定义实现List, Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失。()
- Hessian序列化,只传成员属性值和值的类型,不传方法或静态变量,兼容情况:(由吴亚军提供)
数据通讯 情况 结果 A->B 类A多一种 属性(或者说类B少一种 属性) 不抛异常,A多的那 个属性的值,B没有, 其他正常 A->B 枚举A多一种 枚举(或者说B少一种 枚举),A使用多 出来的枚举进行传输 抛异常 A->B 枚举A多一种 枚举(或者说B少一种 枚举),A不使用 多出来的枚举进行传输 不抛异常,B正常接 收数据 A->B A和B的属性 名相同,但类型不相同 抛异常 A->B serialId 不相同 正常传输 总结:会抛异常的情况:枚 举值一边多一种,一边少一种,正好使用了差别的那种,或者属性名相同,类型不同
接口增加方法,对客户端无影响,如果该方法不是客户端需要的,客户端不需要重新部署;
输入参数和结果集中增加属性,对客户端无影响,如果客户端并不需要新属性,不用重新
部署;
输入参数和结果集属性名变化,对客户端序列化无影响,但是如果客户端不重新部署,不管输入还是输出,属性名变化的属性值是获取不到的。
总结:服务器端和客户端对领域对象并不需要完全一致,而是按照最大匹配原则。
(2) 配置:
dubbo.properties:
dubbo.service.protocol=dubbo |
rmi://
- 如果服务接口继承了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" />
|
Java标准的远程调用协议。
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:TCP
- 传输方式:同步传输
- 序列化:Java标准二进制序列化
- 适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
- 适用场景:常规远程服务方法调用,与原生RMI服务互操作
(1) 约束:
- 参数及返回值需实现Serializable接口
- dubbo配置中的超时时间对rmi无效,需使用java启动参数设置:-Dsun.rmi.transport.tcp.responseTimeout=3000,参见下面的RMI配置。
(2) 配置:
dubbo.properties:
dubbo.service.protocol=rmi |
(3) RMI配置:
java -Dsun.rmi.transport.tcp.responseTimeout= 3000
|
更多RMI优化参数请查看:
http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html
hessian://
依赖:
< dependency >
< groupId >com.caucho</ groupId >
< artifactId >hessian</ artifactId >
< version >4.0.7</ version >
</ dependency >
|
可以和原生Hessian服务互操作,即:
- 提供者用Dubbo的Hessian协议暴露服务,消费者直接用标准Hessian接口调用,
- 或者提供方用标准Hessian暴露服务,消费方用Dubbo的Hessian协议调用。
基于Hessian的远程调用协议。
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:HTTP
- 传输方式:同步传输
- 序列化:Hessian二进制序列化
- 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
- 适用场景:页面传输,文件传输,或与原生hessian服务互操作
(1) 约束:
- 参数及返回值需实现Serializable接口
- 参数及返回值不能自定义实现List, Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失。
(2) 配置:
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" />
|
h4. Jetty Server: (default)
< dubbo:protocol ... server = "jetty" />
|
h4. 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派发请求:
- 协议的端口<dubbo:protocol port="8080" />必须与servlet容器的端口相同,
- 协议的上下文路径<dubbo:protocol contextpath="foo" />必须与servlet应用的上下文路径相同。
http://
基于http表单的远程调用协议。参见:[HTTP协议使用说明]
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:HTTP
- 传输方式:同步传输
- 序列化:表单序列化
- 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
- 适用场景:需同时给应用程序和浏览器JS使用的服务。
(1) 约束:
- 参数及返回值需符合Bean规范
(2) 配置:
dubbo.xml:
<dubbo:protocol name= "http" port= "8080" />
|
h4. Jetty Server: (default)
< dubbo:protocol ... server = "jetty" />
|
h4. 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派发请求:
- 协议的端口<dubbo:protocol port="8080" />必须与servlet容器的端口相同,
- 协议的上下文路径<dubbo:protocol contextpath="foo" />必须与servlet应用的上下文路径相同。
webservice://
依赖:
< 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协议调用。
基于WebService的远程调用协议。
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:HTTP
- 传输方式:同步传输
- 序列化:SOAP文本序列化
- 适用场景:系统集成,跨语言调用。
(1) 约束:
- 参数及返回值需实现Serializable接口
- 参数尽量使用基本类型和POJO。
(2) 配置:
Define hessian 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:
h4. Jetty Server: (default)
< dubbo:protocol ... server = "jetty" />
|
h4. 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派发请求:
- 协议的端口<dubbo:protocol port="8080" />必须与servlet容器的端口相同,
- 协议的上下文路径<dubbo:protocol contextpath="foo" />必须与servlet应用的上下文路径相同。
thrift://
依赖:
< dependency >
< groupId >org.apache.thrift</ groupId >
< artifactId >libthrift</ artifactId >
< version >0.8.0</ version >
</ dependency >
|
所有服务共用一个端口:(与原生Thrift不兼容)
<dubbo:protocol name= "thrift" port= "3030" />
|
Thrift不支持数据类型:
- null值 (不能在协议中传递null值)
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" />
|
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" />
|
延迟暴露
延迟5秒暴露服务:
< dubbo:service delay = "5000" />
|
延迟到Spring初始化完成后,再暴露服务:(基于Spring的ContextRefreshedEvent事件触发暴露)
< dubbo:service delay = "-1" />
|
并发控制
限制com.foo.BarService的每个方法,服务器端并发执行(或占用线程池线程数)不能超过10个:
< dubbo:service interface = "com.foo.BarService" executes = "10" />
|
限制com.foo.BarService的sayHello方法,服务器端并发执行(或占用线程池线程数)不能超过10个:
< dubbo:service interface = "com.foo.BarService" >
< dubbo:method name = "sayHello" executes = "10" />
</ dubbo:service >
|
限制com.foo.BarService的每个方法,每客户端并发执行(或占用连接的请求数)不能超过10个:
< dubbo:service interface = "com.foo.BarService" actives = "10" />
|
Or:
< dubbo:reference interface = "com.foo.BarService" actives = "10" />
|
限制com.foo.BarService的sayHello方法,每客户端并发执行(或占用连接的请求数)不能超过10个:
< dubbo:service interface = "com.foo.BarService" >
< dubbo:method name = "sayHello" actives = "10" />
</ dubbo:service >
|
Or:
< dubbo:reference interface = "com.foo.BarService" >
< dubbo:method name = "sayHello" actives = "10" />
</ dubbo:service >
|
如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>优先,参见:配置的覆盖策略。
Load Balance均衡:
配置服务的客户端的loadbalance属性为leastactive,此Loadbalance会调用并发数最小的Provider(Consumer端并发数)。
< dubbo:reference interface = "com.foo.BarService" loadbalance = "leastactive" />
|
Or:
< dubbo:service interface = "com.foo.BarService" loadbalance = "leastactive" />
|
连接控制
限制服务器端接受的连接不能超过10个:(以连接在Server上,所以配置在Provider上)
< dubbo:provider protocol = "dubbo" accepts = "10" />
|
< dubbo:protocol name = "dubbo" accepts = "10" />
|
限制客户端服务使用连接连接数:(如果是长连接,比如Dubbo协议,connections表示该服务对每个提供者建立的长连接数)
< dubbo:reference interface = "com.foo.BarService" connections = "10" />
|
Or:
< dubbo:service interface = "com.foo.BarService" connections = "10" />
|
如果<dubbo:service>和<dubbo:reference>都配了connections,<dubbo:reference>优先,参见:配置的覆盖策略。
延迟连接
< dubbo:protocol name = "dubbo" lazy = "true" />
|
粘滞连接
< dubbo:protocol name = "dubbo" sticky = "true" />
|
相关推荐
连接控制 延迟连接 粘滞连接 令牌验证 路由规则 配置规则 服务降级 优雅停机 主机绑定 日志适配 访问日志 服务容器 Reference Config缓存 分布式事务13-1-13 U serG uide-zh -D ubbo -A libaba O pen S esam e code....
【Dubbo】dubbo 默认协议 170 【Dubbo】dubbo注册中心zookeeper支持的功能 171 【Dubbo】集群容错怎么做 171 【Dubbo】说说核心的配置有哪些? 173 【Dubbo】服务上线怎么不影响旧版本? 174 【Dubbo】dubbo使用中...
Hermes是一款基于Netty的可以支持百万级别的并发连接的高性能、高度可扩展的的网络通讯框架,它参考了dubbo和sofa-bolt的网络通讯模块的设计,hemers可以使用在IM、长连接等领域,它具有以下的特性: 私有的通讯...
MySQL提供了一系列安全措施,如用户账户管理、访问权限控制、SSL/TLS加密连接、审计日志等功能,确保数据的安全性和合规性。同时,MySQL附带了一系列管理工具,如MySQL Server、MySQL Workbench、MySQL Shell等,...
基于Nginx实现访问控制、连接限制 Nginx动静分离实战 Nginx Location ReWrite 等语法配置及原理分析 Nginx提供https服务 基于Nginx+lua完成访问流量实时上报Kafka的实战 Netty 高性能NIO框架 IO 的基本概念、...
其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主要分为功能测试,性能测试,稳定性测试,安全性测试等。 在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。相比UI层...
连接池 串行化技术 影子Master架构 批量写入 配置中心 去中心化 通讯机制 同步 RPC RMI 异步 MQ Cron 数据层架构设计 缓存优化 DAO&ORM; 双主架构 主从同步 读写分离 性能优化架构能力 代码级别...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...
WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...