目录
熔断的作用
Dubbo引用熔断(服务降级)的目的是为了防止provider无报错情况下长时间的响应 ,影响了其他服务进度,从而导致降低了consumer消费性能
解决provider长时间未响应思路
遇到长时间未响应及频繁超时等情况时,将consumer调用provider的请求,直接短路掉,不实际调用,而是直接返回一个mock的值。等provider服务恢复稳定之后,再重新调用
1、一定是先降级优先级地的接口,两权相害取其轻
2、如果服务链路整体没有性能特别差的点,比如就是外部流量突然激增,那么就从外到内开始降级。
3、如果某个服务能检测到自身负载上升,那么可以从这个服务自身做降级。
Dubbo服务降级使用
注意:在执行Mock服务实现类 mock() 方法前,会先发起远程调用,当远程服务调用失败时,才会降级执行mock功能。
1.mock机制
2.服务消费者mock属性的使用
@DubboReference注解或者dubbo:reference标签的mock属性
import org.apache.dubbo.config.annotation.DubboReference;
@Controller
public class UserController {
@DubboReference(retries = 1,mock = "true")
UserService userService;
}
3.失败调用自定义的ServiceMock对应方法
3.1在interface中自定义一个mock下的实现类尾部加Mock即可
3.2实现mock属性下实现类接口
四种mock调用策略
配置方式为 mock=“fail:策略” 或者 mock=“策略"
1.fail 策略
1.1 mock = "true"
指定 mock 策略为布尔类型,且为 true,当调用远程服务失败后, 就会执行调用其他provider
@DubboReference(retries = 1,mock = "true")
1.2 mock = "具体的mock实现类"
指定 mock 策略为具体的 mock 实现类, 当调用远程服务失败时, 就会执行 mock 实现类的 sayHello 方法(调用其他provider).
@DubboReference(mock = "com.cxl.service.UserService")
1.3 mock = "抛出自定义异常"
指定 mock 策略为抛出自定义异常, 当远程服务调用失败后, 会给服务消费者抛出自定义异常.
@DubboReference(retries = 1,mock = "throw com.cxl.excep.CustomExcep")
1.4 mock="返回 mock 数据"
指定 mock 属性值为返回 mock 数据,当远程服务调用失败后,就会给服务消费者返回 null,(mock数据可以不写,默认返回null)。
@DubboReference(retries = 1,mock = "return null")
2.fail:策略
2.1 mock = "force:true"
指定 mock 策略为布尔类型,且为 true,当调用远程服务失败后, 就会执行调用其他provider
@DubboReference(retries = 1,mock = "force:true")
2.2 mock = "force:执行的Mock实现类"
指定 mock 策略为具体的 mock 实现类, 当调用远程服务失败时, 就会执行 mock 实现类的 sayHello 方法(调用其他provider).
@DubboReference(mock = "force:com.cxl.service.UserService")
2.3 mock = "force:抛出自定义异常"
指定 mock 策略为抛出自定义异常, 当远程服务调用失败后, 会给服务消费者抛出自定义异常.
@DubboReference(retries = 1,mock = "force:throw com.cxl.excep.CustomExcep")
2.4 mock="force:返回 mock 数据"
指定 mock 属性值为返回 mock 数据,当远程服务调用失败后,就会给服务消费者返回 null,(mock数据可以不写,默认返回null)。
@DubboReference(retries = 1,mock = "force:return null")
总结
Dubbo 的 mock 的策略总共分为两大类
一是当服务调用失败时,去进行 mock 调用;
二是绕过服务调用,直接进行 mock 调用。
具体的 mock 调用策略又分别 4 种
1、返回 mock 数据
2、抛出自定义异常
3、执行默认的 Mock 实现类
4、执行指定的 Mock 实现类
dubbo系列文章
Thanks!