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