为什么要用sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
核心概念
资源
要保护的内容,可以是一个方法或者是一段代码
规则
流量控制、熔断降级等等。
sentinel控制台下载步骤
1 打开sentinel下载链接
2 下载jar包
3 本地启动jar包
4 启动命令
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
java -Dserver.port=8748 -Dcsp.sentinel.dashboard.server=localhost:8748 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.2.jar
8080冲突则 换成其他任意端口即可 ,我采用的是 8748端口
5 访问本地sentinel dashboard
6 界面图
账号密码默认都是 sentinel ,输入后登录。
7 登录后界面如图所示
SpringCloud模块操作步骤
1 pom引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2. application.yml配置文件
新增配置内容如下
spring:
cloud:
sentinel:
transport:
port: 18763
dashboard: localhost:8748
#开启openfeign支持
feign:
sentinel:
enabled: true
spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
18763 端口如图所示
实时监控模块
新增流控规则
流控规则
流控效果图
快速访问设置流控规则的接口发现受限
Sentinel 控制台文档
更多详情请查看官方文档,链接在下方。
@SentinelResource
Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandler 和 fallback 函数来进行限流之后的处理。示例:
@Service
public class OrderService {
@SentinelResource
public String randomStr() {
return "sadasdasd";
}
public String randomStr2() {
return "sadasdasd2";
}
}
//contoller
@GetMapping("/helloStr")
public CommonResult helloStr() {
return CommonResult.success(orderService.randomStr());
}
@GetMapping("/helloStr2")
public CommonResult helloStr2() {
return CommonResult.success(orderService.randomStr2());
}
在控制台可以看到可以对randomStr方法进行相应的流控策略。
将资源randomStr进行流控
@SentinelResource中blockHandler
定义blockHandler
@Service
public class OrderService {
@SentinelResource(blockHandler = "randomStrBlock")
public String randomStr() {
return "resource";
}
public String randomStrBlock(BlockException ex) {
return "Backup str ";
}
}
当资源被限流时会调用 randomStrBlock 方法
熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。
一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。
例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。
然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
熔断策略
Sentinel 提供以下几种熔断策略:
慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。