结合nacos实现sentinel规则持久化
学习中笔记
一、sentinel规则管理及三种模式
推送模式 | 说明 | 优点 | 缺点 |
---|---|---|---|
简单模式 | API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource) | 简单,无任何依赖 | 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境 |
pull模式 | 扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等 | 简单,无任何依赖; | 规则持久化 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。 |
push模式 | 扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 | 规则持久化;一致性;快速 | 引入第三方依赖 |
二、结合nacos使用push模式实现sentinel流控规则持久化
- 推送规则:
- 控制台增加的规则推送到nacos
- sentinel链接nacos客户端,获取规则配置。并监听Nacos配置变化,如发生变化,更新本地缓存(从而让本地缓存和Nacos一致)
- 下载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 实现限流规则、熔断规则的存储,动态推送生效机制。
- 改造sentinel中sentinel-dashboard模块 打开pom去掉中nacos的test注解。
拓展maven scope标签:
a)compile:默认的scope,运行期有效,需要打入包中
b)provided:编译期有效,运行期不需要提供,不会打入包中
c)runtime:编译不需要,在运行期有效,需要导入包中。(接口与实现分离)
d)test:测试需要,不会打入包中
e)system:非本地仓库引入、存在系统的某个路径下的jar。
-
把src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos文件夹拷贝到src/main/java/com/alibaba/csp/sentinel/dashboard/rule目录下:
-
修改改模块下的application.properties,根据实际需要修改address、namespace。需要注意GROUPID默认值是SENTINEL_GROUP,在nacos新建规则时候需要注意
-
修改nacosconfig文件,使得nacos链接可以通过配置文件实现
-
修改流控制器FlowControllerV2注入
注入的两个bean:
flowRuleNacosProvider:就是实现Nacos的限流规则配置拉取。
flowRuleNacosPublisher:实现Nacos的配置推送。
进入flowruleNacosPublisher默认的GROUP_ID为SENTINRL_GROUP
-
打开src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html,找到dashboard.flowV1({app: entry.app})修改为dashboard.flow({app: entry.app})。
-
打开src/main/webapp/resources/app/scripts/controllers/identity.js,把FlowServiceV1改为FlowServiceV2。
三、上述已经完成所有的配置操作。
-
启动DashboardApplication模块进行测试默认端口为8080,首先打开nacos中sentinel的spacename可以看到目前配置为空。
-
项目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>
配置文件中增加
访问测试接口。为getTest新增一条流控规则。
- 打开nacos可以看到命名空间内新增了一条配置,查看详情与sentinel的配置相同。
四、结合nacos使用push模式改造其他规则持久化
-
新增降级规则、热点规则、授权规则、系统规则的配置后缀以作区分
-
添加规则推送类
-
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);
}
- 参照FlowControllerV2修改对应的降级规则、热点规则、授权规则、系统规则的控制器增加对nacos的推送支持
- 应用配置文件中增加相关配置
五、打包
- 全部修改完成后需要在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>
- 运行mvn clean package打成一个fat jar启动jar包sentinel提供了jvm启动参数