结合nacos实现sentinel规则持久化

结合nacos实现sentinel规则持久化

学习中笔记


一、sentinel规则管理及三种模式

推送模式说明优点缺点
简单模式API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource)简单,无任何依赖不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
pull模式扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等简单,无任何依赖;规则持久化 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
push模式扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。规则持久化;一致性;快速引入第三方依赖

二、结合nacos使用push模式实现sentinel流控规则持久化

  1. 推送规则:
  • 控制台增加的规则推送到nacos
  • sentinel链接nacos客户端,获取规则配置。并监听Nacos配置变化,如发生变化,更新本地缓存(从而让本地缓存和Nacos一致)
  1. 下载sentinel源码,对源码进行改造
    从github上https://github.com/alibaba/Sentinel/releases 下载源码并导入到idea中
    在这里插入图片描述
    • sentinel-core:Sentinel 核心模块,实现限流、熔断等基本能力。
    • sentinel-dashboard:Sentinel 可视化控制台,提供基本的管理界面,配置限流、熔断规则等,展示监控数据等。
    • sentinel-adapter:Sentinel 适配,Sentinel-core 模块提供的是限流等基本API,主要是提供给应用自己去显示调用,对代码有侵入性,故该模块对主流框架进行了适配,目前已适配的模块:
      • sentinel-apache-dubbo-adapter:对 Apache Dubbo 版本进行适配,这样应用只需引入sentinel-apache-dubbo-adapter 包即可对dubbo 服务进行流控与熔断,大家可以思考会利用 Dubbo 的哪个功能特性。
      • sentinel-dubbo-adapter:对 Alibaba Dubbo 版本进行适配。
      • sentinel-grpc-adapter:对 GRPC 进行适配。
      • sentinel-spring-webflux-adapter:对响应式编程框架 webflux 进行适配。
      • sentinel-web-servlet:对 servlet 进行适配,例如 Spring MVC。
      • sentinel-zuul-adapter:对 zuul 网关进行适配。
    • sentinel-cluster:提供集群模式的限流与熔断支持,因为通常一个应用会部署在多台机器上组成应用集群。
    • sentinel-transport:网络通讯模块,提供 Sentinel 节点与sentinel-dashboard 的通讯支持,主要有如下两种实现。
      • sentinel-transport-netty-http:基于 Netty 实现的 http 通讯模式。
      • sentinel-transport-simple-http:简单的 http 实现方式。
    • sentinel-extension:Sentinel 扩展模式。主要提供了如下扩展(高级)功能:
      • sentinel-annotation-aspectj:提供基于注解的方式来定义资源等。
      • sentinel-parameter-flow-control:提供基于参数的限流(热点限流)。
      • sentinel-datasource-extension:限流规则、熔断规则的存储实现,默认是存储在内存中。
      • sentinel-datasource-apollo:基于 apollo 配置中心实现限流规则、熔断规则的存储,动态推送生效机制。
      • sentinel-datasource-consul:基于 consul 实现限流规则、熔断规则的存储,动态推送生效机制。
      • sentinel-datasource-etcd:基于 etcd 实现限流规则、熔断规则的存储,动态推送生效机制。
      • sentinel-datasource-nacos:基于 nacos 实现限流规则、熔断规则的存储,动态推送生效机制。
      • entinel-datasource-redis:基于 redis 实现限流规则、熔断规则的存储,动态推送生效机制。
      • sentinel-datasource-spring-cloud-config:基于 spring-cloud-config 实现限流规则、熔断规则的存储,动态推送生效机制。
      • sentinel-datasource-zookeeper:基于 zookeeper 实现限流规则、熔断规则的存储,动态推送生效机制。
  2. 改造sentinel中sentinel-dashboard模块 打开pom去掉中nacos的test注解。
    在这里插入图片描述

拓展maven scope标签:
a)compile:默认的scope,运行期有效,需要打入包中
b)provided:编译期有效,运行期不需要提供,不会打入包中
c)runtime:编译不需要,在运行期有效,需要导入包中。(接口与实现分离)
d)test:测试需要,不会打入包中
e)system:非本地仓库引入、存在系统的某个路径下的jar。

  1. 把src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos文件夹拷贝到src/main/java/com/alibaba/csp/sentinel/dashboard/rule目录下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YsLdPNIv-1620452854956)(media/16204444829060/16204459222546.jpg)]

  2. 修改改模块下的application.properties,根据实际需要修改address、namespace。需要注意GROUPID默认值是SENTINEL_GROUP,在nacos新建规则时候需要注意[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sK9zPgX7-1620452854957)(media/16204444829060/16204459406469.jpg)]

  3. 修改nacosconfig文件,使得nacos链接可以通过配置文件实现
    在这里插入图片描述在这里插入图片描述

  4. 修改流控制器FlowControllerV2注入在这里插入图片描述在这里插入图片描述

注入的两个bean:
flowRuleNacosProvider:就是实现Nacos的限流规则配置拉取。
flowRuleNacosPublisher:实现Nacos的配置推送。
进入flowruleNacosPublisher默认的GROUP_ID为SENTINRL_GROUP
在这里插入图片描述
在这里插入图片描述

  1. 打开src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html,找到dashboard.flowV1({app: entry.app})修改为dashboard.flow({app: entry.app})。
    在这里插入图片描述

  2. 打开src/main/webapp/resources/app/scripts/controllers/identity.js,把FlowServiceV1改为FlowServiceV2。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fccsvW0v-1620452854962)(media/16204444829060/16204460501524.jpg)]

三、上述已经完成所有的配置操作。

  1. 启动DashboardApplication模块进行测试默认端口为8080,首先打开nacos中sentinel的spacename可以看到目前配置为空。在这里插入图片描述

  2. 项目pom.xml中新增相关依赖

<!--      sentinel流量控制      -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

配置文件中增加[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9reqhFo-1620452854963)(media/16204444829060/16204522285765.jpg)]

访问测试接口。为getTest新增一条流控规则。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pPetsjIN-1620452854963)(media/16204444829060/16204522402911.jpg)]

  1. 打开nacos可以看到命名空间内新增了一条配置,查看详情与sentinel的配置相同。在这里插入图片描述
    在这里插入图片描述

四、结合nacos使用push模式改造其他规则持久化

  1. 新增降级规则、热点规则、授权规则、系统规则的配置后缀以作区分 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkR5kRlh-1620452854965)(media/16204444829060/16204523361198.jpg)]

  2. 添加规则推送类[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mum1jVHO-1620452854966)(media/16204444829060/16204523513567.jpg)]

  3. nacosConfig中添加规则转化类

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

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

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

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

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

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

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

@Bean
public Converter<String, List<ParamFlowRuleEntity>> paramFlowRuleEntityDecoder() {
    return s -> JSON.parseArray(s, ParamFlowRuleEntity.class);
}
  1. 参照FlowControllerV2修改对应的降级规则、热点规则、授权规则、系统规则的控制器增加对nacos的推送支持
  2. 应用配置文件中增加相关配置
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWKoSycb-1620452854967)(media/16204444829060/16204524104522.jpg)]

五、打包

  1. 全部修改完成后需要在pom.xml中增加,跳过对test的打包
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <skipTests>true</skipTests>
    </configuration>
</plugin>
  1. 运行mvn clean package打成一个fat jar启动jar包sentinel提供了jvm启动参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值