一、前言Sentinel提供一个轻量级的开源控制台它提供机器发现以及健康情况管理、监控单机和集群规则管理和推送的功能。本节将详细记录何如通过Sentinel控制台控制Sentinel客户端的各种行为。Sentinel控制台的功能主要包括流量控制、降级控制、热点配置、系统规则和授权规则等。二、安装控制台Sentinel控制台下载地址https://github.com/alibaba/Sentinel/releases本节我们下载sentinel-dashboard-1.8.0.jar版本下载好后使用java -jar sentinel-dashboard-1.8.0.jar命令启动即可默认的端口号为8080账号密码都是sentinel。更多可用的启动参数配置Dsentinel.dashboard.auth.usernamesentinel用于指定控制台的登录用户名为 sentinelDsentinel.dashboard.auth.password123456用于指定控制台的登录密码为 123456如果省略这两个参数默认用户和密码均为 sentinelDserver.servlet.session.timeout7200用于指定 Spring Boot 服务端 session 的过期时间如 7200 表示 7200 秒60m 表示 60 分钟默认为 30 分钟-Dcsp.sentinel.dashboard.serverconsoleIp:port指定控制台地址和端口。三、搭建客户端3.1 项目搭建新建一个Spring Boot项目artifactId为spring-cloud-alibaba-sentinel-dashboard-guide项目pom内容?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.2.RELEASE/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-sentinel-dashboard-guide/artifactIdversion0.0.1-SNAPSHOT/versionnameAlibaba-Sentinel-Dashboard-Guide/namedescriptionDemo project for Spring Boot/descriptionpropertiesjava.version1.8/java.versionspring-cloud-alibaba.version2.2.3.RELEASE/spring-cloud-alibaba.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scopeexclusionsexclusiongroupIdorg.junit.vintage/groupIdartifactIdjunit-vintage-engine/artifactId/exclusion/exclusions/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project引入了spring-cloud-starter-alibaba-sentinel和spring-boot-starter-web依赖。3.2 编写controller接着在com.wno704.alibaba目录下新建controller包然后在该包下新建TestControllerRestControllerpublicclassTestController{GetMapping(test1)publicStringtest1(){returntest1;}}3.3 配置application.ymlserver:port:8081spring:application:name:sentinel-dashboardcloud:sentinel:transport:dashboard:localhost:8080port:8719spring.cloud.sentinel.transport.dashboard指定了sentinel控制台的ip和端口地址spring.cloud.sentinel.transport.portsentinel客户端和控制台通信的端口默认为8719如果这个端口已经被占用那么sentinel会自动从8719开始依次1扫描直到找到未被占用的端口。3.4 测试启动项目使用http工具访问http://localhost:8081/test1然后登录sentinel控制台在簇点链路中可以看到刚刚那笔请求我们可以对它进行流控、降级、授权、热点等配置控制台是懒加载的如果没有任何请求那么控制台也不会有任何内容。四、流控规则在簇点链路列表中点击/test1后面的【流控】按钮资源名标识资源的唯一名称默认为请求路径也可以在客户端中使用SentinelResource配置针对来源Sentinel可以针对服务调用者进行限流填写微服务名称即spring.application.name默认为default不区分来源**阈值类型、单机阈值QPSQueries-per-second每秒钟的请求数量当调用该api的QPS达到阈值的时候进行限流线程数当调用该api的线程数达到阈值的时候进行限流。是否集群默认不集群流控模式直接当api调用达到限流条件的时直接限流关联当关联的资源请求达到阈值的时候限流自己链路只记录指定链路上的流量指定资源从入口资源进来的流量如果达到阈值则进行限流。流控效果快速失败直接失败Warm Up根据codeFactor冷加载因子默认值为3的值从阈值/codeFactor经过预热时长才达到设置的QPS阈值排队等待匀速排队让请求匀速通过阈值类型必须设置为QPS否则无效。4.1 QPS直接失败演示下QPS直接失败设置及效果。点击簇点链路列表中/test1请求后面的流控按钮上面设置的效果是1秒钟内请求/test1资源的次数达到2次以上的时候进行限流。点击新增按钮后列表会跳转到”流控规则”菜单下所以我们也可以在这里设置流控规则不过一般还是习惯直接在簇点链路列表中直接选中资源添加流控规则。新增后我们访问http://localhost:8081/test1看看效果当手速快点的时候1秒超过2次页面返回 Blocked by Sentinel (flow limiting)。4.2 线程数直接失败改造下TestControllerRestControllerpublicclassTestController{GetMapping(test1)publicStringtest1()throwsInterruptedException{TimeUnit.SECONDS.sleep(1);returntest1;}}让方法休眠1秒更容易出现效果。重启项目然后在sentinel控制台中添加如下流控规则多次访问http://localhost:8081/test1效果4.3 关联改造TestController添加一个新的api接口RestControllerpublicclassTestController{GetMapping(test1)publicStringtest1(){returntest1;}GetMapping(test2)publicStringtest2(){returntest2;}}重启项目浏览器中访问下这两个请求然后在sentinel控制台簇点链路列表中点击test1后的流控按钮上述流控规则表示当1秒内访问/test2的次数大于2的时候限流/test1。我们使用postman来密集访问/test2然后我们手动浏览器请求/test1看看效果。postman设置如下规则然后点击Run按钮我们回到HTTP工具访问http://localhost:8081/test14.4 链路在演示链路限流之前我们先改造改造sentinel客户端代码。在项目的com.wno704.alibaba目录下新建service包然后在该包下新建HelloServiceServicepublicclassHelloService{SentinelResource(hello)publicStringhello(){returnhello;}}SentinelResource(“hello”)将该方法标识为一个sentinel资源名称为hello。接着在TestController中使用该资源RestControllerpublicclassTestController{AutowiredprivateHelloServicehelloService;GetMapping(test1)publicStringtest1(){returntest1 helloService.hello();}GetMapping(test2)publicStringtest2(){returntest2 helloService.hello();}}在配置文件中新增收敛设置为无效spring:cloud:sentinel:web-context-unify:false注意:在spring-cloud-alibaba v2.1.1.RELEASE及前sentinel1.7.0及后关闭URL PATH聚合需要通过该方式spring-cloud-alibaba v2.1.1.RELEASE后可以通过配置关闭spring.cloud.sentinel.web-context-unifyfalse具体代码如下ConfigurationpublicclassFilterContextConfig{BeanpublicFilterRegistrationBeansentinelFilterRegistration(){FilterRegistrationBeanregistrationnewFilterRegistrationBean();registration.setFilter(newCommonFilter());registration.addUrlPatterns(/*);// 入口资源关闭聚合registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,false);registration.setName(sentinelFilter);registration.setOrder(1);returnregistration;}}重启项目在浏览器中多次访问这两个api然后查看sentinel控制台簇点链路然后点击hello资源后面的流控按钮上述配置的意思是当通过/test1访问hello的时候QPS大于1则进行限流言外之意就是/test2访问hello请求并不受影响。我们回到HTTP工具访问http://localhost:8081/test14.5 预热Warm Up流控效果除了直接失败外我们也可以选择预热Warm Up。Warm UpRuleConstant.CONTROL_BEHAVIOR_WARM_UP方式即预热/冷启动方式。当系统长期处于低水位的情况下当流量突然增加时直接把系统拉升到高水位可能瞬间把系统压垮。通过”冷启动”让通过的流量缓慢增加在一定时间内逐渐增加到阈值上限给冷系统一个预热的时间避免冷系统被压垮。sentinel客户端的默认冷加载因子coldFactor为3即请求QPS从 threshold / 3 开始经预热时长逐渐升至设定的QPS阈值。比如上面的配置意思是对于/test1资源一开始的QPS阈值为310/3经过10秒后QPS阈值达到10效果我就不演示了大概效果就是使用浏览器访问http://localhost:8081/test1以最快的手速点刷新一开始会常看到Blocked by Sentinel (flow limiting)的提示10秒后几乎不再出现因为你的手速很难达到1秒10下。4.6 排队等待排队等待方式不会拒绝请求而是严格控制请求通过的间隔时间也即是让请求以均匀的速度通过。修改TestController的代码RestControllerSlf4jpublicclassTestController{GetMapping(test1)publicStringtest1(){log.info(test1);returntest1;}}重启项目浏览器访问http://localhost:8081/test1然后点击sentinel控制台簇点链路列表的/test1流控按钮上述配置的含义是访问/test1请求每秒钟最多只能1次超过的请求排队等待等待超过1000毫秒则超时。新增该规则后多次快速访问http://localhost:8081/test1sentinel客户端控制台日志打印如下每笔请求时间间隔1秒。五、降级规则降级配置页面5.1 基础介绍降级策略分为3种慢调用比例(SLOW_REQUEST_RATIO)选择以慢调用比例作为阈值需要设置允许的慢调用 RT即最大的响应时间请求的响应时间大于该值则统计为慢调用。当单位统计时长statIntervalMs内请求数目大于设置的最小请求数目并且慢调用的比例大于阈值则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断若大于设置的慢调用 RT 则会再次被熔断。异常比例(ERROR_RATIO)当单位统计时长statIntervalMs内请求数目大于设置的最小请求数目并且异常的比例大于阈值则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求成功完成没有错误则结束熔断否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0]代表 0% - 100%。异常数(ERROR_COUNT)当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求成功完成没有错误则结束熔断否则会再次被熔断。熔断降级规则DegradeRule包含下面几个重要的属性Field说明默认值resource资源名即规则的作用对象grade熔断策略支持慢调用比例/异常比例/异常数策略慢调用比例count慢调用比例模式下为慢调用临界 RT超出该值计为慢调用异常比例/异常数模式下为对应的阈值timeWindow熔断时长单位为 sminRequestAmount熔断触发的最小请求数请求数小于该值时即使异常比率超出阈值也不会熔断1.7.0 引入5statIntervalMs统计时长单位为 ms如 60*1000 代表分钟级1.8.0 引入1000 msslowRatioThreshold慢调用比例阈值仅慢调用比例模式有效1.8.0 引入5.2 慢调用比例5.3 异常比例修改TestController的代码RestControllerpublicclassTestController{GetMapping(test1)publicStringtest1(){// 每次请求都抛出异常thrownewRuntimeException(服务异常);}}重启项目浏览器访问http://localhost:8081/test1然后点击sentinel控制台簇点链路列表的/test1降级按钮上面的配置含义是如果/test1的QPS大于5并且每秒钟的请求异常比例大于0.5的话那么在未来的1秒钟时间窗口内sentinel断路器打开该api接口不可用。也就是说如果一秒内有10个请求进来超过5个以上都出错那么会触发熔断1秒钟内这个接口不可用。还是使用上面的JMeter测试开启JMeter后使用http访问http://localhost:8081/test1关掉JMeter后再次访问http://localhost:8081/test15.4 异常数该策略为异常数时表示当指定时间窗口内请求异常数大于等于某个值时触发降级。比如有如下规则上面的规则表示在1秒内访问/test1请求异常的次数大于等于5则触发降级。测试一波六、热点规则热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的数据并对其访问进行限制。比如在TestController中有如下方法GetMapping(buy)SentinelResource(valuebuy)publicStringbuy(StringgoodName,Integercount){return买count份goodName;}对这个资源添加热点规则上面的配置含义是对buy资源添加热点规则当第0个参数的值为wno704的时候QPS阈值为10否则为1。此外如果第0个参数不传那么这笔请求不受该热点规则限制。效果如下七、系统规则系统规则则是针对整个系统设置限流规则并不针对某个资源设置页面如下阈值类型包含以下五种Load自适应仅对 Linux/Unix-like 机器生效系统的 load1 作为启发指标进行自适应系统保护。当系统 load1 超过设定的启发值且系统当前的并发线程数超过估算的系统容量时才会触发系统保护BBR 阶段。系统容量由系统的 maxQps minRt 估算得出。设定参考值一般是 CPU cores 2.5。CPU usage1.5.0 版本当系统 CPU 使用率超过阈值即触发系统保护取值范围 0.0-1.0比较灵敏。平均 RT当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护单位是毫秒。并发线程数当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。入口 QPS当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。比较直观就不演示了。八、授权规则授权规则用于配置资源的黑白名单上述配置表示只有appA和appB才能访问hello资源。
