dubbo:service 标签有 protocol这个属性,在多协议时使用,多个协议ID用逗号分隔。
那么我们可以看下具体有哪几个值:
dubbo 默认
rmi
hessian
http
webservice
thrift
memcached
redis
特性
dubbo
Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
RMI
RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。
如果正在使用RMI提供服务给外部访问(公司内网环境应该不会有攻击风险),同时应用里依赖了老的common-collections包(dubbo不会依赖这个包,请排查自己的应用有没有使用)的情况下,存在反序列化安全风险。其底层使用的是spring-context包里的
org.springframework.remoting.rmi.RmiServiceExporter
底层用的是java的rmi技术。
hessian
Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
warningHessian 是Caucho开源的一个 RPC 框架,其通讯效率高于WebService和Java自带的序列化。
依赖hessian的包
<dependency>
<groupId>com.caucho</groupId> <artifactId>hessian</artifactId>
<version>4.0.7</version>
</dependency>
底层使用的是hessian
com.caucho.hessian.server.HessianSkeleton
hessian的暴露服务过程
http
基于http表单的远程调用协议。参见:HTTP协议使用说明
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器JS使用的服务。
底层使用的是
org.springframework.remoting.httpinvoke.HttpInvokerServiceExporter
webservice
基于CXF的frontend-simple和transports-http实现。
check CXF是Apache开源的一个RPC框架:http://cxf.apache.org,由Xfire和Celtix合并而来 。
底层使用org.apache.cxf.transport.servlet.ServletController
Thrift
当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码,后续版本中会在这方面做一些增强。
依赖Thrift 包
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.8.0</version>
</dependency>
底层
URL url = invoker.getUrl().addParameter(Constants.CODEC_KEY, ThriftCodec.NAME);
只是使用ThriftCodec做了个编码
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.BarServicecategory=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">
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.BarServicecategory=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash”));
然后在客户端使用时,不需要感知Redis的地址: