Sentinel Dashboard限流规则保存
sentinel在限流规则配置方面提供了可视化页面 sentinel dashboard,源码可从github下载,请自行搜索,此处不提供下载链接。
规则持久化后首先触发GatewayFlowRuleController(源码似乎没有,请参考普通规则改造)的/new.json(或)请求,方法会调用publishRules()将本次编辑规则组装后通过远程调用请求gateway/updateRules更新远程服务内存中限流规则,该接口由远程服务UpdateGatewayRuleCommandHandler提供。
UpdateGatewayRuleCommandHandler接收到请求通过调用handle方法,方法通过
1
2
3
|
Set<GatewayFlowRule> flowRules = (Set)JSON.parseObject(data, new TypeReference<Set<GatewayFlowRule>>() { }, new Feature[ 0 ]); GatewayRuleManager.loadRules(flowRules); |
将规则持久化到内存。
具体请参考以下流程图
Sentinel DashBoard程序流程
Gateway网关程序流程
sentinel dashboard 限流规则持久化到nacos
1、将webapp/resources/app/scripts/directives/sidebar/sidebar.html中的
1
2
3
4
5
|
< li ui-sref-active = "active" > < a ui-sref = "dashboard.flowV1({app: entry.app})" > < i class = "glyphicon glyphicon-filter" ></ i > 流控规则 </ a > </ li > |
改为:
1
2
3
4
5
|
< li ui-sref-active = "active" > < a ui-sref = "dashboard.flow({app: entry.app})" > < i class = "glyphicon glyphicon-filter" ></ i > 流控规则 </ a > </ li > |
2、将webapp\resources\app\scripts\controllers\identity.js中的(主要是将FlowServiceV1改为FlowServiceV2)
1
2
3
4
5
|
app.controller( 'IdentityCtl' , [ '$scope' , '$stateParams' , 'IdentityService' , 'ngDialog' , 'FlowServiceV1' , 'DegradeService' , 'AuthorityRuleService' , 'ParamFlowService' , 'MachineService' , '$interval' , '$location' , '$timeout' , function ($scope, $stateParams, IdentityService, ngDialog, FlowService, DegradeService, AuthorityRuleService, ParamFlowService, MachineService, $interval, $location, $timeout) { |
改为:
1
2
3
4
5
|
app.controller( 'IdentityCtl' , [ '$scope' , '$stateParams' , 'IdentityService' , 'ngDialog' , 'FlowServiceV2' , 'DegradeService' , 'AuthorityRuleService' , 'ParamFlowService' , 'MachineService' , '$interval' , '$location' , '$timeout' , function ($scope, $stateParams, IdentityService, ngDialog, FlowService, DegradeService, AuthorityRuleService, ParamFlowService, MachineService, $interval, $location, $timeout) { |
3、将下面的四个文件全部拷贝到src/main/java的com.alibaba.csp.sentinel.dashboard.rule包下
FlowRuleNacosProvider.java (从nacos读取配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.alibaba.csp.sentinel.dashboard.rule; import java.util.ArrayList; import java.util.List; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.nacos.api.config.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component ( "flowRuleNacosProvider" ) public class FlowRuleNacosProvider implements DynamicRuleProvider<List<FlowRuleEntity>> { @Autowired private ConfigService configService; @Autowired private Converter<String, List<FlowRuleEntity>> converter; @Override public List<FlowRuleEntity> getRules(String appName) throws Exception { // app端如果需要读取在此处设置好的配置需要设置的GROUP和dataId 需要和这里保持一致 String group = NacosConfigUtil.GROUP_ID; String dataId = appName + NacosConfigUtil.FLOW_DATA_ID_POSTFIX; String rules = configService.getConfig(dataId, group, 3000 ); if (StringUtil.isEmpty(rules)) { return new ArrayList<>(); } return converter.convert(rules); } } |
FlowRuleNacosPublisher.java (将修改后的配置同步到nacos)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.alibaba.csp.sentinel.dashboard.rule; import java.util.List; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.util.AssertUtil; import com.alibaba.nacos.api.config.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component ( "flowRuleNacosPublisher" ) public class FlowRuleNacosPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> { @Autowired private ConfigService configService; @Autowired private Converter<List<FlowRuleEntity>, String> converter; @Override public void publish(String app, List<FlowRuleEntity> rules) throws Exception { AssertUtil.notEmpty(app, "app name cannot be empty" ); if (rules == null ) { return ; } //需要和FlowRuleNacosProvider保持一致 String group = NacosConfigUtil.GROUP_ID; String dataId = appName + NacosConfigUtil.FLOW_DATA_ID_POSTFIX; configService.publishConfig(dataId , group , converter.convert(rules)); } } |
NacosConfig.java(初始化nacos的nacosConfigService)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package com.alibaba.csp.sentinel.dashboard.rule; import java.util.List; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.fastjson.JSON; import com.alibaba.nacos.api.config.ConfigFactory; import com.alibaba.nacos.api.config.ConfigService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class NacosConfig { @Bean public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() { return JSON::toJSONString; } @Bean public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() { return s -> JSON.parseArray(s, FlowRuleEntity. class ); } @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 ConfigService nacosConfigService() throws Exception { //在此处设置nacos服务器的地址 return ConfigFactory.createConfigService( "localhost:8848" ); } } |
NacosConfigUtil.java(nacos配置的一些常量)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.alibaba.csp.sentinel.dashboard.rule; public final class NacosConfigUtil { public static final String GROUP_ID = "SENTINEL_GROUP" ; public static final String FLOW_DATA_ID_POSTFIX = "-flow-rules" ; public static final String PARAM_FLOW_DATA_ID_POSTFIX = "-param-rules" ; public static final String CLUSTER_MAP_DATA_ID_POSTFIX = "-cluster-map" ; public static final String DEGRADE_DATA_ID_POSTFIX = "-degrade-rules" ; /** * cc for `cluster-client` */ public static final String CLIENT_CONFIG_DATA_ID_POSTFIX = "-cc-config" ; /** * cs for `cluster-server` */ public static final String SERVER_TRANSPORT_CONFIG_DATA_ID_POSTFIX = "-cs-transport-config" ; public static final String SERVER_FLOW_CONFIG_DATA_ID_POSTFIX = "-cs-flow-config" ; public static final String SERVER_NAMESPACE_SET_DATA_ID_POSTFIX = "-cs-namespace-set" ; private NacosConfigUtil() {} } |
4、修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2
将
1
2
3
4
5
6
|
@Autowired @Qualifier ( "flowRuleDefaultProvider" ) private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider; @Autowired @Qualifier ( "flowRuleDefaultPublisher" ) private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher; |
改为:
1
2
3
4
5
6
|
@Autowired @Qualifier ( "flowRuleNacosProvider" ) private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider; @Autowired @Qualifier ( "flowRuleNacosPublisher" ) private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher; |
然后启动之后就可以测试了
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_39195030/article/details/115892923