手记

sentinel笔记

一、整合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实现的


超时,限流,仓壁模式,断路器













0人推荐
随时随地看视频
慕课网APP