# sentinel-dashboard-nacos
**Repository Path**: luojian8848/sentinel-dashboard-nacos
## Basic Information
- **Project Name**: sentinel-dashboard-nacos
- **Description**: Sentinel数据源永久化到Nacos,源码改造,当前版本1.8.6
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2023-07-31
- **Last Updated**: 2023-07-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Sentinel数据持久化到Nacos,源码改造
- 下载 [Sentinel源码](https://github.com/alibaba/Sentinel)
- module目录:sentinel-dashboard
- 改造版本:1.8.6
# 改造结果

# 一、文件拷贝进项目
```
com.alibaba.csp.sentinel.dashboard.rule
└─nacos
│ NacosConfig.java
│ NacosConfigUtil.java
│
├─authority
│ AuthorityRuleNacosProvider.java
│ AuthorityRuleNacosPublisher.java
│
├─degrade
│ DegradeRuleNacosProvider.java
│ DegradeRuleNacosPublisher.java
│
├─flow
│ FlowRuleNacosProvider.java
│ FlowRuleNacosPublisher.java
│
├─gateway
│ ├─api
│ │ GatewayApiNacosProvider.java
│ │ GatewayApiNacosPublisher.java
│ │
│ └─flow
│ GatewayFlowRuleNacosProvider.java
│ GatewayFlowRuleNacosPublisher.java
│
├─param
│ ParamFlowRuleNacosProvider.java
│ ParamFlowRuleNacosPublisher.java
│
└─system
SystemRuleNacosProvider.java
SystemRuleNacosPublisher.java
```
# 二、改造变动
## 1、依赖改动
### 1.1、sentinel-dashboard下的pom.xml,新增依赖
```
com.alibaba.nacos
nacos-api
1.4.2
```
### 1.2、 移除 sentinel-datasource-nacos依赖的test
```
com.alibaba.csp
sentinel-datasource-nacos
```
## 2、规则改造
## 2.1、流控规则改造
### 2.1.1、sidebar.html改造
```
流控规则
改为
流控规则
```
### 2.1.2、修改"flowRuleDefaultProvider"与"flowRuleDefaultPublisher"
```
@RestController
@RequestMapping(value = "/v2/flow")
public class FlowControllerV2 {
...
//@Autowired
//private InMemoryRuleRepositoryAdapter repository;
@Autowired
private RuleRepository repository;
@Autowired
// @Qualifier("flowRuleDefaultProvider")
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
// @Qualifier("flowRuleDefaultPublisher")
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
...
```
## 2.2、熔断规则改造
```
public class DegradeController {
private final Logger logger = LoggerFactory.getLogger(DegradeController.class);
@Autowired
@Qualifier("degradeRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
@Qualifier("degradeRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
//@Autowired
//private SentinelApiClient sentinelApiClient;
...
@GetMapping("/rules.json")
@AuthAction(PrivilegeType.READ_RULE)
public Result> apiQueryMachineRules(String app, String ip, Integer port) {
...
// List rules = sentinelApiClient.fetchDegradeRuleOfMachine(app, ip, port);
List rules = ruleProvider.getRules(app);
...
}
private boolean publishRules(String app, String ip, Integer port) {
//List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
//return sentinelApiClient.setDegradeRuleOfMachine(app, ip, port, rules);
List rules = repository.findAllByApp(app);
try {
rulePublisher.publish(app, rules);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
```
## 2.3、热点规则改造
```
public class ParamFlowRuleController {
...
@Autowired
@Qualifier("paramFlowRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
@Qualifier("paramFlowRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
//@Autowired
//private SentinelApiClient sentinelApiClient;
@GetMapping("/rules")
@AuthAction(PrivilegeType.READ_RULE)
public Result> apiQueryAllRulesForMachine(@RequestParam String app,
@RequestParam String ip,
@RequestParam Integer port) {
...
//return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port)
// .thenApply(repository::saveAll)
// .thenApply(Result::ofSuccess)
// .get();
List rules = ruleProvider.getRules(app);
rules = repository.saveAll(rules);
return Result.ofSuccess(rules);
...
}
@PostMapping("/rule")
@AuthAction(AuthService.PrivilegeType.WRITE_RULE)
public Result apiAddParamFlowRule(@RequestBody ParamFlowRuleEntity entity) {
...
//publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get();
publishRules(entity.getApp(), entity.getIp(), entity.getPort());
...
}
...
@PutMapping("/rule/{id}")
@AuthAction(AuthService.PrivilegeType.WRITE_RULE)
public Result apiUpdateParamFlowRule(@PathVariable("id") Long id,
@RequestBody ParamFlowRuleEntity entity) {
...
entity = repository.save(entity);
//publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get();
publishRules(entity.getApp(), entity.getIp(), entity.getPort());
...
}
...
@DeleteMapping("/rule/{id}")
@AuthAction(PrivilegeType.DELETE_RULE)
public Result apiDeleteRule(@PathVariable("id") Long id) {
...
//publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get();
publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort());
...
}
...
// private CompletableFuture publishRules(String app, String ip, Integer port) {
// List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
// return sentinelApiClient.setParamFlowRuleOfMachine(app, ip, port, rules);
// }
private void publishRules(String app, String ip, Integer port) throws Exception {
List rules = repository.findAllByApp(app);
rulePublisher.publish(app, rules);
}
}
```
## 2.4、系统规则改造
```
public class SystemController {
...
@Autowired
@Qualifier("systemRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
@Qualifier("systemRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
//@Autowired
//private SentinelApiClient sentinelApiClient;
@GetMapping("/rules.json")
@AuthAction(PrivilegeType.READ_RULE)
public Result> apiQueryMachineRules(String app, String ip,
Integer port) {
...
//List rules = sentinelApiClient.fetchSystemRuleOfMachine(app, ip, port);
List rules = ruleProvider.getRules(app);
...
}
private boolean publishRules(String app, String ip, Integer port) {
//List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
//return sentinelApiClient.setSystemRuleOfMachine(app, ip, port, rules);
List rules = repository.findAllByApp(app);
try {
rulePublisher.publish(app, rules);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
```
## 2.5、授权规则改造
```
@RestController
@RequestMapping(value = "/authority")
public class AuthorityRuleController {
...
@Autowired
@Qualifier("authorityRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
@Qualifier("authorityRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
// @Autowired
// private SentinelApiClient sentinelApiClient;
...
@GetMapping("/rules")
@AuthAction(PrivilegeType.READ_RULE)
public Result> apiQueryAllRulesForMachine(@RequestParam String app,
@RequestParam String ip,
@RequestParam Integer port) {
...
//List rules = sentinelApiClient.fetchAuthorityRulesOfMachine(app, ip, port);
List rules = ruleProvider.getRules(app);
...
}
private boolean publishRules(String app, String ip, Integer port) {
//List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
//return sentinelApiClient.setAuthorityRuleOfMachine(app, ip, port, rules);
List rules = repository.findAllByApp(app);
try {
rulePublisher.publish(app, rules);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
```
## 2.6 gateway api分组改造
```
public class GatewayApiController {
...
@Autowired
@Qualifier("gatewayApiGroupNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
@Qualifier("gatewayApiGroupNacosPublisher")
private DynamicRulePublisher> rulePublisher;
// @Autowired
// private SentinelApiClient sentinelApiClient;
@GetMapping("/list.json")
@AuthAction(AuthService.PrivilegeType.READ_RULE)
public Result> queryApis(String app, String ip, Integer port) {
...
//List apis = sentinelApiClient.fetchApis(app, ip, port).get();
List apis = ruleProvider.getRules(app);
repository.saveAll(apis);
...
}
private boolean publishApis(String app, String ip, Integer port) {
//List apis = repository.findAllByMachine(MachineInfo.of(app, ip, port));
//return sentinelApiClient.modifyApis(app, ip, port, apis);
List rules = repository.findAllByApp(app);
try {
rulePublisher.publish(app, rules);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
```
## 2.7 gateway 流控规则改造
```
public class GatewayFlowRuleController {
...
@Autowired
private InMemGatewayFlowRuleStore repository;
@Autowired
@Qualifier("gatewayFlowRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
@Qualifier("gatewayFlowRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
// @Autowired
// private SentinelApiClient sentinelApiClient;
@GetMapping("/list.json")
@AuthAction(AuthService.PrivilegeType.READ_RULE)
public Result> queryFlowRules(String app, String ip, Integer port) {
...
//List rules = sentinelApiClient.fetchGatewayFlowRules(app, ip, port).get();
List rules = ruleProvider.getRules(app);
repository.saveAll(rules);
...
}
private boolean publishRules(String app, String ip, Integer port) {
// List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
// return sentinelApiClient.modifyGatewayFlowRules(app, ip, port, rules);
List rules = repository.findAllByApp(app);
try {
rulePublisher.publish(app, rules);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
```
三、添加application.properties配置
```
server.port=8080
nacos.server-addr=127.0.0.1:8848
nacos.namespace=public
nacos.group=DEFAULT_GROUP
nacos.username=nacos
nacos.password=nacos
```
四、自动填充账号密码
- id="username"
- id="password"
```
```
五、 SpringCloud Sentinel 配置
```
spring:
cloud:
# 配置Sentinel流控
sentinel:
namespace: Sentinel-Dev
enabled: true # 自动化配置是否生效
eager: true # 禁用控制台懒加载
transport:
dashboard: localhost:20010 #配置Sentinel dashboard地址
client-ip: ${spring.cloud.client.ip-address} # 获取本机IP地址
port: 8719 #默认8719端口,如果被占用会向上扫描。
# Nacos 持久化配置规则
datasource:
# rule-type类型在com.alibaba.cloud.sentinel.datasource.RuleType 中查找
# gateway APi 分组
gw-api-group:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-gw-api-group-rules
rule-type: gw-api-group
# gateway 流控规则
gw-flow:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-gw-flow-rules
rule-type: gw-flow
# 流控规则
flow:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-flow-rules
rule-type: flow
# 熔断降级
degrade:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-degrade-rules
rule-type: degrade
# 热点规则
param-flow:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-param-flow-rules
rule-type: param-flow
# 系统规则
system:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-system-rules
rule-type: system
# 授权规则
authority:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
username: ${spring.cloud.nacos.config.username}
password: ${spring.cloud.nacos.config.password}
namespace: ${spring.cloud.sentinel.namespace}
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-authority-rules
rule-type: authority
```