好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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 限流规则持久化到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限流规则保存方式的详细内容...

  阅读:15次