gpt4 book ai didi

Sentinel Dashboard限流规则保存方式

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 33 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Sentinel Dashboard限流规则保存方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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限流规则保存方式

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 >&nbsp;&nbsp;流控规则
</ 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 >&nbsp;&nbsp;流控规则
</ 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 。

最后此篇关于Sentinel Dashboard限流规则保存方式的文章就讲到这里了,如果你想了解更多关于Sentinel Dashboard限流规则保存方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com