Dubbo(十四) dubbo的服务降级与集群容错

一、dubbo的服务降级

dubbo的服务降级包含两种常见,屏蔽服务和服务容错。在dubbo-admin服务信息消费者界面可以看到有屏蔽和容错功能。

Dubbo(十四) dubbo的服务降级与集群容错

屏蔽功能是将该服务直接进行屏蔽,消费者将不再调用服务提供者工程,接口直接返回null 空对象。比如在一些服务器压力比较大的情况下,可以 选择屏蔽一些非关键服务接口比如广告服务等,保证服务提供者工程减少请求压力。

容错功能是当比如接口处理时不稳定,有时候正常有时候超时时,没有容错时,会有时候正常,有时候超时报错。当开启荣作后,当出现超时时,消费者端将会以null作为结果返回,不在出现远程接口超时报错现象。

在对接口进行屏蔽后中system.out.println 打印的都为null。当我们在对接口进行容错后,在远程接口中对接口内部做随机睡眠2秒时,通过打印可以看到有时候打印正常的返回数据,放出现超时时,则打印null,而不是出现容错前的报错信息。

消费者工程中接口实现类代码如下,我们对容错调用返回进行打印:

Dubbo(十四) dubbo的服务降级与集群容错

二、dubbo集群容错 cluster

集群容错为解决在服务提供者工程集群环境中某节点出现故障时,dubbo消费者工程仍可以正常调用机制。dubbo的容错机制主要有一下6类:

  1. 失败自动切换重试(Failover Cluster)默认
  2. 快速失败,只发起一次调用(Failfast Cluster)
  3. 失败安全,忽略异常(Failsafe Cluster)
  4. 失败自动恢复(Failback Cluster)
  5. 并行调用多个服务器(Forking Cluster)
  6. 广播调用所有提供者(Broadcast Cluster)

2.1 失败自动切换重试(Failover Cluster)默认的容错方式

失败自动切换重试,是当提供者服务工程某一个节点处理请求时出现超时时,dubbo将请求切换到另一个节点上,当ok时则返回,如果第二次仍超时则继续换节点进行重试。重试次数使用retries 进行配置。

测试方式:启动三个不同端口的服务提供者,设置其中两个业务都做超时模拟,并设置超时的服务权重大一些。然后发起请求后可以看到当请求落到超时的服务节点时,然后会切换到另一台节点,可以通过实现端打印查看效果。多个控制台都可以看到打印说明进行了节点切换,并最终通过正常节点进行返回。

Dubbo(十四) dubbo的服务降级与集群容错

Dubbo(十四) dubbo的服务降级与集群容错

2.2 快速失败,只发起一次调用

快速失败,只发起一次调用,失败了就返回失败,不做重试操作。使用cluster = "failfast"进行配置。主要用于非幂等性操作,比如新增等。(幂等性操作表示多次操作结果都不会变的操作,比如查询修改删除;非幂等性为多次操作会出现与单次不一致的操作,比如新增操作)。

测试方式:启动两个不同端口的服务提供者工程,实现逻辑都做超时模拟。然后使用配置消费者工程中依赖接口中cluster="failfast",使用消费者工进行请求一次提供者工程,可以看到出现超时失败信息,并且另一个节点没有打印,说明没有做切换处理。如下分别为消费者工程和提供者工程代码

Dubbo(十四) dubbo的服务降级与集群容错

Dubbo(十四) dubbo的服务降级与集群容错

2.3 失败安全,忽略异常(Failsafe Cluster)

使用 cluster="failsafe"指定失败安全模式,失败安全模式下 服务端出现超时异常时,直接返回null 不进行出现报错处理。和服务降级中的服务容错效果类似。通常用些写入审计日志等处理。

测试方式:启动多个提供者,消费者端指定cluster="failsafe"。进行调用后当出现超时场景时,不会进行重试。直接返回null。

Dubbo(十四) dubbo的服务降级与集群容错

2.4 失败自动恢复(Failback Cluster)

失败自动回复,后台记录失败请求,定时重发。通常用于消息通知操作。使用cluster="failback"配置,重发的次数使用retries 配置(默认2),默认重试时间间隔为5秒一次,并轮询重试。

Dubbo(十四) dubbo的服务降级与集群容错

2.5 并行调用多个服务器(Forking Cluster)

并行调用多个服务器,只要一个成功即返回,通常用于实时性比较高的读操作,单浪费比较多的服务器资源。可以通过设置forks="2",来指定最大并行数。(当所有节点都没有正常返回时,则会出现在调用远程方式时出现NullPointerException(远程接口对象为null),可能我的版本低 Reference注解中没有forks配置)

Dubbo(十四) dubbo的服务降级与集群容错

2.6 广播调用所有提供者(Broadcast Cluster)

广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。等所有提供者都执行完成后将返回。并返回最后一个节点的执行返回值,返回值看似目前无用。

测试方式:启动两个生产者工程,并添加执行延时模拟,通过打印效果看,等其中一个节点执行完成后才会去执行下一个节点的该接口方法。当全部都执行完成后则返回最后一个执行的结果。需要注意消费端配置的超时时间要大于所有机器执行的时间之和否则会超时报错。

Dubbo(十四) dubbo的服务降级与集群容错

Dubbo(十四) dubbo的服务降级与集群容错