赞
踩
官方参考文档:
动态规则扩展 · alibaba/Sentinel Wiki · GitHub
需要修改的代码如下:
为了便于后续版本集成nacos,简单讲一下集成思路
1.更改pom
修改sentinel-datasource-nacos的范围
将
- <dependency>
- <groupId>com.alibaba.csp</groupId>
- <artifactId>sentinel-datasource-nacos</artifactId>
- <scope>test</scope>
- </dependency>
改为
- <dependency>
- <groupId>com.alibaba.csp</groupId>
- <artifactId>sentinel-datasource-nacos</artifactId>
- <!--<scope>test</scope>-->
- </dependency>
2.拷贝示例
将test目录下的com.alibaba.csp.sentinel.dashboard.rule.nacos包下的内容拷贝到src的 com.alibaba.csp.sentinel.dashboard.rule的目录
test目录只包含限流,其他规则参照创建即可。
创建时注意修改常量,并且在NacosConfig实现各种converter
注意:授权规则和热点规则需要特殊处理,否则nacos配置不生效。
因为授权规则Entity比流控规则Entity多包了一层。
- public class FlowRuleEntity implements RuleEntity
- public class AuthorityRuleEntity extends AbstractRuleEntity<AuthorityRule>
以授权规则为例
AuthorityRuleNacosProvider.java
- /*
- * Copyright 1999-2018 Alibaba Group Holding Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package com.alibaba.csp.sentinel.dashboard.rule.nacos.authority;
-
- import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
- import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
- import com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil;
- import com.alibaba.csp.sentinel.datasource.Converter;
- import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
- import com.alibaba.csp.sentinel.util.StringUtil;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.nacos.api.config.ConfigService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
-
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * @author Eric Zhao
- * @since 1.4.0
- */
- @Component("authorityRuleNacosProvider")
- public class AuthorityRuleNacosProvider implements DynamicRuleProvider<List<AuthorityRuleEntity>> {
-
- @Autowired
- private ConfigService configService;
- @Autowired
- private Converter<String, List<AuthorityRuleEntity>> converter;
-
- @Override
- public List<AuthorityRuleEntity> getRules(String appName) throws Exception {
- String rules = configService.getConfig(appName + NacosConfigUtil.AUTHORITY_DATA_ID_POSTFIX,
- NacosConfigUtil.GROUP_ID, 3000);
- if (StringUtil.isEmpty(rules)) {
- return new ArrayList<>();
- }
- return converter.convert(this.parseRules(rules));
- }
-
- private String parseRules(String rules) {
- JSONArray newRuleJsons = new JSONArray();
- JSONArray ruleJsons = JSONArray.parseArray(rules);
- for (int i = 0; i < ruleJsons.size(); i++) {
- JSONObject ruleJson = ruleJsons.getJSONObject(i);
- AuthorityRuleEntity ruleEntity = JSON.parseObject(ruleJson.toJSONString(), AuthorityRuleEntity.class);
- JSONObject newRuleJson = JSON.parseObject(JSON.toJSONString(ruleEntity));
- AuthorityRule rule = JSON.parseObject(ruleJson.toJSONString(), AuthorityRule.class);
- newRuleJson.put("rule", rule);
- newRuleJsons.add(newRuleJson);
- }
- return newRuleJsons.toJSONString();
- }
- }

