6-CloudAlibaba-Sentinel
(规则持久化)学习笔记2020.10.25
前言: (官网 、动态规则)
之前我们学习配置的规则都是临时的, 只要微服应用重启后, 规则就消失了, 需要重新配置。
这样服务多了只后, 后续麻烦的事情会越来越多, 下面进行配置Push 模式规则持久化解决规则是临时的问题。
规则管理及推送
一般来说,规则的推送有下面三种模式:
推送模式 | 说明 | 优点 | 缺点 |
---|---|---|---|
原始模式 | API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource ) | 简单,无任何依赖 | 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境 |
Pull 模式 | 扩展写数据源(WritableDataSource ), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等 | 简单,无任何依赖;规则持久化 | 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。 |
Push 模式 | 扩展读数据源(ReadableDataSource ),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 | 规则持久化;一致性;快速 | 引入第三方依赖 |
1.0 将规则持久化配置进Nacos
的配置中心
1.1 引入依赖
<!--SpringCloud ailibaba sentinel-datasource-nacos sentinel规则持久化-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
1.2 application.yml
配置文件中配置nacos
数据源配置
server:
port: 8080
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: 119.xx.xx.xxx:8848 # Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8090 # 配置Sentinel dashboard地址
port: 8719
datasource:
# 名称随意 (但见名思意最好)
flow:
nacos:
server-addr: 119.xx.xx.xx:8868
dataId: ${spring.application.name}-flow-rules #默认 Nacos 适配的 dataId约定
groupId: SENTINEL_GROUP #默认 Nacos 适配的groupId约定
## 规则类型,取值见: org.springframework.cloud.alibaba.sentinel.datasource.RuleType
rule-type: flow
degrade:
nacos:
server-addr: 119.xx.xx.xx:8868
dataId: ${spring.application.name}-degrade-rules
groupId: SENTINEL_GROUP
rule-type: degrade
param-flow:
nacos:
server-addr: 119.xx.xx.xx:8868
dataId: ${spring.application.name}-param-flow-rules
groupId: SENTINEL_GROUP
rule-type: param-flow
1.3 控制台改造 (官网)
控制台改造主要是为规则实现,需要修改源码,从https://github.com/alibaba/Sentinel/releases 地址下载源码,进入sentinel-dashboard目录进行修改
从 Sentinel 1.4.0 开始,我们抽取出了接口用于向远程配置中心推送规则以及拉取规则:
DynamicRuleProvider
: 拉取规则DynamicRulePublisher
: 推送规则
1.3.1 修改pom.xml
文件【sentinel-dashboard模块下】
C:\Users\Administrator\Desktop\Sentinel-1.8.0\Sentinel-1.8.0\sentinel-dashboard
中的
pom.xml
文件, 去掉范围<scope>test</scope>
<!-- for Nacos rule publisher sample -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<scope>test</scope>
</dependency>
1.3.2 提取出相关的类
找到sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目录,将整个目录拷贝到 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
1.3.3 需在 FlowControllerV2
中指定对应的 bean 即可开启 Nacos 适配
然后只需在
FlowControllerV2
中指定对应的 bean 即可开启 Nacos 适配。前端页面需要手动切换,或者修改前端路由配置(sidebar.html
流控规则路由从dashboard.flowV1
改成dashboard.flow
即可,注意簇点链路页面对话框需要自行改造)
默认 Nacos 适配的 dataId 和 groupId 约定如下:
- groupId:
SENTINEL_GROUP
- 流控规则 dataId:
{appName}-flow-rules
,比如应用名为 appA,则 dataId 为appA-flow-rules
用户可以在 NacosConfigUtil
修改对应的 groupId 和 dataId postfix。用户可以在 NacosConfig
配置对应的 Converter
,默认已提供 FlowRuleEntity
的 decoder 和 encoder。
1.3.4 修改前端路由配置(sidebar.html
)
修改: 文件路径位于sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html
sidebar.html
流控规则路由从dashboard.flowV1
改成dashboard.flow
即可,注意簇点链路页面对话框需要自行改造
自此,流控规则更改为Push持久化,其他规则等照修改
1.3.5 修改簇点链路页面对话框
1.3.6 application.yml
配置文件增加nacos
地址参数与后台进行读取
1.3.7 重新编译打包
回到项目
C:\Users\Administrator\Desktop\Sentinel-1.8.0\Sentinel-1.8.0
主目录(有pom.xml
),执行mvn clean package -Dmaven.test.skip=true
在项目的 target 目录找到
sentinel-dashboard.jar
,执行java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
参考了: https://www.cnblogs.com/fx-blog/p/11726189.html
1.4 进行重启微服应用测试
上面配置完成后, 重启应用规则还是存在会生效的。
但是只配置了限流的持久化。
扩展:
1.0 增加降级持久化
在修改好的控制台源码包仿造
DegradeController
, 配置一个DegradeControllerV2
1.1 重写一个DegradeControllerV2
1.2 增加DegradeRuleNacosProvider
提供者与发布者DegradeRuleNacosPublisher
@Component("degradeRuleNacosProvider")
public class DegradeRuleNacosProvider implements DynamicRuleProvider<List<DegradeRuleEntity>> {
@Autowired
private ConfigService configService;
@Autowired
private Converter<String, List<DegradeRuleEntity>> converter;
@Override
public List<DegradeRuleEntity> getRules(String appName) throws Exception {
修改生成配置中心的文件名
String rules = configService.getConfig(appName + NacosConfigUtil.DEGRADE_DATA_ID_POSTFIX,
NacosConfigUtil.GROUP_ID, 3000);
if (StringUtil.isEmpty(rules)) {
return new ArrayList<>();
}
return converter.convert(rules);
}
}
//------------------------------------------------------------------------------------
@Component("degradeRuleNacosPublisher")
public class DegradeRuleNacosPublisher implements DynamicRulePublisher<List<DegradeRuleEntity>> {
@Autowired
private ConfigService configService;
@Autowired
private Converter<List<DegradeRuleEntity>, String> converter;
@Override
public void publish(String app, List<DegradeRuleEntity> rules) throws Exception {
AssertUtil.notEmpty(app, "app name cannot be empty");
if (rules == null) {
return;
}
//修改生成配置中心的文件名
configService.publishConfig(app + NacosConfigUtil.DEGRADE_DATA_ID_POSTFIX,
NacosConfigUtil.GROUP_ID, converter.convert(rules));
}
}
1.4 添加Converter<List<DegradeRuleEntity>, String>
转换器
@Configuration
public class NacosConfig {
@Value("${spring.cloud.config.nacos.server-addr}")
private String serviceAddr;
@Bean
public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
return JSON::toJSONString;
}
@Bean
public Converter<List<DegradeRuleEntity>, String> degradeEntityEncoder() {
return JSON::toJSONString;
}
@Bean
public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
return s -> JSON.parseArray(s, FlowRuleEntity.class);
}
@Bean
public Converter<String, List<DegradeRuleEntity>> degradeRuleEntityDecoder() {
return s -> JSON.parseArray(s, DegradeRuleEntity.class);
}
@Bean
public ConfigService nacosConfigService() throws Exception {
//return ConfigFactory.createConfigService("localhost");
return ConfigFactory.createConfigService(serviceAddr);
}
}
1.5 NacosConfigUtil
增加常量名
public static final String DEGRADE_DATA_ID_POSTFIX = "-degrade-rules";
1.6 进行启动控制台进行测试
在次进行重启应用后进行测试规则还是存在。
1
也可以使用阿里云提供的在线托管Sentinel控制台:AHAS