初识Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:. https:/ /sentinelguard.io/ zh-cn/index.html

Sentinel 的使用可以分为两个部分:

  • 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

【Sentinel】-实操解决雪崩问题_链路

搭建完控制台

【Sentinel】-实操解决雪崩问题_链路_02

1)然后开始在微服务里引入依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2)配置控制台

spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8090

【Sentinel】-实操解决雪崩问题_断路器_03

簇点链路,就是单机调用链路。是一次请求进入服务后经过的每一-个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint (http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:

【Sentinel】-实操解决雪崩问题_链路_04

Restful风格的API请求路径- -般都相同,这会导致簇点资源名称重复。因此我们要修改配置,把请求方式+请求路径作为簇点资源名称:

【Sentinel】-实操解决雪崩问题_限流_05

请求限流

在簇点链路后面点击流控按钮,即可对其做限流配置:

【Sentinel】-实操解决雪崩问题_断路器_06

【Sentinel】-实操解决雪崩问题_限流_07

测试

【Sentinel】-实操解决雪崩问题_限流_08

【Sentinel】-实操解决雪崩问题_链路_09

【Sentinel】-实操解决雪崩问题_限流_10

线程隔离

限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。

比如,查询购物车的时候需要查询商品,为了避免因商品服务出现故障导致购物车服务级联失败,我们可以把购物车业务中查询商品的部分隔离起来,限制可用的线程资源:

【Sentinel】-实操解决雪崩问题_限流_11

在sentinel控制台中,会出现Feign接口的簇点资源,点击后面的流控按钮,即可配置线程隔离:

【Sentinel】-实操解决雪崩问题_断路器_12

【Sentinel】-实操解决雪崩问题_限流_13

Fallback

1).将FeignClient作为Sentinel的簇点资源:

【Sentinel】-实操解决雪崩问题_链路_14

2).FeignClient的Fallback有 两种配置方式:

  • 方式一: FallbackClass, 无法对远程调用的异常做处理
  • 方式二: FallbackFactory, 可以对远程调用的异常做处理,,通常都会选择这种

步骤一;自定义类,实现FallbackFactory,编写对某个FeignClient的fallback逻辑:

【Sentinel】-实操解决雪崩问题_限流_15

步骤二:将刚刚定义的UserClientFallbackFactory注册为一个Bean:

【Sentinel】-实操解决雪崩问题_链路_16

步骤三:在UserClient接口中使用UserClientFallbackFactory:

【Sentinel】-实操解决雪崩问题_链路_17

【Sentinel】-实操解决雪崩问题_断路器_18

public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("查询商品失败!",cause);
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("扣减商品库存失败!",cause);
                throw new RuntimeException(cause);
            }
        };
    }
}

【Sentinel】-实操解决雪崩问题_断路器_19

【Sentinel】-实操解决雪崩问题_链路_20

开启sentinel监控

【Sentinel】-实操解决雪崩问题_断路器_21

服务熔断

熔断是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

【Sentinel】-实操解决雪崩问题_链路_22

熔断降级是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

【Sentinel】-实操解决雪崩问题_链路_23

【Sentinel】-实操解决雪崩问题_链路_24