- 前言
- 环境说明和准备
- 如何持久化规则到文件
通过Dashboard来为每个Sentinel客户端设置各种各样的规则,但是这里有一个问题,就是这些规则默认时存在内存中的,极不稳定,所以需要将其持久化。本章讲解如何持久化到磁盘。
本章代码已分享至Gitee: https://gitee.com/lengcz/springcloudalibaba01.git
环境说明和准备springboot版本:2.3.2.RELEASE
spring-cloud版本:Hoxton.SR8
spring-cloud-alibaba版本:2.2.5.RELEASE
sentinel-dashboard版本: 1.8.4
- 添加持久化代码
package com.lcz.config; import com.alibaba.csp.sentinel.command.handler.ModifyParamFlowRulesCommandHandler; import com.alibaba.csp.sentinel.datasource.*; import com.alibaba.csp.sentinel.init.InitFunc; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager; 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.lcz.util.SpringBeanUtils; import java.io.File; import java.io.IOException; import java.util.List; public class FilePersistence implements InitFunc{ @Override public void init() throws Exception { String applicationName=SpringBeanUtils.getApplicationContext().getEnvironment().getProperty("spring.application.name"); String ruleDir = System.getProperty("user.home") + "/sentinel-rules/" + applicationName; String flowRulePath = ruleDir + "/flow-rule.json"; String degradeRulePath = ruleDir + "/degrade-rule.json"; String systemRulePath = ruleDir + "/system-rule.json"; String authorityRulePath = ruleDir + "/authority-rule.json"; String paramFlowRulePath = ruleDir + "/param-flow-rule.json"; this.mkdirIfNotExits(ruleDir); this.createFileIfNotExits(flowRulePath); this.createFileIfNotExits(degradeRulePath); this.createFileIfNotExits(systemRulePath); this.createFileIfNotExits(authorityRulePath); this.createFileIfNotExits(paramFlowRulePath); // 流控规则 ReadableDataSource> flowRuleRDS = new FileRefreshableDataSource<>( flowRulePath, flowRuleListParser ); FlowRuleManager.register2Property(flowRuleRDS.getProperty()); WritableDataSource > flowRuleWDS = new FileWritableDataSource<>( flowRulePath, this::encodeJson ); WritableDataSourceRegistry.registerFlowDataSource(flowRuleWDS); // 降级规则 ReadableDataSource
> degradeRuleRDS = new FileRefreshableDataSource<>( degradeRulePath, degradeRuleListParser ); DegradeRuleManager.register2Property(degradeRuleRDS.getProperty()); WritableDataSource > degradeRuleWDS = new FileWritableDataSource<>( degradeRulePath, this::encodeJson ); WritableDataSourceRegistry.registerDegradeDataSource(degradeRuleWDS); // 系统规则 ReadableDataSource
> systemRuleRDS = new FileRefreshableDataSource<>( systemRulePath, systemRuleListParser ); SystemRuleManager.register2Property(systemRuleRDS.getProperty()); WritableDataSource > systemRuleWDS = new FileWritableDataSource<>( systemRulePath, this::encodeJson ); WritableDataSourceRegistry.registerSystemDataSource(systemRuleWDS); // 授权规则 ReadableDataSource
> authorityRuleRDS = new FileRefreshableDataSource<>( authorityRulePath, authorityRuleListParser ); AuthorityRuleManager.register2Property(authorityRuleRDS.getProperty()); WritableDataSource > authorityRuleWDS = new FileWritableDataSource<>( authorityRulePath, this::encodeJson ); WritableDataSourceRegistry.registerAuthorityDataSource(authorityRuleWDS); // 热点参数规则 ReadableDataSource
> paramFlowRuleRDS = new FileRefreshableDataSource<>( paramFlowRulePath, paramFlowRuleListParser ); ParamFlowRuleManager.register2Property(paramFlowRuleRDS.getProperty()); WritableDataSource > paramFlowRuleWDS = new FileWritableDataSource<>( paramFlowRulePath, this::encodeJson ); ModifyParamFlowRulesCommandHandler.setWritableDataSource(paramFlowRuleWDS); } private Converter
> flowRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); private Converter
> degradeRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); private Converter
> systemRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); private Converter
> authorityRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); private Converter
> paramFlowRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); private void mkdirIfNotExits(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } } private void createFileIfNotExits(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { file.createNewFile(); } } private
String encodeJson(T t) { return JSON.toJSONString(t); } }
- 添加SpringBeanUtils
package com.lcz.util; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; @Component public class SpringBeanUtils implements ApplicationContextAware { private static ConfigurableApplicationContext context; public void setApplicationContext(ApplicationContext applicationContext) { context = (ConfigurableApplicationContext) applicationContext; } public static ConfigurableApplicationContext getApplicationContext() { return context; } }
- 在resources下新建目录META-INF/services ,并创建文件,名称为
com.alibaba.csp.sentinel.init.InitFunc
文件的内容为
com.lcz.config.FilePersistence
-
启动服务器,访问微服务的链接后,并添加规则
-
查看持久化的规则文件