Sentinel控制台的功能主要包括:流量控制、降级控制、热点配置、系统规则和授权规则等
下载地址:Sentinel控制台下载地址:https://github.com/alibaba/Sentinel/releases版本自己选择
我这里下载的是sentinel-dashboard-1.7.2.jar版本
进入jar包的存放目录,然后执行命令
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-dashboard-1.7.2.jar
如下图,就代表启动成功了
登录之后看到左侧的菜单只有默认的一个,因为现在sentinel还没有发现其他机器
1、在你的工程pom.xml文件里面加入依赖
org.springframework.boot
spring-boot-starter-parent
2.2.5.RELEASE
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
2、创建一个controller,如下
@GetMapping("login")
public String login(String name, Integer type) throws InterruptedException {
return "success";
}
@GetMapping("log")
public String log(){
System.out.println("log----");
return "success";
}
3、在你的application.yml或bootstrap.yml文件中加入以下配置
spring:
application
# Sentinel的相关配置
sentinel:
transport:
port: 8719 #如果加了客户端他就会开启一个 http server 为了dashboard 能够发过来
dashboard: 127.0.0.1:8080 # sentinel的控制台
4、启动访问一下,访问试一下
再回到控制台页面,发现有数据了
怎么配置呢?首先了解下概念吧
标识资源的唯一名称,springboot项目默认为controller当中的请求路径,也可以在客户端中使用SentinelResource配置;比如你有个service当中的xx方法;你想对这个xx方法进行流控那么这个xx方法必须是一个资源;
Sentinel可以针对服务调用者进行限流,填写微服务名称即spring.application.name,默认为default,不区分来源
QPS——每秒钟的请求数量,当调用该资源的QPS达到阈值的时候,进行限流。
线程数——当调用该资源的线程数达到阈值的时候,进行限流。
默认不集群
直接:当资源调用达到限流条件的时,直接限流。
关联:当关联的资源请求达到阈值的时候,限流自己。
快速失败:直接失败。
Warm Up:根据冷加载因子默认值为3的值,从阈值/3,经过预热时长,才达到设置的QPS阈值。
排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则无效。
配置如图
上面设置的效果是,1秒钟内请求/login资源的次数达到1次以上的时候,进行限流
效果如下
首先一秒请求一次login没有问题;然后发挥你手速;一秒超过一次之后页面返回Blocked by Sentinel (flow limiting);
配置如图
把Login改成如下
@GetMapping("login")
public String login(String name, Integer type) throws InterruptedException {
Thread.sleep(1000);
return "success";
}
效果如下
首先慢慢刷新login请求;——等睡眠时间过;服务器永远只有一个线程,发觉没问题;但是你疯狂在地址栏里面点击回车(注意不要去刷新,因为刷新是会等到服务器返回之后才能点击;所以效果演示不出来,最好是点击回车在地址栏)就会失败
配置如图
上述配置当1秒内访问/log的次数大于2的时候,限流/login
效果演示使用postman来密集访问/log(QPS=3),然后我们手动浏览器请求/login,看看效果。postman的如下图
在没有启动postman的时候 访问login没有问题,当我们启动postman之后 log的qps达到了阈值,这个时候再去访问login 被限流了
预热/冷启动方式。当系统长期处于低访问量的情况下,流量突然增加时,可能瞬间把系统压垮。通过warm up方式,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免出问题。
配置如下
请求QPS从 阈值 10/ 3 开始,经预热时长(10s)逐渐升至设定的QPS阈值(10)
效果如下
所谓排队等待,那就可以理解匀速的通过。
在controller中加入以下内容
@GetMapping("login")
public String login(String name, Integer type) throws InterruptedException {
Thread.sleep(5000);
return "success";
}
/**
* 这个接口主要是为了测试sentinel的流控规则下的排队的效果
* */
@GetMapping("rpcInvoke")
public String RpcInvoke() {
final AtomicInteger ato = new AtomicInteger(0);
for (int i = 0; i < 20; i++) {
new Thread(()->{
String res = restTemplate.getForObject("http://register-server-consumer/login", String.class);
System.out.println("线程"+ato.incrementAndGet()+"------------"+ res);
}).start();
}
return "invoke-success";
}
配置如图
效果如下
Exception in thread "Thread-137" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-127" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-126" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-125" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-121" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-123" Exception in thread "Thread-131" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-130" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-122" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-124" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-136" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-134" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-133" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-129" org.springframework.web.client.HttpClientErrorException$TooManyRequests: 429 : [Blocked by Sentinel (flow limiting)]
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:137)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO(RestTemplate.java:782)
at org.springframework.web.client.RestTemplate.handleResponse$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$S2v6L1Fv.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO(RestTemplate.java:740)
at org.springframework.web.client.RestTemplate.doExecute$original$3aUvGlBO$accessor$wdYDaV2k(RestTemplate.java)
at org.springframework.web.client.RestTemplate$auxiliary$3UN3ZpqY.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.shadow.web.controller.IndexController.lambda$RpcInvoke$0(IndexController.java:33)
at java.lang.Thread.run(Thread.java:745)
2020-05-31 16:04:52.125 ERROR 3772 --- [imeoutChecker_1] i.s.c.r.netty.NettyClientChannelManager : no available service 'default' found, please make sure registry config correct
2020-05-31 16:04:52.305 ERROR 3772 --- [imeoutChecker_2] i.s.c.r.netty.NettyClientChannelManager : no available service 'default' found, please make sure registry config correct
线程1------------success
线程2------------success
线程3------------success
线程4------------success
线程5------------success
线程6------------success
这种规则一般是用在需要限制某个热点数据的访问量,如某一天热搜上某个搜索词,搜索量特别大,那么这个时候,就可以使用这种规则 。
在controller加入以下内容
@GetMapping("login")
@SentinelResource(value="sentinelLogin", blockHandler = "blockHandler", fallback =
"fallbackHandler") // 声明成sentinel的资源
public String login(String name, Integer type) throws InterruptedException {
return "success";
}
/**
*
* 流控触发后的降级方法
*
* */
public String blockHandler(String name, Integer type, BlockException e) {
System.out.println("--------------------blockHandler------------------");
return "blockHandler";
}
/**
* 异常后,触发后的降级方法
* */
public String fallbackHandler(String name, Integer type){
System.out.println("--------------------fallbackHandler-------------------");
return "fallbackHandler";
}
配置如图
效果如下
从这个效果,可以的看出,如果是规则匹配的话,就会走blockHandler方法。
在controller中加入以下内容
@GetMapping("login")
@SentinelResource(value="sentinelLogin", blockHandler = "blockHandler", fallback =
"fallbackHandler") // 声明成sentinel的资源
public String login(String name, Integer type) throws InterruptedException {
if ("xxx".equals(name)) {
System.out.println(1/0);
}
return "success";
}
/**
*
* 流控触发后的降级方法
*
* */
public String blockHandler(String name, Integer type, BlockException e) {
System.out.println("--------------------blockHandler------------------");
return "blockHandler";
}
/**
* 异常后,触发后的降级方法
* */
public String fallbackHandler(String name, Integer type){
System.out.println("--------------------fallbackHandler-------------------");
return "fallbackHandler";
}
配置如下图
效果如下图
从这个效果可以看出,当刚开始有异常的时候,就会走fallbackHandler降级方法,当异常数到达上限,就会走blockHandler方法。
我们在使用sentinel做各规则限制的时候,使用起来很方便,只需要在对应的工程内部添加sentinel的依赖就可以,对业务完全没有侵入性。但是有一个问题,就是如果一旦sentinel宕掉之后,那么之前添加的一些就都会丢失。这显然不合适,因为一旦业务庞大之后,这个可维护性显著降低。为此,我们需要将添加的一些规则信息进行待久化。保存到配置中心,如nacos。
首先,需要一个配置中心,我这里以springAlibaba项目为例,在子系统中加入配置中心的配置即可,在bootstrap.yml配置文件里加入以下内容
spring
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
## 配置中心的配置
config:
file-extension: yml
prefix: consumer-config # 这个名称对应的就是控制台的配置管理下"新建配置"页面中的"Data ID" , 如果不配置的话,就使用${spring.application.name}-${spring.profiles.active.}. ${file-extension}。其中file-extension的值可以是properties、yaml等格式
server-addr: 127.0.0.1:8848
再次,需要对写配置数据到Nacos上去进行支持
package com.shadow.web.util;
import com.alibaba.csp.sentinel.datasource.WritableDataSource;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import java.util.Properties;
public class WriteableNacos implements WritableDataSource {
private String group;
private String dataId;
private Properties properties;
public WriteableNacos(String group, String dataId, Properties properties){
this.group = group;
this.dataId = dataId;
this.properties = properties;
}
//当sentinel update 时候
@Override
public void write(T value) throws Exception {
System.out.println("-------------write-----------");
String s = JSON.toJSONString(value);
System.out.println(s);
ConfigService configService = NacosFactory.createConfigService((String)properties.get(PropertyKeyConst.SERVER_ADDR));
boolean isPublishOk = configService.publishConfig(this.dataId, this.group, s);
System.out.println(isPublishOk);
}
@Override
public void close() throws Exception {
}
}
package com.shadow.web.util;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.WritableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Properties;
@Component
public class SentinelAuthorityCtl {
private String dataId = "authority";
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
private static String group = "DEFAULT_GROUP";
@PostConstruct
public void init() throws NacosException {
System.out.println("-------------init-----------");
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
//properties.put(PropertyKeyConst.NAMESPACE, "public"); // 指定namespace
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95”对应的页面的“使用 Nacos 配置规则”标题下的内容
ReadableDataSource> degradeRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
source -> JSON.parseObject(source, new TypeReference>() {}));
AuthorityRuleManager.register2Property(degradeRuleDataSource.getProperty());
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel”对应页面的“FileDataSourceInit ”的代码
//System.out.println(flowRuleDataSource.getProperty());
WritableDataSource writableDataSource = new WriteableNacos>(group, dataId, properties);
// 阶级规则
WritableDataSourceRegistry.registerAuthorityDataSource(writableDataSource);
}
}
package com.shadow.web.util;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.WritableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Properties;
@Component
public class SentinelDegradedCtl {
private String dataId = "degraded";
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
private static String group = "DEFAULT_GROUP";
@PostConstruct
public void init() throws NacosException {
System.out.println("-------------init-----------");
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
// properties.put(PropertyKeyConst.NAMESPACE, "public"); // 指定namespace
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95”对应的页面的“使用 Nacos 配置规则”标题下的内容
ReadableDataSource> degradeRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
source -> JSON.parseObject(source, new TypeReference>() {}));
DegradeRuleManager.register2Property(degradeRuleDataSource.getProperty());
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel”对应页面的“FileDataSourceInit ”的代码
//System.out.println(flowRuleDataSource.getProperty());
WritableDataSource writableDataSource = new WriteableNacos>(group, dataId, properties);
// 阶级规则
WritableDataSourceRegistry.registerDegradeDataSource(writableDataSource);
}
}
package com.shadow.web.util;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.WritableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Properties;
@Component
public class SentinelFlowCtl {
private String dataId = "flow";
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
private static String group = "DEFAULT_GROUP";
@PostConstruct
public void init() throws NacosException {
System.out.println("-------------init-----------");
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
// properties.put(PropertyKeyConst.NAMESPACE, "public"); // 指定namespace
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95”对应的页面的“使用 Nacos 配置规则”标题下的内容
ReadableDataSource> flowRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
source -> JSON.parseObject(source, new TypeReference>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel”对应页面的“FileDataSourceInit ”的代码
//System.out.println(flowRuleDataSource.getProperty());
WritableDataSource writableDataSource = new WriteableNacos>(group, dataId, properties);
// 流控规则
WritableDataSourceRegistry.registerFlowDataSource(writableDataSource);
}
}
package com.shadow.web.util;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.WritableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Properties;
@Component
public class SentinelSystemSpotCtl {
private String dataId = "system";
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
private static String group = "DEFAULT_GROUP";
@PostConstruct
public void init() throws NacosException {
System.out.println("-------------init-----------");
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
// properties.put(PropertyKeyConst.NAMESPACE, "public"); // 指定namespace
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95”对应的页面的“使用 Nacos 配置规则”标题下的内容
ReadableDataSource> degradeRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
source -> JSON.parseObject(source, new TypeReference>() {}));
SystemRuleManager.register2Property(degradeRuleDataSource.getProperty());
// 这一段参照“https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel”对应页面的“FileDataSourceInit ”的代码
//System.out.println(flowRuleDataSource.getProperty());
WritableDataSource writableDataSource = new WriteableNacos>(group, dataId, properties);
// 阶级规则
WritableDataSourceRegistry.registerSystemDataSource(writableDataSource);
}
}
综上,针对不同的几种情况实现的配置数据持久化到配置中心。