AuthorityRuleNacosPublisher.java
- /*
- * Copyright 1999-2018 Alibaba Group Holding Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package com.alibaba.csp.sentinel.dashboard.rule.nacos.authority;
-
- import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
- import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
- import com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil;
- import com.alibaba.csp.sentinel.datasource.Converter;
- import com.alibaba.csp.sentinel.util.AssertUtil;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.nacos.api.config.ConfigService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
-
- import java.util.List;
-
- /**
- * @author Eric Zhao
- * @since 1.4.0
- */
- @Component("authorityRuleNacosPublisher")
- public class AuthorityRuleNacosPublisher implements DynamicRulePublisher<List<AuthorityRuleEntity>> {
-
- @Autowired
- private ConfigService configService;
- @Autowired
- private Converter<List<AuthorityRuleEntity>, String> converter;
-
- @Override
- public void publish(String app, List<AuthorityRuleEntity> rules) throws Exception {
- AssertUtil.notEmpty(app, "app name cannot be empty");
- if (rules == null) {
- return;
- }
- configService.publishConfig(app + NacosConfigUtil.AUTHORITY_DATA_ID_POSTFIX,
- NacosConfigUtil.GROUP_ID, this.parseRules(converter.convert(rules)));
- }
-
- private String parseRules(String rules) {
- JSONArray oldRuleJsons = JSONArray.parseArray(rules);
- for (int i = 0; i < oldRuleJsons.size(); i++) {
- JSONObject oldRuleJson = oldRuleJsons.getJSONObject(i);
- JSONObject ruleJson = oldRuleJson.getJSONObject("rule");
- oldRuleJson.putAll(ruleJson);
- oldRuleJson.remove("rule");
- }
- return oldRuleJsons.toJSONString();
- }
- }

热点规则同理
3.修改controller
v2目录的FlowControllerV2
将
- @Autowired
- @Qualifier("flowRuleDefaultProvider")
- private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
- @Autowired
- @Qualifier("flowRuleDefaultPublisher")
- private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
改为
- @Autowired
- @Qualifier("flowRuleNacosProvider")
- private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
- @Autowired
- @Qualifier("flowRuleNacosPublisher")
- private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
controller目录的其他controller包括
AuthorityRuleController DegradeController FlowControllerV1 ParamFlowRuleController SystemController
做如下更改(以DegradeController为例)
将
- @Autowired
- private SentinelApiClient sentinelApiClient;
改成
- @Autowired
- @Qualifier("degradeRuleNacosProvider")
- private DynamicRuleProvider<List<DegradeRuleEntity>> ruleProvider;
- @Autowired
- @Qualifier("degradeRuleNacosPublisher")
- private DynamicRulePublisher<List<DegradeRuleEntity>> rulePublisher;
将原有publishRules方法删除,统一改成
- private void publishRules(/*@NonNull*/ String app) throws Exception {
- List<DegradeRuleEntity> rules = repository.findAllByApp(app);
- rulePublisher.publish(app, rules);
- }
之后解决报错的地方即可。
获取所有rules的地方
将
List<DegradeRuleEntity> rules = sentinelApiClient.fetchDegradeRuleOfMachine(app, ip, port);
改成
List<DegradeRuleEntity> rules = ruleProvider.getRules(app);
原有调用publishRules方法的地方,删除掉
在上一个try catch方法里加上
publishRules(entity.getApp());
这里的entity.getApp()也有可能是oldEntity.getApp()/app等变量。根据删除的publishRules代码片段推测即可。
4.修改前端文件
文件路径:src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html
将
<a ui-sref="dashboard.flowV1({app: entry.app})">
改成
<a ui-sref="dashboard.flow({app: entry.app})">
5.最后打包即可
执行命令打包成jar
mvn clean package
运行方法与官方jar一致,不做赘述
6.微服务程序集成
pom.xml添加
- <dependency>
- <groupId>com.alibaba.csp</groupId>
- <artifactId>sentinel-datasource-nacos</artifactId>
- </dependency>
配置文件application.yml添加
spring: cloud: sentinel: datasource: # 名称随意 flow: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-flow-rules groupId: SENTINEL_GROUP # 规则类型,取值见: # org.springframework.cloud.alibaba.sentinel.datasource.RuleType rule-type: flow degrade: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-degrade-rules groupId: SENTINEL_GROUP rule-type: degrade system: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-system-rules groupId: SENTINEL_GROUP rule-type: system authority: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-authority-rules groupId: SENTINEL_GROUP rule-type: authority param-flow: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-param-flow-rules groupId: SENTINEL_GROUP rule-type: param-flow
7.测试验证
在sentinel控制台界面添加几个流控规则后尝试关闭微服务和sentinel,然后重新打开sentinel和微服务,看流控规则是否还在。
8.最后把配置好的代码发给大家,大家可以自行下载,里边有运行访问流程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。