三、 Dubbo2协议
1. 协议使用方式说明
Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
• Transporter:mina,netty,grizzy
• Serialization:dubbo,hessian2,java,json
• Dispatcher:all,direct,message,execution,connection
• ThreadPool:fixed,cached
缺省协议,使用基于netty 3.2.5.Final和hessian2 3.2.1-fixed-2(Alibaba embed version)的tbremoting交互。
• 连接个数:单连接。
• 连接方式:长连接。
• 传输协议:TCP。
• 传输方式:NIO异步传输。
• 序列化:Hessian二进制序列化。
• 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
• 适用场景:常规远程服务方法调用。
约束
• 参数及返回值需实现Serializable接口。
• 参数及返回值不能自定义实现List,Map,Number,Date,Calendar等接口,只能用JDK自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。
• Hessian序列化,只传成员属性值和值的类型,不传方法或静态变量,兼容情况。
接口增加方法,对客户端无影响,如果该方法不是客户端需要的,客户端不需要重新部署。输入参数和结果集中增加属性,对客户端无影响,如果客户端并不需要新属性,不用重新部署。
输入参数和结果集属性名变化,对客户端序列化无影响,但是如果客户端不重新部署,不管输入还是输出,属性名变化的属性值是获取不到的。
总结
• 服务器端和客户端对领域对象并不需要完全一致,而是按照最大匹配原则。
• 会抛异常的情况:枚举值一边多一种,一边少一种,正好使用了差别的那种,或者属性名相同,类型不同。
《Apache Dubbo微服务开发从入门到精通》——通信协议—— 三、 Dubbo2协议(中):https://developer.aliyun.com/article/1224597