Sentinel学习记录

Sentinel控制台的功能主要包括:流量控制、降级控制、热点配置、系统规则和授权规则等

一、安装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文件里面加入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

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、启动访问一下,访问试一下

                    

再回到控制台页面,发现有数据了

怎么配置呢?首先了解下概念吧

四、sentinel 术语

1、资源:

        标识资源的唯一名称,springboot项目默认为controller当中的请求路径,也可以在客户端中使用SentinelResource配置;比如你有个service当中的xx方法;你想对这个xx方法进行流控那么这个xx方法必须是一个资源;

            

 

2、针对来源:

      Sentinel可以针对服务调用者进行限流,填写微服务名称即spring.application.name,默认为default,不区分来源

3、阈值类型、单机阈值

      QPS——每秒钟的请求数量,当调用该资源的QPS达到阈值的时候,进行限流。

      线程数——当调用该资源的线程数达到阈值的时候,进行限流。

4、是否集群

      默认不集群

5、流控模式

     直接:当资源调用达到限流条件的时,直接限流。

     关联:当关联的资源请求达到阈值的时候,限流自己。

6、流控效果

    快速失败:直接失败。

    Warm Up:根据冷加载因子默认值为3的值,从阈值/3,经过预热时长,才达到设置的QPS阈值。

    排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则无效。

 

五、效果演示

1、流控模式QOS直接失败

   配置如图

           

   上面设置的效果是,1秒钟内请求/login资源的次数达到1次以上的时候,进行限流

    效果如下

    首先一秒请求一次login没有问题;然后发挥你手速;一秒超过一次之后页面返回Blocked by Sentinel (flow limiting);

2、流控模式线程直接失败

    配置如图

                       

     把Login改成如下

@GetMapping("login")
public String login(String name, Integer type) throws InterruptedException {
        Thread.sleep(1000);
    return "success";
}

     效果如下

       首先慢慢刷新login请求;——等睡眠时间过;服务器永远只有一个线程,发觉没问题;但是你疯狂在地址栏里面点击回车(注意不要去刷新,因为刷新是会等到服务器返回之后才能点击;所以效果演示不出来,最好是点击回车在地址栏)就会失败

3、流控模式关联

    配置如图

                    

      上述配置当1秒内访问/log的次数大于2的时候,限流/login

      效果演示使用postman来密集访问/log(QPS=3),然后我们手动浏览器请求/login,看看效果。postman的如下图

                                    

     

        在没有启动postman的时候 访问login没有问题,当我们启动postman之后 log的qps达到了阈值,这个时候再去访问login 被限流了

4、预热Warm Up

       预热/冷启动方式。当系统长期处于低访问量的情况下,流量突然增加时,可能瞬间把系统压垮。通过warm up方式,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免出问题。

       配置如下

                      

      请求QPS从 阈值 10/ 3 开始,经预热时长(10s)逐渐升至设定的QPS阈值(10)

      效果如下

 

5、排队等待

      所谓排队等待,那就可以理解匀速的通过。

      在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

6、热点规则

       这种规则一般是用在需要限制某个热点数据的访问量,如某一天热搜上某个搜索词,搜索量特别大,那么这个时候,就可以使用这种规则 。

       在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方法。

7、降级规则

      在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<T> implements WritableDataSource<T> {

    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 {

    }
}

1、权限规则持久化配置类

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<String, List<AuthorityRule>> degradeRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
                source -> JSON.parseObject(source, new TypeReference<List<AuthorityRule>>() {}));
        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<List<AuthorityRule>>(group, dataId, properties);
        // 阶级规则
        WritableDataSourceRegistry.registerAuthorityDataSource(writableDataSource);
    }
}

2、降级规则持久化配置类

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<String, List<DegradeRule>> degradeRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
                source -> JSON.parseObject(source, new TypeReference<List<DegradeRule>>() {}));
        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<List<DegradeRule>>(group, dataId, properties);
        // 阶级规则
        WritableDataSourceRegistry.registerDegradeDataSource(writableDataSource);
    }
}

3、流控规则持久化配置类

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<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
                source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
        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<List<FlowRule>>(group, dataId, properties);
        // 流控规则
        WritableDataSourceRegistry.registerFlowDataSource(writableDataSource);
    }
}

4、系统规则持久化配置类

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<String, List<SystemRule>> degradeRuleDataSource = new NacosDataSource<>(serverAddr, group, dataId,
                source -> JSON.parseObject(source, new TypeReference<List<SystemRule>>() {}));
        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<List<SystemRule>>(group, dataId, properties);
        // 阶级规则
        WritableDataSourceRegistry.registerSystemDataSource(writableDataSource);
    }
}

      综上,针对不同的几种情况实现的配置数据持久化到配置中心。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值