“秋来相顾尚飘蓬,未就丹砂愧葛洪。
痛饮狂歌空度日,飞扬跋扈为谁雄”
总结
我上一篇:spring cloud alibaba sentinel
介绍的sentinel可以定义很多的规则,但这些规则都是存在内存中的,下次重启服务,规则就消失了,这肯定是不能在生产环境中使用的,所以我们需要对规则进行持久化。
还没开始,就已经结束。。。翻了很多资料,发现好像最好的办法就是使用阿里提供的在线托管Sentinel控制台(AHAS),果然花钱能解决很多问题
下面搞搞不花钱的
官方文档:生产环境使用sentinel
文档介绍了各种推送模式,以及可以用什么实现,实现代码只是提了一些关键的地方。我这里就不用进行复制粘贴了吧,官网肯定比我写得好,网上基本上都是复制粘贴的官网信息
使用nacos持久化规则
微服务进行改造
- 加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.7.2</version>
</dependency>
- 加配置
添加sentinel.datasource的配置
spring:
application:
name: ts-customer
profiles:
active: dev
cloud:
nacos:
config:
server-addr: ${settings.nacos.addr}
namespace: ${settings.nacos.namespace.${spring.profiles.active}}
file-extension: yaml
shared-configs: shareConfig.yaml
refresh-enabled: true
# extension-configs:
# dataId:
# group:
# refresh: true
discovery:
server-addr: ${settings.nacos.addr}
namespace: ${settings.nacos.namespace.${spring.profiles.active}}
sentinel:
transport:
dashboard: ${settings.sentinel.dashboard}
datasource:
flow: #这个名称可以随便取
nacos: #限流持久配置
server-addr: ${settings.nacos.addr} #使用nacos的持久
dataId: ${spring.application.name}-flow-rules #获取限流的数据源的dataId
groupId: DEFAULT_GROUP
rule-type: flow
dataType: json
degrade:
nacos: #降级持久配置
server-addr: ${settings.nacos.addr}
dataId: ${spring.application.name}-degrade-rules
groupId: SENTINEL_GROUP
rule-type: degrade
system:
nacos:
server-addr: ${settings.nacos.addr}
dataId: ${spring.application.name}-system-rules
groupId: SENTINEL_GROUP
rule-type: system
authority:
nacos:
server-addr: ${settings.nacos.addr}
dataId: ${spring.application.name}-authority-rules
groupId: SENTINEL_GROUP
rule-type: authority
param-flow:
nacos:
server-addr: ${settings.nacos.addr}
dataId: ${spring.application.name}-param-flow-rules
groupId: SENTINEL_GROUP
rule-type: param-flow
##### nacos配置参数 ####
settings:
nacos:
addr: 192.168.31.37:38001
namespace:
dev: 190bfcff-e39e-42d7-ae87-af2690a4d409
sentinel:
dashboard: 192.168.31.37:8808
每个配置,对应控制台的各种规则
- nacos添加配置
在服务的运行日志中我们可以看见他推送了该配置到sentinel
然后在sentinel dashboard中可以看见我们定义的规则,但是如果我们在控制台修改了该规则是没有作用的,因为他不会推送到nacos配置中心,所有如果这样搞,那么sentinel控制台的作用就仅仅是一个展示,而且每个需要配置规则的资源,都需要我们自己去配置中心件文件,加配置,十分的麻烦。比较好的是规则我们都可以定义,想不花钱的话,就只有这样
所以我们要尝试修改sentinel控制台代码 - 改造控制台
这里使用push模式,其他模式可参考:https://www.cnblogs.com/fx-blog/p/11726189.html
下载sentinel-dashboard源码: https://github.com/alibaba/Sentinel/releases
修改pom
<!-- for Nacos rule publisher sample -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
将test去掉,让配置不仅在测试时生效
然后将test的rule目录下的nacos文件复制到rule目录下
然后修改controller/v2目录下的FlowControllerV2
修改Qualifier注解,原来是defalt,改为nacos
@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
然后修改src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html
将注释放开
<li ui-sref-active="active" ng-if="entry.appType==0">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则 V1</a>
</li>
最后修改src/main/webapp/resources/app/scripts/controllers/identity.js
FlowServiceV1改为FlowServiceV2,使用我们改造后的controller
然后重启控制台
为了查看效果,将我们之前在nacos创建的配置文件删掉
然后在刚刚添加的 流控规则 V1里面添加规则
添加后查看nacos控制台,即可看见我们刚刚添加的流控规则
这样就非常的nice,但是目前我们只改造了flow规则,剩下的怎么改造,目前我还不会。。。。这个都是官方提供的代码,有兴趣的可以试一试,每个规则对应一个controller,改造相应的controller即可。