官方参考文档:
动态规则扩展 · 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.最后把配置好的代码发给大家,大家可以自行下载,里边有运行访问流程
https://download.csdn.net/download/qq_34091529/88482757