Yuizhi Blog

The palest ink is better than the best memory(烂键盘)

0%

Sentinel 规则 持久化到Nacos

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。

什么是推模式

规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

流程图

正式开始搞

先创建一个Spring boot demo

  1. 添加sentinel maven依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.1.RELEASE</version>
    </dependency>

    <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.7.1</version>
    </dependency>
  1. 添加配置yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    server:
    port: 8089
    spring:
    application:
    name: sentinel-demo
    cloud:
    sentinel:
    transport:
    #Sentinel控制台的地址
    dashboard: 127.0.0.1:8081
    #Sentinel的默认端口
    port: 8719
    #开启懒加载
    eager: true
    datasource:
    # 名称随意
    flow:
    nacos:
    serverAddr: 127.0.0.1:8848
    dataId: ${spring.application.name}-flow-rules
    groupId: SENTINEL_GROUP
    rule_type: flow
    dataType: json

Sentinel控制台改造

先去github下载源码 https://github.com/alibaba/Sentinel

  1. 打开我们刚才下载的sentinel,到sentinel-dashboard 修改pom.xml

    修改前
    upload successful
    修改后
    upload successful

  1. 找到sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目录,将整个目录拷贝到sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos,如图:

upload successful

  1. 修改 NacosConfig 就是我们上面一步复制的nacos文件夹下面的 ,这里主要是配置Nacos地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     /**
    * @author Eric Zhao
    * @since 1.4.0
    */
    @Configuration
    public class NacosConfig {

    @Value("${nacos.address}")
    private String address;

    @Bean
    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
    return JSON::toJSONString;
    }

    @Bean
    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
    return s -> JSON.parseArray(s, FlowRuleEntity.class);
    }

    @Bean
    public ConfigService nacosConfigService() throws Exception {
    return ConfigFactory.createConfigService(address);
    }
    }

    还有要给 application.properties加上

    1
    2
      # 这是本地运行,生产看自己情况更改
    nacos.address=127.0.0.1:8848
  1. 修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2 ,找到

    1
    2
    3
    4
    5
    6
    @Autowired
    @Qualifier("flowRuleDefaultProvider")
    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("flowRuleDefaultPublisher")
    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

    修改为

    1
    2
    3
    4
    5
    6
    @Autowired
    @Qualifier("flowRuleNacosProvider")
    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    @Autowired
    @Qualifier("flowRuleNacosPublisher")
    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
  2. 修改sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html,找到

    1
    2
    3
    4
    <li ui-sref-active="active" ng-if="!entry.isGateway">
    <a ui-sref="dashboard.flowV1({app: entry.app})">
    <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
    </li>

    修改为

    1
    2
    3
    4
     <li ui-sref-active="active" ng-if="!entry.isGateway">
    <a ui-sref="dashboard.flow({app: entry.app})">
    <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则-Nacos</a>
    </li>
  3. 修改src\main\webapp\resources\app\scripts\controllers\下的identity.js 这里的是修改 簇点链路,把FlowServiceV1 改成FlowServiceV2

upload successful

初步的Flow 限流改造完毕,下面我们看看效果

启动Nacos nacos要配置持久化,这是地址 https://www.cnblogs.com/larscheng/p/11422909.html, 启动我们改造好的Sentinel

  1. 来看看sentinel

upload successful

  1. 来到我们的项目demo,写一个接口返回信息用于测试限流,然后启动demo

upload successful

  1. 然后我们刷新Sentinel,可以看到我们刚才启动的demo,我们用apipost请求我们demo的接口

upload successful

  1. 刷新Sentinel,进入簇点链路,这里可以很清晰的看到我们的接口 /flow

upload successful

  1. 我们给这个/flow,加一个限流规则,看有没有同步到nacos 下面

upload successful

  1. 点击限流规则-Nacos,里面已经有了一条限流规则,就是我们刚才添加的/flow

upload successful

  1. 刷新下Nacos,我们可以看到sentinel-demo-flow-rules, 我们点击编辑看看详情,可以看到规则已经到同步到Nacos 里面

upload successful

upload successful

  1. 来测试下限流规则是否有效,因为没有用并发工具请求,我把阈值调到了1,方便测试,测试没有问题,多次快速请求,触发了Sentinel的限流

upload successful

结尾

至此,Sentinel 持久化到Nacos 已经完成,但是这个并没有结束,因为还有降级规则,热点规则,系统规则,授权规则,这些都需要自己去改造才能像限流规则一样可以同步到Nacos,下一篇我会把这些改造教程写出来(一些大佬看了这个限流规则已经应该知道怎么去改其他的,下一篇主要是给萌新看)

参考链接:
https://github.com/alibaba/Sentinel/wiki
https://blog.52itstyle.vip/archives/4433/
https://www.sonake.com/2019/12/16/Sentinel-Nacos
https://blog.csdn.net/lilizhou2008/article/details/97075236