一、整合sentinel
(1)下载sentinel控制台
https://github.com/alibaba/Sentinel/releases
(2)引入包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency>
(3)启动下载的sentinel包
使用命令 java -jar sentinel包
可以使用 localhost:8080 访问 sentinel控制台界面
(4)配置sentinel控制台地址
spring.colud.sentinel.transport.dashboard = localhost:8080
二、sentinel规则
QPS: 每秒处理的请求数量
QPS(TPS)= 并发数/平均响应时间
(1)流控规则
直接:达到阈值,就限流自己
关联:当关联的资源达到阈值,就限流自己
链路:只记录指定链路上的流量(a,b同时调用c,c设置入口为a,当a达到阈值,a调c就限流,b不影响)
(2)流控效果
快速失败:直接失败,抛异常
源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
warm up:
根据codeFactor(默认3)的之,从阈值/codeFactor,经过预热时长,最后达到设置的阈值
源码:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
排队等待:
匀速排队,让请求均匀的速度通过,阈值类型必须设置为Qps,否则无效
源码:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
(3)降级规则
慢调用比例:当资源的响应时间超过最大RT(以ms为单位,最大RT即最大响应时间)之后,资源进入准降级状态。如果接下来1s内持续进入5个请求(最小请求数),它们的RT都持续超过这个阈值,那么在接下来的熔断时长之内,就会对这个方法进行服务降级。其中的“比例阈值”我设置发现无效,下次编辑会重置成1。
注意:Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置。
异常比例:当资源的每秒请求数大于等于最小请求数,并且异常总数占通过量的比例超过比例阈值时,资源进入降级状态。
异常数:当资源近1分钟的异常数目超过阈值(异常数)之后会进行服务降级。注意由于统计时间窗口是分钟级别的,若熔断时长小于60s,则结束熔断状态后仍可能再次进入熔断状态。
(4)热点规则
热点参数流控规则是一种更细粒度的流控规则,它允许将规则具体到参数上。
还可以为热点规则增加参数例外项(热点规则编辑页面才有此选项)。参数值的qps达到阈值才限流
源码:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck
(5)系统规则
load:当系统load1(1分钟的load)超过阈值,且并发线程数超过系统容量是触发,建议设置为cpu核心数 * 2.5
(仅对linux/unix-like 机器生效)
系统容量 = maxQps * minRt
maxQps:秒级统计出来的最大Qps
minRt:秒级统计出来的最小响应时间
RT:所有入口流量的平均RT达到阈值触发
线程数:所有入口流量的并发线程数达到阈值触发
入口Qps:所有入口流量Qps达到阈值触发
源码:com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem
三、代码配置sentinel
看收藏
四、Sentinel与控制台通信原理
(1)微服务集成Sentinel需要添加spring-cloud-starter-alibaba-sentinel依赖,该依赖中包含了sentinel-transport-simple-http模块。集成了该模块后,微服务就会通过配置文件中所配置的连接地址,将自身注册到Sentinel控制台上,并通过心跳机制告知存活状态,由此可知Sentinel是实现了一套服务发现机制的。
(2)Sentinel控制台的机器列表中就可以查看到Sentinel客户端(即微服务)的通信地址及端口号。
(注意:此端口非微服务的端口而是sentinel通信端口号)
源码:
注册/心跳机制:com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender
通信API:com.alibaba.csp.sentinel.command.CommandHandler
的实现类
五、控制台相关配置
sentinel启动时修改配置命令:java -jar -D配置项 sentinel包
六、sentinel Api
(1)
SphU:定义资源,并且可以监控资源,保护资源
Tracer:异常统计
ContextUtil:实现调用来源,标记来源
(2)SentinelResource注解使用(无法使用来源)
看收藏
源码:com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect
com.alibaba.csp.sentinel.annotation.aspectj.AbstractSentinelAspectSupport
七、restTemplate整合sentinel
(1)在注入restTemplate类加上注解@SentinelRestTemplate(处理异常返回与SentinelResource注解相似)
(2)配置关闭注解@SentinelRestTemplate
resttemplate.sentinel.enabled = false
(3)源码:org.springframework.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor
八、fegin整合sentinel
(1)配置加上
feign.sentinel.enabled= true
(2)处理异常/返回数据需要在注解@FeignClient里面的fallback = a.class,fallbackFactory = b.class来配置
a.class需要实现fallback注解所在的类
b.class需要实现fallbackFactory(有异常信息返回)实现FallbackFactory<fallbackFactory注解所在的类>
源码:com.alibaba.cloud.sentinel.feign.SentinelFeign
九、规则持久化
(1)拉模式:看收藏
(2)推模式:看收藏
(3)AHAS(阿里云高可用):看文档
十、其他优化
(1)错误信息的优化
新建一个类实现UrlBlockHandler
注意该类记得加上注解Component
springmvc提供的工具:
(2)区分来源
新建一个类,实现RequestOriginParser
对应的parseOrigin方法返回值就是对应的来源
可以通过request获取参数来做逻辑判断最后返回
注意该类记得加上注解Component
(3)支持restfulUrl
新建一个类,实现UrlCleaner
参数是当前访问的路径地址,处理后返回,在sentinel控制台显示的就是返回的路径
注意该类记得加上注解Component
(4)上面3种都是由拦截器CommonFilter实现的
超时,限流,仓壁模式,断路器