Apache Dubbo是一款高性能、轻量级的开源Java RPC框架。

特性

  • 面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
  • 智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
  • 服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
  • 高度可拓展能力:遵循微内核+插件的设计原则,所有核心服务如Protocol、Transport、Serialization被设计为拓展点,平等对待内置实现和第三方实现。
  • 运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
  • 可视化的服务治理和运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

    Dubbo处理流程

    image.png

  • 0. start:服务容器启动加载,运行服务提供者

  • 1. register:服务提供者启动时向注册中心注册自己提供的服务
  • 2. subscribe:服务消费者启动时向注册中心订阅自己所需的服务
  • 3. notify:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  • 4. invoke:服务消费者从提供者地址列表中基于软负载均衡算法选取一台提供者进行调用
  • 5. count:服务消费者和提供者,在内存中记录调用次数和调用时间,定时发送统计数据到监控中心

集群容错

image.png

节点说明

  • Invoker:这里的Invoker是Provider的一个可调用的Service的抽象,Invoker封装了Provider地址及Service接口信息
  • Directory:代表多个Invoker,可以把它看成List,但与List不同的是,它的值可能是动态变化的,比如注册中心的推送变更
  • Cluster:将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个
  • Router:负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等
  • LoadBalance:负责从多个Invoker中选出具体的一个用于本次调用,选的过程中包含了负载均衡算法,调用失败后,需要重选

    集群容错模式

    Failover(默认配置)
    失败自动切换,当出现失败,重试其它服务器。通常用于读取操作,但重试会带来更长延迟。可通过以下方式设置重试次数 ```java
  1. <dubbo:reference>
  2. <dubbo:method name="findFoo" retries="2" />

  1. <a name="KtKwY"></a>
  2. ##### Failfast
  3. 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
  4. <a name="9b7Zd"></a>
  5. ##### Failsafe
  6. 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
  7. <a name="d5onz"></a>
  8. ##### Failback
  9. 失败自动回复,后台记录失败请求,定时重发。通常用于消息通知。
  10. <a name="gj0Aj"></a>
  11. ##### Forking
  12. 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求比较高的读操作,但需要浪费更多的服务资源。
  13. <a name="nfywJ"></a>
  14. ##### Broadcast
  15. 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
  16. <a name="JMBTr"></a>
  17. #### 集群模式配置
  18. ```java
  19. // 服务提供方
  20. <dubbo:service cluster="failsafe">
  21. // 服务消费方
  22. <dubbo:reference cluster="failsafe">

负载均衡

负载均衡策略

  • Random:随机
  • RoundRobin:轮询
  • LeastActive:最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的提供者收到更少请求。
  • ConsistentHash:一致性Hash,相同参数的请求总是发同一提供者

    配置

    ```java // 服务端服务级别 // 服务端方法级别

// 客户端服务级别

// 客户端方法级别

```