SpingCloud 2020微服务教程【29】服务熔断

视频链接:2020最新版SpringCloud框架开发教程-周阳
文章源码:https://github.com/geyiwei-suzhou/cloud2020/

服务熔断类似于保险丝:当访问接口降级达到规定次数后,直接拒绝访问,调用降级方法,返回友好提示

服务降级 --> 服务熔断 --> 恢复服务

How it works

熔断类型:

  • 熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟时间(默认为5秒)则进入熔断半开状态
  • 熔断关闭:熔断关闭不会对服务进行熔断
  • 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

断路器的三个重要参数:快照时间窗、请求总数阈值、错误百分比阈值

  • 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的5秒
  • 请求总数阈值:在快照时间窗口内,必须满足请求总数阈值才有资格熔断。默认为20,意味着在5秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超过或其他原因失败,断路器都不会打开
  • 错误百分比阈值:当请求总数在快照时间窗内超过了阈值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过了50%的错误百分比,在默认设定50%阈值情况下,这时候就会将熔断器打开
    服务熔断

cloud-provider-hystrix-payment8001模块

在com.antherd.springcloud.service.PaymentService中添加paymentCircuitBreaker和paymentCircuitBreakerFallback方法

// 服务熔断,整个配置含义:开启熔断器,在10秒内请求超过10次并且其中超过60%都是降级处理的,则触发熔断
// 所有参数,参考HystrixCommandProperties类
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback", commandProperties = {
    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 是否开启断路器
    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 请求总数阈值
    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 快照时间窗
    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), // 错误百分比阈值
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
  if (id < 0) {
    throw new RuntimeException("***** id 不能为负数 *****");
  }
  String serialNumber = IdUtil.simpleUUID();
  return Thread.currentThread().getName() + " 调用成功,流水号:" + serialNumber;
}

public String paymentCircuitBreakerFallback(@PathVariable("id") Integer id) {
  return "id 不能为负数,请稍后再试,o(╥﹏╥)o~ id:" + id;
}

在com.antherd.springcloud.controller.PaymentController中添加paymentCircuitBreakerTimeout方法

// 服务熔断
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreakerTimeout(@PathVariable("id") Integer id) {
  String result = paymentService.paymentCircuitBreaker(id);
  log.info("*****result***** : " + result);
  return result;
}

启动:cloud-eureka-server7001,cloud-provider-hystrix-payment8001两个模块

访问:http://localhost:8001/payment/circuit/1 发现可以正常访问,http://localhost:8001/payment/circuit/-1 会发生服务降级。

如果我们这时短时间内多次(10s内超过6次)访问http://localhost:8001/payment/circuit/-1 接口,然后访问http://localhost:8001/payment/circuit/1 ,发现这个正常参数也不能访问服务了,说明这时发生了熔断,直接拒绝访问。等待一会后(默认为5秒),再访问http://localhost:8001/payment/circuit/1 发现熔断关闭,可以服务正常访问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值