为什么需要Sentinel?
想象下在大型互联网项目同一时刻面对成千上万的QPS+HPS的冲击下,如双十一京东是怎么处理相应订单的问题?如出现访问超时 下单不成功 响应延迟这些应该都有体会过吧 但是随着技术的更新对于用户操作来说是没有任何感知延迟和系统蹦跶的情况,这一些列操作在技术架构后台是经过了很多服务共同来完成这个用户请求的 为了应对这些问题需要对访问进行做限流 降级 熔断的处理 而Alibab提供了基于SpringCloud实现的一套微服务的解决方案 中Sentinel就是处理这些问题而存在的。
什么是Sentinel?
以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel能做什么?
如图所示:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
Sentinel之体验-秒杀核心应对
下载Sentinel安装jar包
https://github.com/alibaba/Sentinel/releases 官方链接下载
选择对应的版本下载 尽量和maven依赖的jar包版本一致
启动Sentinel
在下载的jar包目录进行启动 如:
启动控制台无任何报错 访问网页
用户名和密码都是sentinel 后台也可以进行修改
第一次访问出现空白页面 属于正常 他是懒加载的方式 需要有一次服务的访问后就可以刷新出对应的后台页面效果
启动秒服务模块
配置文件配置
Sentinel的流控规则
参数说明
增加流控后 会在访问的时候按照规则中的次数来做控制 访问超出规则则会
Sentinel-自定义流控响应
由于官方返回的限制信息 我们是可以自定义的
导入对应的jar包
查看后台
自定义的返回
添加自定义的配置类
@Configuration
public class SeckillSentinelConfig {
public SeckillSentinelConfig() {
WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
@Override
public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {
R error = R.error(BizCodeEnum.TO_MANY_REQUEST.getCode(), BizCodeEnum.TO_MANY_REQUEST.getMsg());
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.getWriter().write(JSON.toJSONString(error));
}
});
}
}
如有其它的微服务也需要配置
1:导包
2:配置文件
链路限流
直接链路
关联链路
快速失败
方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException
。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时 warm up
预热
Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP
)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮
匀速排队
严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
Sentinel-熔断降级
除了流量控制以外,链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
熔断策略
- 慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 - 异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。 - 异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
微服务远程调用使用feign Sentinel配合feign使用
调用方配置
自定义受保护的资源
基于代码的形式
基于注解
网关流控
与Gateway结合
网关返回数据