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