dubbo应用场景示例一

公司使用Dubbo做为服务治理工具搭建了微服务架构。幸运的是,Dubbo官方文档对于开发过程遇到的一些通用问题提供了解决办法。我们一起来看一下。

1、启动时检查

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true" 

可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依 赖,必须有一方先启动。

另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check否则服务临时不可用时,会抛出异常,拿到 null 引用,如果check="false" ,总是会返回引 用,当服务恢复时,能自动连上。

示例

通过 spring 配置文件

关闭某个服务的启动时检查(没有提供者时报错)

<dubbo:reference interface="com.foo.BarService"check="false" />

关闭所有服务的启动时检查(没有提供者时报错)

<dubbo:consumer check="false" />

关闭注册中心启动时检查 (注册订阅失败时报错)

<dubbo:registry check="false" />

通过 dubbo.properties

         dubbo.reference.com.foo.BarService.check=false 

dubbo.reference.check=false 

dubbo.consumer.check=false 

dubbo.registry.check=false

         通过 -D 参数

                   java-Ddubbo.reference.com.foo.BarService.check=false 

java -Ddubbo.reference.check=false 

java -Ddubbo.consumer.check=false 

java -Ddubbo.registry.check=false

配置的含义

dubbo.reference.check=false ,强制改变所有reference  check 值,就算配置中有声明,也会被覆盖。

dubbo.consumer.check=false ,是设置 check 的缺省值,如果配置中有显式的声明, 如: ,不会受影响。

dubbo.registry.check=false ,前面两个都是指订阅成功,但提供者列表是否为空是否报错, 如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。

2、集群容错

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

dubbo应用场景示例一



各节点关系:

  1. 这里的 Invoker  Provider 的一个可调用 Service 的抽象, Invoker 封装了Provider 地址及 Service 接口信息

  2. Directory 代表多个 Invoker ,可以把它看成 List,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更

  3. Cluster  Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个

  4. Router 负责从多个 Invoker中按路由规则选出子集,比如读写分离,应用隔离等

  5. e)        LoadBalance 负责从多个 Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选

集群容错模式

可以自行扩展集群容错策略,目前已知有FailoverClusterFailfastClusterFailsafeClusterFailbackClusterForkingClusterAvailableCluster等模式

FailoverCluster

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

重试次数配置如下:

<dubbo:service retries="2" />

<dubbo:reference retries="2" />

<dubbo:reference> 

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

</dubbo:reference>

FailfastCluster

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

FailsafeCluster

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

FailbackCluster

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

ForkingCluster

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

BroadcastCluster

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

集群模式配置

按照以下示例在服务提供方和消费方配置集群模式

<dubbo:servicecluster="failsafe" />

<dubbo:referencecluster="failsafe" />

3、负载均衡

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为random 随机调用。可以自行扩展负载均衡策略,目前已知的负载均衡策略有RandomLoadBalanceRoundRobinLoadBalanceLeastActiveLoadBalanceConsistentHash LoadBalance等。

负载均衡策略

Random LoadBalance

  1. 随机,按权重设置随机概率。

  2. b)       在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

  1. 轮循,按公约后的权重设置轮循比率。

  2. 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

  1. 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

  2. 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance

  1. 一致性 Hash,相同参数的请求总是发到同一提供者。

  2. 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

  3. 缺省只对第一个参数 Hash,如果要修改,请配置<dubbo:parameter key="hash.arguments" value="0,1" />

  4. 缺省用 160 份虚拟节点,如果要修改,请配置<dubbo:parameter key="hash.nodes"  value="320" />

配置

         服务端服务级别

                  <dubbo:serviceinterface="..." loadbalance="roundrobin" />

         客户端服务级别

                  <dubbo:referenceinterface="..." loadbalance="roundrobin" />

         服务端方法级别

         <dubbo:serviceinterface="..."> 

<dubbo:method name="..."loadbalance="roundrobin"/> 

</dubbo:service>

客户端方法级别

<dubbo:referenceinterface="..."> 

<dubbo:method name="..."loadbalance="roundrobin"/> 

</dubbo:reference>

关注微信公众号和今日头条,精彩文章持续更新中。。。。。

dubbo应用场景示例一

dubbo应用场景示例一

dubbo应用场景示例一