初识Sentinel
Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:. https:/ /sentinelguard.io/ zh-cn/index.html
Sentinel 的使用可以分为两个部分:
- 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
搭建完控制台
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监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint (http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:
Restful风格的API请求路径- -般都相同,这会导致簇点资源名称重复。因此我们要修改配置,把请求方式+请求路径作为簇点资源名称:
请求限流
在簇点链路后面点击流控按钮,即可对其做限流配置:
测试
线程隔离
限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。
比如,查询购物车的时候需要查询商品,为了避免因商品服务出现故障导致购物车服务级联失败,我们可以把购物车业务中查询商品的部分隔离起来,限制可用的线程资源:
在sentinel控制台中,会出现Feign接口的簇点资源,点击后面的流控按钮,即可配置线程隔离:
Fallback
1).将FeignClient作为Sentinel的簇点资源:
2).FeignClient的Fallback有 两种配置方式:
- 方式一: FallbackClass, 无法对远程调用的异常做处理
- 方式二: FallbackFactory, 可以对远程调用的异常做处理,,通常都会选择这种
步骤一;自定义类,实现FallbackFactory,编写对某个FeignClient的fallback逻辑:
步骤二:将刚刚定义的UserClientFallbackFactory注册为一个Bean:
步骤三:在UserClient接口中使用UserClientFallbackFactory:
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监控
服务熔断
熔断是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
熔断降级是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。