SpringCloud-Sentinel服务熔断降级

110 阅读2分钟

一、什么是服务雪崩?

因为一个基础服务不可用,导致它的下游服务因为一直请求而将连接数打满也不可用。这种连锁反应导致整个微服务系统都不可用,这就是服务雪崩。简单来说就是,一个服务失败,导致整条链路的服务都失败的场景。

1691417392886.jpg

那应该如何预防以及解决服务雪崩的问题呢?

  • 限流措施可以预防发生服务雪崩,但是不能解决服务雪崩。
  • 服务的熔断降级措施可以解决服务雪崩的问题。

二、服务熔断降级

服务的熔断降级措施可以解决服务雪崩的问题。

2.1、服务降级

服务降级是服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增变得不可用,确保服务不会崩溃。

20230807-131816.jpg

比如:服务D调用服务C的update()方法,此时update()是通过的,没有问题。但是当服务D调用服务C的save()方法,此时save()方法是调不通的,所以要对服务C的方法做降级

2.2、服务降级代码实现

下面展示了在代码中实现降级的逻辑。

  1. 在@FeignClient注解中添加fallback属性,指定异常处理类。该类必须实现被@FeignClient注解修饰的接口,实现接口的降级逻辑。
@FeignClient(value="leadnews-article", fallback=ArticleClientFallback.class)
public interface IAirticleClient{

    @PostMapping("/api/v1/article/save")
    public ResponseResult saveArticle(@RequestBody ArticleDto dto);
}

/**
 *
 *
 */
@Component
public class ArticleClientFallback implements IAirticleClient{
    @Override
    public ResponseResult saveArticle(@RequestBody ArticleDto dto) {
        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR,"获取数据失败");
    }
}

如果大量都触发了服务降级,则可能发生服务熔断。

2.3、Hystrix服务熔断

Hystrix熔断机制,用于监控微服务调用情况,默认是关闭的。如果需要开启,要在引导类上添加注解@EnableCircuitBreaker。如果监测到10s内请求的失败率超过50%,就触发熔断机制。之后每隔5秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求。发生熔断后,整个微服务不可用。

1691496130325.jpg

  1. 断路器默认是关闭closed状态的。
  2. 请求失败率达到失败阈值后,断路器从closed状态转到open状态。
  3. 以后过来的所有请求都会被拒绝掉,快速失败,整个微服务都不可用。
  4. 熔断时间结束后,断路器油open状态转到half-open(半开)状态。
  5. 此时尝试放行一次请求,如果请求成功了,就关闭断路器。如果请求失败了,打开open断路器,并且每隔5s重试一次。