有一个Dubbo的用户服务,在北京部署了10个,在上海部署了20个。一个杭州的服务消费方发起了一次调用,然后发生了以下的事情:

  • 根据配置的路由规则,如果杭州发起的调用,会路由到比较近的上海的20个 Provider。(服务路由
  • 根据配置的随机负载均衡策略,在20个 Provider 中随机选择了一个来调用,假设随机到了第7个 Provider。(负载均衡
  • 结果调用第7个 Provider 失败了。
  • 根据配置的Failover集群容错模式,重试其他服务器。(集群容错
  • 重试了第13个 Provider,调用成功。

服务路由:规则定义了哪些消费者可以调用哪些服务者。Dubbo包含三种路由方式:条件路由,脚本路由,标签路由。白话讲就是客户端的请求经过路由后就知道调哪些服务了。

负载均衡:4种:

  • RandomLoadBalance:随机负载均衡 -- 随机选一个,Dubbo默认的(通过权重随机选择)。
  • RoundRobinLoadBalance:轮询负载均衡 -- 轮询选择一个。
  • 一次调用所有的Provider,也有权重的概念,缺点:存在慢的 Provider 会出现请求堆积的问题。
  • LeastActiveLoadBalance:最少活跃调用数 -- 活跃数相同的随机。
  • ConsistentHashLoadBalance:一致性哈希负 -- 相同参数的请求总是落在同一台机器上。

集群容错:

关键者:cluster

方法:

Failover Cluster:失败自动切换,当消费方调用服务方失败后会自动切换到另一个。

Failfast Cluster:快速失败,当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。它适合于不支持幂等的一些调用。

Failsafe Cluster:失败安全,当服务消费方调用服务提供者失败后,仅仅日志记录一下,适用于写入审计日志等操作。

Failback Cluster:失败自动恢复,当服务消费端用服务出现异常后,记录下这个请求,返回消费者一个空结果,后期通过定时任务对失败进行重调,适用于最大努力通知的场景。

Forking Cluster:并行调用,当消费方调用一个接口方法后,Dubbo Client会通过线程池并行调用多个服务提供者的服务,只要一个成功即返回。适合用在对实时性要求比较高读操作。

Broadcast Cluster:广播调用,这个 cluster 会在运行时把所有 invoker 逐个调用,然后在最后判断如果有一个调用抛错的话,就抛出异常。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。