From 3a74cf60642d1e0c4882c0cd647348685f145450 Mon Sep 17 00:00:00 2001
From: KLB <2873208363@qq.com>
Date: Mon, 21 Jul 2025 20:14:20 +0800
Subject: [PATCH] =?UTF-8?q?=E7=94=A8nacos=E5=AE=9E=E7=8E=B0=E4=BA=86?=
=?UTF-8?q?=E8=A7=84=E5=88=99=E7=9A=84=E6=8C=81=E4=B9=85=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sentinel-dashboard/pom.xml | 24 ++++
.../dashboard/DashboardApplication.java | 2 +
.../dashboard/controller/AppController.java | 19 ++--
.../controller/AuthorityRuleController.java | 64 +++++++----
.../controller/DegradeController.java | 53 ++++-----
.../dashboard/controller/DemoController.java | 15 ++-
.../controller/FlowControllerV1.java | 62 +++++++----
.../controller/MachineRegistryController.java | 4 +-
.../controller/MetricController.java | 18 +--
.../controller/ParamFlowRuleController.java | 104 ++++++++++--------
.../controller/ResourceController.java | 12 +-
.../controller/SystemController.java | 54 +++++++--
.../controller/VersionController.java | 1 -
.../cluster/ClusterAssignController.java | 19 ++--
.../cluster/ClusterConfigController.java | 27 ++---
.../gateway/GatewayFlowRuleController.java | 2 +-
.../controller/v2/FlowControllerV2.java | 27 ++---
.../nacos/AuthorityRuleNacosProvider.java | 33 ++++++
.../nacos/AuthorityRuleNacosPublisher.java | 28 +++++
.../nacos/ClusterFlowRuleNacosProvider.java | 37 +++++++
.../nacos/ClusterFlowRuleNacosPublisher.java | 32 ++++++
.../rule/nacos/DegradeRuleNacosProvider.java | 33 ++++++
.../rule/nacos/DegradeRuleNacosPublisher.java | 28 +++++
.../rule/nacos/FlowRuleNacosProvider.java | 33 ++++++
.../rule/nacos/FlowRuleNacosPublisher.java | 28 +++++
.../dashboard/rule/nacos/NacosConfig.java | 44 ++++++++
.../nacos/ParamFlowRuleNacosProvider.java | 33 ++++++
.../nacos/ParamFlowRuleNacosPublisher.java | 28 +++++
.../rule/nacos/SystemRuleNacosProvider.java | 33 ++++++
.../rule/nacos/SystemRuleNacosPublisher.java | 28 +++++
.../src/main/resources/application.properties | 9 +-
31 files changed, 723 insertions(+), 211 deletions(-)
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosProvider.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosPublisher.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosProvider.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosPublisher.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosProvider.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosPublisher.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosProvider.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosPublisher.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfig.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosProvider.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosPublisher.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosProvider.java
create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosPublisher.java
diff --git a/sentinel-dashboard/pom.xml b/sentinel-dashboard/pom.xml
index 78e3d3051c..30c9bc69f4 100644
--- a/sentinel-dashboard/pom.xml
+++ b/sentinel-dashboard/pom.xml
@@ -18,7 +18,31 @@
4.0.1
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ 2020.0.6
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ 2021.1
+ pom
+ import
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
com.alibaba.csp
sentinel-core
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
index f748646262..706626ba7c 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
@@ -19,6 +19,7 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* Sentinel dashboard application.
@@ -26,6 +27,7 @@
* @author Carpenter Lee
*/
@SpringBootApplication
+@EnableDiscoveryClient
public class DashboardApplication {
public static void main(String[] args) {
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java
index 635489661e..d0663be8ad 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java
@@ -15,24 +15,19 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
import com.alibaba.csp.sentinel.dashboard.discovery.AppInfo;
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.domain.vo.MachineInfoVo;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
/**
* @author Carpenter Lee
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java
index df6c90e53a..156ff3168b 100644
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java
@@ -15,33 +15,26 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.Date;
-import java.util.List;
-
import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
-import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
-import com.alibaba.csp.sentinel.slots.block.RuleConstant;
-import com.alibaba.csp.sentinel.util.StringUtil;
-
-import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
-
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
/**
* @author Eric Zhao
@@ -53,6 +46,16 @@ public class AuthorityRuleController {
private final Logger logger = LoggerFactory.getLogger(AuthorityRuleController.class);
+ // === 新增:注入 Nacos Provider/Publisher ===
+ @Autowired
+ @Qualifier("authorityRuleNacosProvider")
+ private DynamicRuleProvider> ruleProvider;
+
+ @Autowired
+ @Qualifier("authorityRuleNacosPublisher")
+ private DynamicRulePublisher> rulePublisher;
+ // === 新增结束 ===
+
@Autowired
private SentinelApiClient sentinelApiClient;
@Autowired
@@ -78,7 +81,8 @@ public Result> apiQueryAllRulesForMachine(@RequestPara
return Result.ofFail(-1, "given ip does not belong to given app");
}
try {
- List rules = sentinelApiClient.fetchAuthorityRulesOfMachine(app, ip, port);
+ // === 修改:从 Nacos 获取规则 ===
+ List rules = ruleProvider.getRules(app);
rules = repository.saveAll(rules);
return Result.ofSuccess(rules);
} catch (Throwable throwable) {
@@ -129,6 +133,11 @@ public Result apiAddAuthorityRule(@RequestBody AuthorityRul
entity.setGmtModified(date);
try {
entity = repository.save(entity);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
} catch (Throwable throwable) {
logger.error("Failed to add authority rule", throwable);
return Result.ofThrowable(-1, throwable);
@@ -159,6 +168,11 @@ public Result apiUpdateParamFlowRule(@PathVariable("id") Lo
if (entity == null) {
return Result.ofFail(-1, "Failed to save authority rule");
}
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
} catch (Throwable throwable) {
logger.error("Failed to save authority rule", throwable);
return Result.ofThrowable(-1, throwable);
@@ -181,6 +195,11 @@ public Result apiDeleteRule(@PathVariable("id") Long id) {
}
try {
repository.delete(id);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(oldEntity.getApp());
+ // === 新增结束 ===
+
} catch (Exception e) {
return Result.ofFail(-1, e.getMessage());
}
@@ -194,4 +213,11 @@ 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);
}
+
+ // === 新增:发布规则到 Nacos 的方法 ===
+ private void publishRulesToNacos(String app) throws Exception {
+ List rules = repository.findAllByApp(app);
+ rulePublisher.publish(app, rules);
+ }
+ // === 新增结束 ===
}
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java
index 4668f55caa..b3a467e2f7 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java
@@ -15,33 +15,27 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.Date;
-import java.util.List;
-
import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
-import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreakerStrategy;
import com.alibaba.csp.sentinel.util.StringUtil;
-
-import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;
-import com.alibaba.csp.sentinel.dashboard.domain.Result;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
/**
* Controller regarding APIs of degrade rules. Refactored since 1.8.0.
@@ -55,6 +49,14 @@ 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 RuleRepository repository;
@Autowired
@@ -78,7 +80,7 @@ public Result> apiQueryMachineRules(String app, String i
return Result.ofFail(-1, "given ip does not belong to given app");
}
try {
- List rules = sentinelApiClient.fetchDegradeRuleOfMachine(app, ip, port);
+ List rules = ruleProvider.getRules(app);
rules = repository.saveAll(rules);
return Result.ofSuccess(rules);
} catch (Throwable throwable) {
@@ -99,13 +101,11 @@ public Result apiAddRule(@RequestBody DegradeRuleEntity entit
entity.setGmtModified(date);
try {
entity = repository.save(entity);
+ publishRulesToNacos(entity.getApp());
} catch (Throwable t) {
logger.error("Failed to add new degrade rule, app={}, ip={}", entity.getApp(), entity.getIp(), t);
return Result.ofThrowable(-1, t);
}
- if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
- logger.warn("Publish degrade rules failed, app={}", entity.getApp());
- }
return Result.ofSuccess(entity);
}
@@ -133,13 +133,11 @@ public Result apiUpdateRule(@PathVariable("id") Long id,
entity.setGmtModified(new Date());
try {
entity = repository.save(entity);
+ publishRulesToNacos(entity.getApp());
} catch (Throwable t) {
logger.error("Failed to save degrade rule, id={}, rule={}", id, entity, t);
return Result.ofThrowable(-1, t);
}
- if (!publishRules(entity.getApp(), entity.getIp(), entity.getPort())) {
- logger.warn("Publish degrade rules failed, app={}", entity.getApp());
- }
return Result.ofSuccess(entity);
}
@@ -157,13 +155,11 @@ public Result delete(@PathVariable("id") Long id) {
try {
repository.delete(id);
+ publishRulesToNacos(oldEntity.getApp());
} catch (Throwable throwable) {
logger.error("Failed to delete degrade rule, id={}", id, throwable);
return Result.ofThrowable(-1, throwable);
}
- if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {
- logger.warn("Publish degrade rules failed, app={}", oldEntity.getApp());
- }
return Result.ofSuccess(id);
}
@@ -172,6 +168,11 @@ private boolean publishRules(String app, String ip, Integer port) {
return sentinelApiClient.setDegradeRuleOfMachine(app, ip, port, rules);
}
+ private void publishRulesToNacos(String app) throws Exception {
+ List rules = repository.findAllByApp(app);
+ rulePublisher.publish(app, rules);
+ }
+
private Result checkEntityInternal(DegradeRuleEntity entity) {
if (StringUtil.isBlank(entity.getApp())) {
return Result.ofFail(-1, "app can't be blank");
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java
index cb4fb67a9f..9e1168dd79 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DemoController.java
@@ -15,9 +15,11 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
+import com.alibaba.csp.sentinel.Entry;
+import com.alibaba.csp.sentinel.EntryType;
+import com.alibaba.csp.sentinel.SphU;
+import com.alibaba.csp.sentinel.context.ContextUtil;
+import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
@@ -25,11 +27,8 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
-import com.alibaba.csp.sentinel.Entry;
-import com.alibaba.csp.sentinel.EntryType;
-import com.alibaba.csp.sentinel.SphU;
-import com.alibaba.csp.sentinel.context.ContextUtil;
-import com.alibaba.csp.sentinel.slots.block.BlockException;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
@Controller
@RequestMapping(value = "/demo", produces = MediaType.APPLICATION_JSON_VALUE)
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java
index 3806fd76ac..73dff57c25 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/FlowControllerV1.java
@@ -15,34 +15,28 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
-import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
-import com.alibaba.csp.sentinel.util.StringUtil;
-
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;
-
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
/**
* Flow rule controller.
@@ -56,6 +50,16 @@ public class FlowControllerV1 {
private final Logger logger = LoggerFactory.getLogger(FlowControllerV1.class);
+ // === 新增:注入 Nacos Provider/Publisher ===
+ @Autowired
+ @Qualifier("flowRuleNacosProvider")
+ private DynamicRuleProvider> ruleProvider;
+
+ @Autowired
+ @Qualifier("flowRuleNacosPublisher")
+ private DynamicRulePublisher> rulePublisher;
+ // === 新增结束 ===
+
@Autowired
private InMemoryRuleRepositoryAdapter repository;
@Autowired
@@ -82,7 +86,8 @@ public Result> apiQueryMachineRules(@RequestParam String ap
return Result.ofFail(-1, "given ip does not belong to given app");
}
try {
- List rules = sentinelApiClient.fetchFlowRuleOfMachine(app, ip, port);
+ // === 修改:从 Nacos 获取规则 ===
+ List rules = ruleProvider.getRules(app);
rules = repository.saveAll(rules);
return Result.ofSuccess(rules);
} catch (Throwable throwable) {
@@ -157,6 +162,10 @@ public Result apiAddFlowRule(@RequestBody FlowRuleEntity entity)
try {
entity = repository.save(entity);
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS);
return Result.ofSuccess(entity);
} catch (Throwable t) {
@@ -236,6 +245,10 @@ public Result apiUpdateFlowRule(Long id, String app,
return Result.ofFail(-1, "save entity fail: null");
}
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS);
return Result.ofSuccess(entity);
} catch (Throwable t) {
@@ -264,6 +277,10 @@ public Result apiDeleteFlowRule(Long id) {
return Result.ofFail(-1, e.getMessage());
}
try {
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(oldEntity.getApp());
+ // === 新增结束 ===
+
publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get(5000, TimeUnit.MILLISECONDS);
return Result.ofSuccess(id);
} catch (Throwable t) {
@@ -274,6 +291,13 @@ public Result apiDeleteFlowRule(Long id) {
}
}
+ // === 新增:发布规则到 Nacos 的方法 ===
+ private void publishRulesToNacos(String app) throws Exception {
+ List rules = repository.findAllByApp(app);
+ rulePublisher.publish(app, rules);
+ }
+ // === 新增结束 ===
+
private CompletableFuture publishRules(String app, String ip, Integer port) {
List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
return sentinelApiClient.setFlowRuleOfMachineAsync(app, ip, port, rules);
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
index 53e5c024b4..d6a362e56c 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MachineRegistryController.java
@@ -16,11 +16,9 @@
package com.alibaba.csp.sentinel.dashboard.controller;
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
-import com.alibaba.csp.sentinel.util.StringUtil;
-
import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
-
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.apache.http.conn.util.InetAddressUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java
index ab90c0fc53..122ddc29b0 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/MetricController.java
@@ -15,17 +15,11 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.dashboard.domain.vo.MetricVo;
import com.alibaba.csp.sentinel.dashboard.repository.metric.MetricsRepository;
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -34,10 +28,8 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
-import com.alibaba.csp.sentinel.util.StringUtil;
-
-import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;
-import com.alibaba.csp.sentinel.dashboard.domain.vo.MetricVo;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
/**
* @author leyou
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java
index 513b44dd58..701ab23bf9 100644
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java
@@ -15,39 +15,32 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
+import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
import com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException;
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
-import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
-import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
-import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
-import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
-import com.alibaba.csp.sentinel.slots.block.RuleConstant;
-import com.alibaba.csp.sentinel.util.StringUtil;
import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
import com.alibaba.csp.sentinel.dashboard.util.VersionUtils;
-
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
/**
* @author Eric Zhao
@@ -59,20 +52,30 @@ public class ParamFlowRuleController {
private final Logger logger = LoggerFactory.getLogger(ParamFlowRuleController.class);
+ // === 新增:注入 Nacos Provider/Publisher ===
@Autowired
- private SentinelApiClient sentinelApiClient;
+ @Qualifier("paramFlowRuleNacosProvider")
+ private DynamicRuleProvider> ruleProvider;
+
@Autowired
- private AppManagement appManagement;
+ @Qualifier("paramFlowRuleNacosPublisher")
+ private DynamicRulePublisher> rulePublisher;
+ // === 新增结束 ===
+
@Autowired
private RuleRepository repository;
+ @Autowired
+ private SentinelApiClient sentinelApiClient;
+ @Autowired
+ private AppManagement appManagement;
private boolean checkIfSupported(String app, String ip, int port) {
try {
return Optional.ofNullable(appManagement.getDetailApp(app))
- .flatMap(e -> e.getMachine(ip, port))
- .flatMap(m -> VersionUtils.parseVersion(m.getVersion())
- .map(v -> v.greaterOrEqual(version020)))
- .orElse(true);
+ .flatMap(e -> e.getMachine(ip, port))
+ .flatMap(m -> VersionUtils.parseVersion(m.getVersion())
+ .map(v -> v.greaterOrEqual(version020)))
+ .orElse(true);
// If error occurred or cannot retrieve machine info, return true.
} catch (Exception ex) {
return true;
@@ -100,17 +103,10 @@ public Result> apiQueryAllRulesForMachine(@RequestPara
return unsupportedVersion();
}
try {
- return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port)
- .thenApply(repository::saveAll)
- .thenApply(Result::ofSuccess)
- .get();
- } catch (ExecutionException ex) {
- logger.error("Error when querying parameter flow rules", ex.getCause());
- if (isNotSupported(ex.getCause())) {
- return unsupportedVersion();
- } else {
- return Result.ofThrowable(-1, ex.getCause());
- }
+ // === 修改:从 Nacos 获取规则 ===
+ List rules = ruleProvider.getRules(app);
+ rules = repository.saveAll(rules);
+ return Result.ofSuccess(rules);
} catch (Throwable throwable) {
logger.error("Error when querying parameter flow rules", throwable);
return Result.ofFail(-1, throwable.getMessage());
@@ -122,7 +118,7 @@ private boolean isNotSupported(Throwable ex) {
}
@PostMapping("/rule")
- @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+ @AuthAction(PrivilegeType.WRITE_RULE)
public Result apiAddParamFlowRule(@RequestBody ParamFlowRuleEntity entity) {
Result checkResult = checkEntityInternal(entity);
if (checkResult != null) {
@@ -138,6 +134,11 @@ public Result apiAddParamFlowRule(@RequestBody ParamFlowRul
entity.setGmtModified(date);
try {
entity = repository.save(entity);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get();
return Result.ofSuccess(entity);
} catch (ExecutionException ex) {
@@ -191,7 +192,7 @@ private Result checkEntityInternal(ParamFlowRuleEntity entity) {
}
@PutMapping("/rule/{id}")
- @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+ @AuthAction(PrivilegeType.WRITE_RULE)
public Result apiUpdateParamFlowRule(@PathVariable("id") Long id,
@RequestBody ParamFlowRuleEntity entity) {
if (id == null || id <= 0) {
@@ -215,6 +216,11 @@ public Result apiUpdateParamFlowRule(@PathVariable("id") Lo
entity.setGmtModified(date);
try {
entity = repository.save(entity);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get();
return Result.ofSuccess(entity);
} catch (ExecutionException ex) {
@@ -243,6 +249,11 @@ public Result apiDeleteRule(@PathVariable("id") Long id) {
try {
repository.delete(id);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(oldEntity.getApp());
+ // === 新增结束 ===
+
publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort()).get();
return Result.ofSuccess(id);
} catch (ExecutionException ex) {
@@ -263,10 +274,17 @@ private CompletableFuture publishRules(String app, String ip, Integer port
return sentinelApiClient.setParamFlowRuleOfMachine(app, ip, port, rules);
}
+ // === 新增:发布规则到 Nacos 的方法 ===
+ private void publishRulesToNacos(String app) throws Exception {
+ List rules = repository.findAllByApp(app);
+ rulePublisher.publish(app, rules);
+ }
+ // === 新增结束 ===
+
private Result unsupportedVersion() {
return Result.ofFail(4041,
- "Sentinel client not supported for parameter flow control (unsupported version or dependency absent)");
+ "Sentinel client not supported for parameter flow control (unsupported version or dependency absent)");
}
private final SentinelVersion version020 = new SentinelVersion().setMinorVersion(2);
-}
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java
index 70382c7eac..79ac2b1dd4 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java
@@ -15,17 +15,12 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import com.alibaba.csp.sentinel.util.StringUtil;
import com.alibaba.csp.sentinel.command.vo.NodeVo;
-
-import com.alibaba.csp.sentinel.dashboard.domain.ResourceTreeNode;
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
+import com.alibaba.csp.sentinel.dashboard.domain.ResourceTreeNode;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.domain.vo.ResourceVo;
-
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +28,9 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
* @author Carpenter Lee
*/
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java
index b3f3577ee3..f46e4a5eb8 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java
@@ -15,27 +15,28 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller;
-import java.util.Date;
-import java.util.List;
-
import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
-import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
-import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
-import com.alibaba.csp.sentinel.util.StringUtil;
-
+import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
import com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;
-import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
import com.alibaba.csp.sentinel.dashboard.domain.Result;
-
+import com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.util.Date;
+import java.util.List;
+
/**
* @author leyou(lihao)
*/
@@ -45,6 +46,16 @@ public class SystemController {
private final Logger logger = LoggerFactory.getLogger(SystemController.class);
+ // === 新增:注入 Nacos Provider/Publisher ===
+ @Autowired
+ @Qualifier("systemRuleNacosProvider")
+ private DynamicRuleProvider> ruleProvider;
+
+ @Autowired
+ @Qualifier("systemRuleNacosPublisher")
+ private DynamicRulePublisher> rulePublisher;
+ // === 新增结束 ===
+
@Autowired
private RuleRepository repository;
@Autowired
@@ -80,7 +91,8 @@ public Result> apiQueryMachineRules(String app, String ip
return checkResult;
}
try {
- List rules = sentinelApiClient.fetchSystemRuleOfMachine(app, ip, port);
+ // === 修改:从 Nacos 获取规则 ===
+ List rules = ruleProvider.getRules(app);
rules = repository.saveAll(rules);
return Result.ofSuccess(rules);
} catch (Throwable throwable) {
@@ -155,6 +167,11 @@ public Result apiAdd(String app, String ip, Integer port,
entity.setGmtModified(date);
try {
entity = repository.save(entity);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
} catch (Throwable throwable) {
logger.error("Add SystemRule error", throwable);
return Result.ofThrowable(-1, throwable);
@@ -217,6 +234,11 @@ public Result apiUpdateIfNotNull(Long id, String app, Double h
entity.setGmtModified(date);
try {
entity = repository.save(entity);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(entity.getApp());
+ // === 新增结束 ===
+
} catch (Throwable throwable) {
logger.error("save error:", throwable);
return Result.ofThrowable(-1, throwable);
@@ -239,6 +261,11 @@ public Result> delete(Long id) {
}
try {
repository.delete(id);
+
+ // === 新增:发布到 Nacos ===
+ publishRulesToNacos(oldEntity.getApp());
+ // === 新增结束 ===
+
} catch (Throwable throwable) {
logger.error("delete error:", throwable);
return Result.ofThrowable(-1, throwable);
@@ -253,4 +280,11 @@ 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);
}
+
+ // === 新增:发布规则到 Nacos 的方法 ===
+ private void publishRulesToNacos(String app) throws Exception {
+ List rules = repository.findAllByApp(app);
+ rulePublisher.publish(app, rules);
+ }
+ // === 新增结束 ===
}
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java
index 69d66ea134..a8d01ab85a 100644
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/VersionController.java
@@ -17,7 +17,6 @@
import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.util.StringUtil;
-
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java
index dc2e14f5b3..2f85f53934 100644
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterAssignController.java
@@ -15,24 +15,19 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller.cluster;
-import java.util.Collections;
-import java.util.Set;
-
-import com.alibaba.csp.sentinel.util.StringUtil;
-
-import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppFullAssignRequest;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppAssignResultVO;
+import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppFullAssignRequest;
import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterAppSingleServerAssignRequest;
import com.alibaba.csp.sentinel.dashboard.service.ClusterAssignService;
-import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collections;
+import java.util.Set;
/**
* @author Eric Zhao
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java
index e9b9aed0e4..468c79d602 100644
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java
@@ -15,18 +15,11 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller.cluster;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-
import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
import com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException;
-import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
-import com.alibaba.csp.sentinel.util.StringUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-
import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;
+import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest;
import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterModifyRequest;
import com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest;
@@ -37,17 +30,17 @@
import com.alibaba.csp.sentinel.dashboard.service.ClusterConfigService;
import com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils;
import com.alibaba.csp.sentinel.dashboard.util.VersionUtils;
-import com.alibaba.csp.sentinel.dashboard.domain.Result;
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
/**
* @author Eric Zhao
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java
index b0a53e7330..3a0542b439 100644
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java
@@ -37,9 +37,9 @@
import java.util.Date;
import java.util.List;
-import static com.alibaba.csp.sentinel.slots.block.RuleConstant.*;
import static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*;
import static com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity.*;
+import static com.alibaba.csp.sentinel.slots.block.RuleConstant.*;
/**
* Gateway flow rule Controller for manage gateway flow rules.
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java
index 96bea1d741..2ab097a8b8 100755
--- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java
@@ -15,33 +15,22 @@
*/
package com.alibaba.csp.sentinel.dashboard.controller.v2;
-import java.util.Date;
-import java.util.List;
-
import com.alibaba.csp.sentinel.dashboard.auth.AuthAction;
-import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
import com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;
-import com.alibaba.csp.sentinel.util.StringUtil;
-
import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.domain.Result;
import com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;
import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
-import com.alibaba.csp.sentinel.dashboard.domain.Result;
-
+import com.alibaba.csp.sentinel.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
/**
* Flow rule controller (v2).
@@ -135,7 +124,7 @@ private Result checkEntityInternal(FlowRuleEntity entity) {
}
@PostMapping("/rule")
- @AuthAction(value = AuthService.PrivilegeType.WRITE_RULE)
+ @AuthAction(value = PrivilegeType.WRITE_RULE)
public Result apiAddFlowRule(@RequestBody FlowRuleEntity entity) {
Result checkResult = checkEntityInternal(entity);
@@ -159,7 +148,7 @@ public Result apiAddFlowRule(@RequestBody FlowRuleEntity entity)
}
@PutMapping("/rule/{id}")
- @AuthAction(AuthService.PrivilegeType.WRITE_RULE)
+ @AuthAction(PrivilegeType.WRITE_RULE)
public Result apiUpdateFlowRule(@PathVariable("id") Long id,
@RequestBody FlowRuleEntity entity) {
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosProvider.java
new file mode 100644
index 0000000000..9d47cfb343
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosProvider.java
@@ -0,0 +1,33 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+@Component("authorityRuleNacosProvider")
+public class AuthorityRuleNacosProvider implements DynamicRuleProvider> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-authority-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+ private static final long TIMEOUT = 3000;
+
+ @Override
+ public List getRules(String appName) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = appName + DATA_ID_POSTFIX;
+ String rules = configService.getConfig(dataId, GROUP_ID, TIMEOUT);
+ if (rules == null || rules.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(rules, AuthorityRuleEntity.class);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosPublisher.java
new file mode 100644
index 0000000000..2beb2eaa07
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/AuthorityRuleNacosPublisher.java
@@ -0,0 +1,28 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("authorityRuleNacosPublisher")
+public class AuthorityRuleNacosPublisher implements DynamicRulePublisher> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-authority-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+
+ @Override
+ public void publish(String app, List rules) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = app + DATA_ID_POSTFIX;
+ String rulesStr = (rules == null || rules.isEmpty()) ? "[]" : JSON.toJSONString(rules);
+ configService.publishConfig(dataId, GROUP_ID, rulesStr);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosProvider.java
new file mode 100644
index 0000000000..547d34e4eb
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosProvider.java
@@ -0,0 +1,37 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 集群流控规则 Nacos Provider
+ * DataId: -cluster-flow-rules
+ */
+@Component("clusterFlowRuleNacosProvider")
+public class ClusterFlowRuleNacosProvider implements DynamicRuleProvider> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-cluster-flow-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+ private static final long TIMEOUT = 3000;
+
+ @Override
+ public List getRules(String appName) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = appName + DATA_ID_POSTFIX;
+ String rules = configService.getConfig(dataId, GROUP_ID, TIMEOUT);
+ if (rules == null || rules.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(rules, FlowRuleEntity.class);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosPublisher.java
new file mode 100644
index 0000000000..0012c23008
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ClusterFlowRuleNacosPublisher.java
@@ -0,0 +1,32 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 集群流控规则 Nacos Publisher
+ * DataId: -cluster-flow-rules
+ */
+@Component("clusterFlowRuleNacosPublisher")
+public class ClusterFlowRuleNacosPublisher implements DynamicRulePublisher> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-cluster-flow-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+
+ @Override
+ public void publish(String app, List rules) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = app + DATA_ID_POSTFIX;
+ String rulesStr = (rules == null || rules.isEmpty()) ? "[]" : JSON.toJSONString(rules);
+ configService.publishConfig(dataId, GROUP_ID, rulesStr);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosProvider.java
new file mode 100644
index 0000000000..bff211faad
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosProvider.java
@@ -0,0 +1,33 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+@Component("degradeRuleNacosProvider")
+public class DegradeRuleNacosProvider implements DynamicRuleProvider> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-degrade-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+ private static final long TIMEOUT = 3000;
+
+ @Override
+ public List getRules(String appName) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = appName + DATA_ID_POSTFIX;
+ String rules = configService.getConfig(dataId, GROUP_ID, TIMEOUT);
+ if (rules == null || rules.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(rules, DegradeRuleEntity.class);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosPublisher.java
new file mode 100644
index 0000000000..a13275db5b
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/DegradeRuleNacosPublisher.java
@@ -0,0 +1,28 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("degradeRuleNacosPublisher")
+public class DegradeRuleNacosPublisher implements DynamicRulePublisher> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-degrade-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+
+ @Override
+ public void publish(String app, List rules) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = app + DATA_ID_POSTFIX;
+ String rulesStr = (rules == null || rules.isEmpty()) ? "[]" : JSON.toJSONString(rules);
+ configService.publishConfig(dataId, GROUP_ID, rulesStr);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosProvider.java
new file mode 100644
index 0000000000..e15dd7f915
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosProvider.java
@@ -0,0 +1,33 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+@Component("flowRuleNacosProvider")
+public class FlowRuleNacosProvider implements DynamicRuleProvider> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-flow-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+ private static final long TIMEOUT = 3000;
+
+ @Override
+ public List getRules(String appName) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = appName + DATA_ID_POSTFIX;
+ String rules = configService.getConfig(dataId, GROUP_ID, TIMEOUT);
+ if (rules == null || rules.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(rules, FlowRuleEntity.class);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosPublisher.java
new file mode 100644
index 0000000000..d1dbdb9289
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/FlowRuleNacosPublisher.java
@@ -0,0 +1,28 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("flowRuleNacosPublisher")
+public class FlowRuleNacosPublisher implements DynamicRulePublisher> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-flow-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+
+ @Override
+ public void publish(String app, List rules) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = app + DATA_ID_POSTFIX;
+ String rulesStr = (rules == null || rules.isEmpty()) ? "[]" : JSON.toJSONString(rules);
+ configService.publishConfig(dataId, GROUP_ID, rulesStr);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfig.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfig.java
new file mode 100644
index 0000000000..e9214d86fe
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfig.java
@@ -0,0 +1,44 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.nacos.api.PropertyKeyConst;
+import com.alibaba.nacos.api.config.ConfigFactory;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.Properties;
+
+@Component
+public class NacosConfig {
+
+ @Value("${spring.cloud.nacos.discovery.server-addr}")
+ private String serverAddr;
+
+ @Value("${spring.cloud.nacos.discovery.namespace:}")
+ private String namespace;
+
+ @Value("${spring.cloud.nacos.discovery.username:}")
+ private String username;
+
+ @Value("${spring.cloud.nacos.discovery.password:}")
+ private String password;
+
+ private ConfigService configService;
+
+ @PostConstruct
+ public void init() throws Exception {
+ Properties properties = new Properties();
+ properties.setProperty(PropertyKeyConst.SERVER_ADDR, serverAddr);
+ if (namespace != null && !namespace.isEmpty()) {
+ properties.setProperty(PropertyKeyConst.NAMESPACE, namespace);
+ }
+ properties.setProperty(PropertyKeyConst.USERNAME, username);
+ properties.setProperty(PropertyKeyConst.PASSWORD, password);
+ configService = ConfigFactory.createConfigService(properties);
+ }
+
+ public ConfigService getConfigService() {
+ return configService;
+ }
+}
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosProvider.java
new file mode 100644
index 0000000000..9f9d692b02
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosProvider.java
@@ -0,0 +1,33 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+@Component("paramFlowRuleNacosProvider")
+public class ParamFlowRuleNacosProvider implements DynamicRuleProvider> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-param-flow-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+ private static final long TIMEOUT = 3000;
+
+ @Override
+ public List getRules(String appName) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = appName + DATA_ID_POSTFIX;
+ String rules = configService.getConfig(dataId, GROUP_ID, TIMEOUT);
+ if (rules == null || rules.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(rules, ParamFlowRuleEntity.class);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosPublisher.java
new file mode 100644
index 0000000000..a26f22faf2
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/ParamFlowRuleNacosPublisher.java
@@ -0,0 +1,28 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("paramFlowRuleNacosPublisher")
+public class ParamFlowRuleNacosPublisher implements DynamicRulePublisher> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-param-flow-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+
+ @Override
+ public void publish(String app, List rules) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = app + DATA_ID_POSTFIX;
+ String rulesStr = (rules == null || rules.isEmpty()) ? "[]" : JSON.toJSONString(rules);
+ configService.publishConfig(dataId, GROUP_ID, rulesStr);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosProvider.java
new file mode 100644
index 0000000000..632bb8173b
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosProvider.java
@@ -0,0 +1,33 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+@Component("systemRuleNacosProvider")
+public class SystemRuleNacosProvider implements DynamicRuleProvider> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-system-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+ private static final long TIMEOUT = 3000;
+
+ @Override
+ public List getRules(String appName) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = appName + DATA_ID_POSTFIX;
+ String rules = configService.getConfig(dataId, GROUP_ID, TIMEOUT);
+ if (rules == null || rules.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(rules, SystemRuleEntity.class);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosPublisher.java
new file mode 100644
index 0000000000..3a12133b77
--- /dev/null
+++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SystemRuleNacosPublisher.java
@@ -0,0 +1,28 @@
+package com.alibaba.csp.sentinel.dashboard.rule.nacos;
+
+import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;
+import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.api.config.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("systemRuleNacosPublisher")
+public class SystemRuleNacosPublisher implements DynamicRulePublisher> {
+
+ @Autowired
+ private NacosConfig nacosConfig;
+
+ private static final String DATA_ID_POSTFIX = "-system-rules";
+ private static final String GROUP_ID = "SENTINEL_GROUP";
+
+ @Override
+ public void publish(String app, List rules) throws Exception {
+ ConfigService configService = nacosConfig.getConfigService();
+ String dataId = app + DATA_ID_POSTFIX;
+ String rulesStr = (rules == null || rules.isEmpty()) ? "[]" : JSON.toJSONString(rules);
+ configService.publishConfig(dataId, GROUP_ID, rulesStr);
+ }
+}
\ No newline at end of file
diff --git a/sentinel-dashboard/src/main/resources/application.properties b/sentinel-dashboard/src/main/resources/application.properties
index 1bbb0819a6..5be8b3e2cd 100755
--- a/sentinel-dashboard/src/main/resources/application.properties
+++ b/sentinel-dashboard/src/main/resources/application.properties
@@ -21,4 +21,11 @@ auth.password=sentinel
# Inject the dashboard version. It's required to enable
# filtering in pom.xml for this resource file.
-sentinel.dashboard.version=@project.version@
\ No newline at end of file
+sentinel.dashboard.version=@project.version@
+
+spring.cloud.nacos.discovery.server-addr=localhost:8848
+spring.application.name=sentinel-dashboard-service
+spring.cloud.nacos.discovery.namespace=sentinel-namespace
+spring.cloud.nacos.discovery.register-enabled=true
+spring.cloud.nacos.discovery.username:nacos
+spring.cloud.nacos.discovery.password:nacos
\ No newline at end of file