Sentinel|Sentinel Dashboard限流规则保存方式
Sentinel Dashboard限流规则保存
sentinel在限流规则配置方面提供了可视化页面 sentinel dashboard,源码可从github下载,请自行搜索,此处不提供下载链接。
规则持久化后首先触发GatewayFlowRuleController(源码似乎没有,请参考普通规则改造)的/new.json(或)请求,方法会调用publishRules()将本次编辑规则组装后通过远程调用请求gateway/updateRules更新远程服务内存中限流规则,该接口由远程服务UpdateGatewayRuleCommandHandler提供。
【Sentinel|Sentinel Dashboard限流规则保存方式】UpdateGatewayRuleCommandHandler接收到请求通过调用handle方法,方法通过
SetflowRules = (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', 'AuthorityRuleService', '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> {@Autowiredprivate ConfigService configService; @Autowiredprivate Converter> converter; @Overridepublic 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> { @Autowiredprivate ConfigService configService; @Autowiredprivate Converter
, String> converter; @Overridepublic 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 { @Beanpublic Converter, String> flowRuleEntityEncoder() {return JSON::toJSONString; }@Beanpublic Converter> flowRuleEntityDecoder() {return s -> JSON.parseArray(s, FlowRuleEntity.class); }@Beanpublic Converter
, String> degradeRuleEntityEncoder() {return JSON::toJSONString; }@Beanpublic Converter> degradeRuleEntityDecoder() {return s -> JSON.parseArray(s, DegradeRuleEntity.class); }@Beanpublic 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_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
将
@Autowired@Qualifier("flowRuleDefaultProvider")private DynamicRuleProvider> ruleProvider; @Autowired@Qualifier("flowRuleDefaultPublisher")private DynamicRulePublisher
> rulePublisher;
改为:
@Autowired@Qualifier("flowRuleNacosProvider")private DynamicRuleProvider> ruleProvider; @Autowired@Qualifier("flowRuleNacosPublisher")private DynamicRulePublisher
> rulePublisher;
然后启动之后就可以测试了
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Guava|Guava RateLimiter与限流算法
- 【SpringCloud-Alibaba系列教程】8.一文学会使用sentinel
- Sentinel源码学习
- Dashboard|Dashboard Layouts and Formatting
- (三十)java版spring|(三十)java版spring cloud+spring boot+redis多租户社交电子商务平台- gateway限流
- 微服务组件之限流器与熔断器
- RabbitMQ 如何对消费端限流()
- SpringCloud浅尝(九)——Hystrix Dashboard
- Redis|Redis实现Sentinel哨兵模式
- 限流- Resilience4j-AtomicRateLimiter