Sentinel Dashboard限流规则保存方式

网友投稿 590 2023-01-04

Sentinel Dashboard限流规则保存方式

Sentinel Dashboard限流规则保存方式

Sentinel Dashboard限流规则保存

sentinel在限流规则配置方面提供了可视化页面 sentinel dashboard,源码可从github-,请自行搜索,此处不提供-链接。

规则持久化后首先触发GatewayFlowRuleController(源码似乎没有,请参考普通规则改造)的/new.json(或)请求,方法会调用publishRules()将本次编辑规则组装后通过远程调用请求gateway/updateRules更新远程服务内存中限流规则,该接口由远程服务UpdateGatewayRuleCommandHandler提供。

UpdateGatewayRuleCommandHandler接收到请求通过调用handle方法,方法通过

Set flowRules = (Set)JSON.parseObject(data, new TypeReference>() {

}, new Feature[0]);

GatewayRuleManager.loadRules(flowRules);

将规则持久化到内存。

具体请参考以下流程

Sentinel DashBoard程序流程

Gateway网关程序流程

sentinel dashboard 限流规则持久化到nacos

1、将webapp/resources/app/scripts/directives/sidebar/sidebar.html中的

  流控规则

改为:

  流控规则

2、将webapp\resources\app\scripts\controllers\identity.js中的(主要是将FlowServiceV1改为FlowServiceV2)

app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',

'ngDialog', 'FlowServiceV1', 'DegradeService', 'AuthorityRhttp://uleService', 'ParamFlowService', 'MachineService',

'$interval', '$location', '$timeout',

function ($scope, $stateParams, IdentityService, ngDialog,

FlowService, DegradeService, AuthorityRuleService, ParamFlowService, MachineService, $interval, $location, $timeout) {

改为:

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读取配置)

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> {

@Autowired

private ConfigService configService;

@Autowired

private Converter> converter;

@Override

public List 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)

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> {

@Autowired

private ConfigService configService;

@Autowired

private Converter, String> converter;

@Override

public void publish(String app, List 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)

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, String> flowRuleEntityEncoder() {

return JSON::toJSONString;

}

@Bean

public Converter> flowRuleEntityDecoder() {

return s -> JSON.parseArray(s, FlowRuleEntity.class);

}

@Bean

public Converter, String> degradeRuleEntityEncoder() {

return JSON::toJSONString;

}

@Bean

public Converter> degradeRuleEntityDecoder() {

return s -> JSON.parseArray(s, DegradeRuleEntity.class);

}

@Bean

public ConfigService nacosConfigService() throws Exception {

//在此处设置nacos服务器的地址

return ConfigFactory.createConfigService("localhost:8848");

}

}

NacosConfigUtil.java(nacos配置的一些常量)

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_POSTFIXhttp:// = "-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

@Autowired

@Qualifier("flowRuleDefaultProvider")

private DynamicRuleProvider> ruleProvider;

@Autowired

@Qualifier("flowRuleDefaultPublisher")

private DynamicRulePublisher> rulePublisher;

改为:

@Autowired

@Qualifier("flowRuleNacosProvider")

private DynamicRuleProvider> ruleProvider;

@Autowired

@Qualifier("flowRuleNacosPublisher")

private DynamicRulePublisher> rulePublisher;

然后启动之后就可以测试了

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:移动应用开发专业一本学校(移动应用开发专业课程)
下一篇:快应用中心(快应用中心怎么打开)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~