Sentinel全面实战指南
Sentinel全面实战指南
一、请求限流
1️⃣在簇点链路后面点击流控按钮,即可对其做限流配置:
2️⃣在弹出的菜单中这样填写:
把查询购物车列表这个簇点资源的流量限制在了每秒6个,也就是最大QPS为6
3️⃣最终监控结果如下:
可以看出GET:/carts
这个接口的通过QPS稳定在6附近,而拒绝的QPS在4附近,符合我们的预期。
二、线程隔离
- 限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。
- 一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。
比如,查询购物车的时候需要查询商品,为了避免因商品服务出现故障导致购物车服务级联失败,我们可以把购物车业务中查询商品的部分隔离起来,限制可用的线程资源:
这样,即便商品服务出现故障,最多导致查询购物车业务故障,并且可用的线程资源也被限定在一定范围,不会导致整个购物车服务崩溃。
对查询商品的FeignClient接口做线程隔离:
1️⃣OpenFeign整合Sentinel
- 配置yml
feign:sentinel:enabled: true # 开启feign对sentinel的支持server:port: 8082tomcat:threads:max: 50 # 允许的最大线程数accept-count: 50 # 最大排队等待数量max-connections: 100 # 允许的最大连接
然后重启cart-service服务,可以看到查询商品的FeignClient自动变成了一个簇点资源:
2️⃣配置线程隔离
- 点击查询商品的FeignClient对应的簇点资源后面的流控按钮
- 在弹出的表单中填写下面内容:
并发线程数限制:这个查询功能最多使用5个线程,而不是5QPS
如果查询商品的接口每秒处理2个请求,则5个线程的实际QPS在10左右,而超出的请求自然会被拒绝。
三、服务熔断
- 通过线程隔离对查询购物车业务进行隔离,但由于查询商品功能耗时高且线程数有限,导致接口吞吐量低,QPS仅为10左右。
- 为了解决超QPS上限请求导致查询失败的问题,应设置降级处理逻辑,保证购物车展示。
- 同时,针对商品查询延迟高的问题,应采取熔断机制,避免影响购物车服务和用户体验。
1️⃣编写降级逻辑
触发限流或熔断后的请求不一定要直接报错,也可以返回一些默认数据或者友好提示,用户体验会更好。
给FeignClient编写失败后的降级逻辑有两种方式:
- 方式一:FallbackClass(简单降级),无法对远程调用的异常做处理
使用@FeignClient
的fallback
属性指定降级类,例如:
@FeignClient(name = "product-service", fallback = ProductClientFallback.class)
public interface ProductClient {@GetMapping("/product/{id}")Product getProduct(@PathVariable("id") Long id);
}
@Component
public class ProductClientFallback implements ProductClient {@Overridepublic Product getProduct(Long id) {// 返回默认商品信息return new Product(id, "默认商品", 0.0);}
}
- 方式二:FallbackFactory(推荐方式),可以对远程调用的异常做处理,我们一般选择这种方式。
@FeignClient(name = "product-service", fallbackFactory = ProductClientFallbackFactory.class)
public interface ProductClient {@GetMapping("/product/{id}")Product getProduct(@PathVariable("id") Long id);
}
@Component
public class ProductClientFallbackFactory implements FallbackFactory<ProductClient> {@Overridepublic ProductClient create(Throwable cause) {return id -> {log.error("商品服务调用失败,原因: {}", cause.getMessage());return new Product(id, "默认商品", 0.0);};}
}
2️⃣ 服务熔断机制
- 商品查询接口RT过高导致购物车服务RT变长,影响用户体验并消耗更多资源。
- 建议对不健康的商品服务接口进行熔断,直接走降级逻辑,避免影响当前服务。
- Sentinel断路器可以统计慢请求和异常请求比例,超出阈值时熔断接口,拦截访问请求并降级处理;接口恢复正常后,再放行请求。
- 断路器通过状态机控制工作状态切换。
状态机包括三个状态: - closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
- open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态持续一段时间后会进入half-open状态
- half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
- 请求成功:则切换到closed状态
- 请求失败:则切换到open状态
含义:
- RT超过200毫秒的请求调用就是慢调用
- 统计最近1000ms内的最少5次请求,如果慢调用比例不低于0.5,则触发熔断
- 熔断持续时长20s