• dubbo中几种protocol的理解


    dubbo:service 标签有 protocol这个属性,在多协议时使用,多个协议ID用逗号分隔。

    那么我们可以看下具体有哪几个值:
    dubbo 默认
    rmi
    hessian
    http
    webservice
    thrift
    memcached
    redis

    特性

    dubbo

    Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

    Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
    http://dubbo.io/user-guide/reference-protocol/dubbo.html

    RMI

    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的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。

    warningHessian 是Caucho开源的一个 RPC 框架,其通讯效率高于WebService和Java自带的序列化。
    依赖hessian的包

     
    com.caucho  hessian 
    4.0.7 
    
    
    • 1
    • 2
    • 3
    • 4

    底层使用的是hessian
    com.caucho.hessian.server.HessianSkeleton
    hessian的暴露服务过程
    http://blog.csdn.net/java2000_wl/article/details/7557842

    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 包

    
        org.apache.thrift
        libthrift
        0.8.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    底层
    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的地址:

    
    
    • 1

    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的地址:

  • 相关阅读:
    嵌套合并如何操作,合并视频的同时设置新视频标题
    org.apache.ibatis.binding.BindingException: Parameter ‘xxx‘ not found 总结
    vue3+ts+uniapp实现小程序端input获取焦点计算上推页面距离
    2024级199管理类联考之数学基础(上篇)
    英国物联网初创公司【FourJaw】完成180万英镑融资
    CAPL 无法处理 xlsx 表格,Python老大哥曲线助攻
    AMSR/ADEOS-II L1A Raw Observation Counts V003地球表面和大气微波辐射的详细观测数据
    Linux内核面试题(1)
    HBuilder(uniapp) 配置android模拟器
    核心函数--少儿编程
  • 原文地址:https://blog.csdn.net/emgexgb_sef/article/details/126327925