• 对于Dubbo一些面试题自己的答案


    Dubbo

          头几天瞧到《Java顶尖口试必问-Dubbo口试题汇总》,对于内里得难点本人试着答复少许,有错误得请民众指正。

          Dubbo固然大概不革新了,可是背靠阿里得措施能力,中文报告得多样,非常合适很多几中小型分散式类型得开辟。

    一、Dubbo通讯协议

          第一、dubbo

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

    反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

    dubbo-protocol.jpg

    • Transporter: mina, netty, grizzy
    • Serialization: dubbo, hessian2, java, json
    • Dispatcher: all, direct, message, execution, connection
    • ThreadPool: fixed, cached

    特性

    缺省协议,使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。

    • 连接个数:单连接
    • 连接方式:长连接
    • 传输协议:TCP
    • 传输方式:NIO 异步传输
    • 序列化:Hessian 二进制序列化
    • 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
    • 适用场景:常规远程服务方法调用

       第二、RMI

          

    rmi://

    RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。

    注意:如果正在使用 RMI 提供服务给外部访问 1,同时应用里依赖了老的 common-collections 包 2 的情况下,存在反序列化安全风险 3

    特性

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:TCP
    • 传输方式:同步传输
    • 序列化:Java 标准二进制序列化
    • 适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
    • 适用场景:常规远程服务方法调用,与原生RMI服务互操作

          第三、hessian

         

    Hessian 1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。

    Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:

    • 提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用
    • 或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。

    特性

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:HTTP
    • 传输方式:同步传输
    • 序列化:Hessian二进制序列化
    • 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
    • 适用场景:页面传输,文件传输,或与原生hessian服务互操作

          第四、Http

          

    基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 1

    特性

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:HTTP
    • 传输方式:同步传输
    • 序列化:表单序列化
    • 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
    • 适用场景:需同时给应用程序和浏览器 JS 使用的服务。

          第五、WebService

          

    基于 WebService 的远程调用协议,基于 Apache CXF 1frontend-simpletransports-http 实现 2

    可以和原生 WebService 服务互操作,即:

    • 提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,
    • 或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 WebService 协议调用。
    • 特性

      • 连接个数:多连接
      • 连接方式:短连接
      • 传输协议:HTTP
      • 传输方式:同步传输
      • 序列化:SOAP 文本序列化
      • 适用场景:系统集成,跨语言调用

          第六、thrift

          

    当前 dubbo 支持 1的 thrift 协议是对 thrift 原生协议 2 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。

    使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。

          第七、缓存

    memcached://

    基于 memcached 1 实现的 RPC 协议 2

    redis://

    基于 Redis 1 实现的 RPC 协议 2

    二、注册中心

         

    1)Multicast 注册中心

    Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。

    /user-guide/images/multicast.jpg

    1. 提供方启动时广播自己的地址
    2. 消费方启动时广播订阅请求
    3. 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了 unicast=false,则广播给订阅者
    4. 消费方收到提供方地址时,连接该地址进行 RPC 调用。

    组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.255.255

    2)zookeeper 注册中心

    Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 1

    /user-guide/images/zookeeper.jpg

    流程说明:

    • 服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
    • 服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
    • 监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

    支持以下功能:

    • 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
    • 当注册中心重启时,能自动恢复注册数据,以及订阅请求
    • 当会话过期时,能自动恢复注册数据,以及订阅请求
    • 当设置 <dubbo:registry check="false" /> 时,记录失败注册和订阅请求,后台定时重试
    • 可通过 <dubbo:registry username="admin" password="1234" /> 设置 zookeeper 登录信息
    • 可通过 <dubbo:registry group="dubbo" /> 设置 zookeeper 的根节点,不设置将使用无根树
    • 支持 * 号通配符 <dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者

    3)Redis 注册中心

    基于 Redis 1 实现的注册中心 2

    /user-guide/images/dubbo-redis-registry.jpg

    使用 Redis 的 Key/Map 结构存储数据结构:

    • 主 Key 为服务名和类型
    • Map 中的 Key 为 URL 地址
    • Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除 3

    使用 Redis 的 Publish/Subscribe 事件通知数据变更:

    • 通过事件的值区分事件类型:register, unregister, subscribe, unsubscribe
    • 普通消费者直接订阅指定服务提供者的 Key,只会收到指定服务的 register, unregister 事件
    • 监控中心通过 psubscribe 功能订阅 /dubbo/*,会收到所有服务的所有变更事件

    调用过程:

    1. 服务提供方启动时,向 Key:/dubbo/com.foo.BarService/providers 下,添加当前提供者的地址
    2. 并向 Channel:/dubbo/com.foo.BarService/providers 发送 register 事件
    3. 服务消费方启动时,从 Channel:/dubbo/com.foo.BarService/providers 订阅 registerunregister 事件
    4. 并向 Key:/dubbo/com.foo.BarService/providers 下,添加当前消费者的地址
    5. 服务消费方收到 registerunregister 事件后,从 Key:/dubbo/com.foo.BarService/providers 下获取提供者地址列表
    6. 服务监控中心启动时,从 Channel:/dubbo/* 订阅 registerunregister,以及 subscribeunsubsribe事件
    7. 服务监控中心收到 registerunregister 事件后,从 Key:/dubbo/com.foo.BarService/providers 下获取提供者地址列表
    8. 服务监控中心收到 subscribeunsubsribe 事件后,从 Key:/dubbo/com.foo.BarService/consumers 下获取消费者地址列表

    4)Simple 注册中心

    Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。

    三、集群容错

    Failover Cluster

    失败自动切换,当出现失败,重试其它服务器 1。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

    重试次数配置如下:

    <dubbo:service retries="2" />
    

    <dubbo:reference retries="2" />
    

    <dubbo:reference>
        <dubbo:method name="findFoo" retries="2" />
    </dubbo:reference>
    

    Failfast Cluster

    快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

    Failsafe Cluster

    失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

    Failback Cluster

    失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

    Forking Cluster

    并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

    Broadcast Cluster

    广播调用所有提供者,逐个调用,任意一台报错则报错 2。通常用于通知所有提供者更新缓存或日志等本地资源信息。

    http://www.njszjw.gov.cn/jrjd/02017082114135.html

  • 相关阅读:
    hibernate悲观锁和乐观锁 Mr
    windows窗体调整
    我是一只草泥马
    草泥马2号
    用友二次开发 用友控件 Js宿主脚本 调用用友T6 登录 参照 控件示例
    KRBTabControl 不能不能输入
    藕のC#语法と
    ぇ份の测试ょ
    初学者编程入门:C语言指针使用方法
    开始写点东西了。。。。
  • 原文地址:https://www.cnblogs.com/lqmblog/p/8548528.html
Copyright © 2020-2023  润新知