From 04d1e82b8c3e5938dea2262de514922febb5da19 Mon Sep 17 00:00:00 2001 From: mshe <666666666@666666666.666666666> Date: Fri, 21 Nov 2025 07:43:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor(rule):=20=E9=87=8D=E6=9E=84=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=8F=91=E5=B8=83=E4=B8=8E=E9=85=8D=E7=BD=AE=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将规则发布类统一移至 publisher 包下,优化包结构 - 更新 Nacos 配置项命名及分组策略,增强可读性与一致性 - 重写规则转换逻辑,确保推送数据结构准确无误 - 添加推送结果日志记录,提升调试与监控能力 - 修复控制器中规则类型描述不准确的问题 - 补充 API 定义相关 Provider 和 Publisher 实现 - 清理冗余代码与注释,提高代码整洁度 - 调整格式与导入顺序,符合编码规范 - 移除不必要的 converter bean 定义,简化配置类 - 修改应用配置文件中的 Nacos 用户名密码为空,适应新部署需求 --- .../controller/AuthorityRuleController.java | 7 +- .../controller/DegradeController.java | 14 +-- .../controller/FlowControllerV1.java | 6 +- .../controller/ParamFlowRuleController.java | 24 ++-- .../controller/SystemController.java | 12 +- .../gateway/GatewayApiController.java | 12 ++ .../gateway/GatewayFlowRuleController.java | 12 ++ .../sentinel/dashboard/rule/Converters.java | 105 ++++++++++++++++++ .../rule/api/ApiDefinitionApiProvider.java | 56 ++++++++++ .../rule/api/ApiDefinitionApiPublisher.java | 57 ++++++++++ .../rule/api/ApiDefinitionNacosProvider.java | 55 +++++++++ .../rule/gateway/GatewayRuleApiProvider.java | 56 ++++++++++ .../rule/gateway/GatewayRuleApiPublisher.java | 61 ++++++++++ .../gateway/GatewayRuleNacosProvider.java | 59 ++++++++++ .../dashboard/rule/nacos/NacosConfig.java | 68 +----------- .../dashboard/rule/nacos/NacosConfigUtil.java | 39 +++---- .../ApiDefinitionNacosPublisher.java} | 25 ++--- .../AuthorityRuleNacosPublisher.java | 27 +++-- .../DegradeRuleNacosPublisher.java | 15 ++- .../FlowRuleNacosPublisher.java | 17 ++- .../publisher/GatewayRuleNacosPublisher.java | 51 +++++++++ .../SystemRuleNacosPublisher.java | 15 ++- .../src/main/resources/application.properties | 4 +- 23 files changed, 630 insertions(+), 167 deletions(-) create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/Converters.java create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiProvider.java create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiPublisher.java create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionNacosProvider.java create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiProvider.java create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiPublisher.java create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleNacosProvider.java rename sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/{param/ParamRuleNacosPublisher.java => publisher/ApiDefinitionNacosPublisher.java} (61%) rename sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/{auth => publisher}/AuthorityRuleNacosPublisher.java (64%) rename sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/{degrade => publisher}/DegradeRuleNacosPublisher.java (79%) rename sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/{flow => publisher}/FlowRuleNacosPublisher.java (79%) create mode 100644 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/GatewayRuleNacosPublisher.java rename sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/{system => publisher}/SystemRuleNacosPublisher.java (79%) 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 ff31be1a..867c01d6 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 @@ -23,8 +23,7 @@ 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.PrivilegeType; -import com.alibaba.csp.sentinel.dashboard.rule.auth.AuthorityRuleNacosPublisher; -import com.alibaba.csp.sentinel.dashboard.rule.flow.FlowRuleNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.AuthorityRuleNacosPublisher; import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.util.StringUtil; @@ -198,9 +197,9 @@ public class AuthorityRuleController { List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); try { publisher.publish(app, rules); - logger.info("限流规则推送到nacos完成,app=[{}], ip=[{}]", app, ip); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]","授权", app, ip); } catch (Exception e) { - logger.error("限流规则发布失败, app=[{}], ip=[{}]", app, ip, e); + logger.error("[{}]规则发布失败, app=[{}], ip=[{}]", "授权",app, ip, e); throw new RuntimeException(e); } return sentinelApiClient.setAuthorityRuleOfMachine(app, ip, port, 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 164855fa..a664f930 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 @@ -24,8 +24,7 @@ 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.repository.rule.RuleRepository; -import com.alibaba.csp.sentinel.dashboard.rule.auth.AuthorityRuleNacosPublisher; -import com.alibaba.csp.sentinel.dashboard.rule.degrade.DegradeRuleNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.DegradeRuleNacosPublisher; 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; @@ -65,6 +64,7 @@ public class DegradeController { private AppManagement appManagement; @Autowired private DegradeRuleNacosPublisher publisher; + @GetMapping("/rules.json") @AuthAction(PrivilegeType.READ_RULE) public Result> apiQueryMachineRules(String app, String ip, Integer port) { @@ -115,7 +115,7 @@ public class DegradeController { @PutMapping("/rule/{id}") @AuthAction(PrivilegeType.WRITE_RULE) public Result apiUpdateRule(@PathVariable("id") Long id, - @RequestBody DegradeRuleEntity entity) { + @RequestBody DegradeRuleEntity entity) { if (id == null || id <= 0) { return Result.ofFail(-1, "id can't be null or negative"); } @@ -174,9 +174,9 @@ public class DegradeController { List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); try { publisher.publish(app, rules); - logger.info("限流规则推送到nacos完成,app=[{}], ip=[{}]", app, ip); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]", "熔断", app, ip); } catch (Exception e) { - logger.error("限流规则发布失败, app=[{}], ip=[{}]", app, ip, e); + logger.error("[{}]规则发布失败, app=[{}], ip=[{}]", "熔断", app, ip, e); throw new RuntimeException(e); } return sentinelApiClient.setDegradeRuleOfMachine(app, ip, port, rules); @@ -214,10 +214,10 @@ public class DegradeController { return Result.ofFail(-1, "circuit breaker strategy cannot be null"); } if (strategy < CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType() - || strategy > RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) { + || strategy > RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) { return Result.ofFail(-1, "Invalid circuit breaker strategy: " + strategy); } - if (entity.getMinRequestAmount() == null || entity.getMinRequestAmount() <= 0) { + if (entity.getMinRequestAmount() == null || entity.getMinRequestAmount() <= 0) { return Result.ofFail(-1, "Invalid minRequestAmount"); } if (entity.getStatIntervalMs() == null || entity.getStatIntervalMs() <= 0) { 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 c930252b..47788636 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 @@ -24,7 +24,7 @@ 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.dashboard.rule.flow.FlowRuleNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.FlowRuleNacosPublisher; import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; @@ -283,9 +283,9 @@ public class FlowControllerV1 { List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); try { publisher.publish(app, rules); - logger.info("限流规则推送到nacos完成,app=[{}], ip=[{}]", app, ip); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]", "流控", app, ip); } catch (Exception e) { - logger.error("限流规则发布失败, app=[{}], ip=[{}]", app, ip, e); + logger.error("[{}]规则发布失败, app=[{}], ip=[{}]", "流控", app, ip, e); throw new RuntimeException(e); } return sentinelApiClient.setFlowRuleOfMachineAsync(app, ip, port, rules); 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 c67b8e8e..63391af1 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 @@ -28,8 +28,7 @@ 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.dashboard.rule.auth.AuthorityRuleNacosPublisher; -import com.alibaba.csp.sentinel.dashboard.rule.param.ParamRuleNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.ParamRuleNacosPublisher; import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion; @@ -69,13 +68,14 @@ public class ParamFlowRuleController { private RuleRepository repository; @Autowired private ParamRuleNacosPublisher publisher; + 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; @@ -104,9 +104,9 @@ public class ParamFlowRuleController { } try { return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port) - .thenApply(repository::saveAll) - .thenApply(Result::ofSuccess) - .get(); + .thenApply(repository::saveAll) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when querying parameter flow rules", ex.getCause()); if (isNotSupported(ex.getCause())) { @@ -265,9 +265,9 @@ public class ParamFlowRuleController { List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); try { publisher.publish(app, rules); - logger.info("限流规则推送到nacos完成,app=[{}], ip=[{}]", app, ip); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]", "热点参数", app, ip); } catch (Exception e) { - logger.error("限流规则发布失败, app=[{}], ip=[{}]", app, ip, e); + logger.error("[{}]限流规则发布失败, app=[{}], ip=[{}]", "热点参数", app, ip, e); throw new RuntimeException(e); } return sentinelApiClient.setParamFlowRuleOfMachine(app, ip, port, rules); @@ -275,7 +275,7 @@ public class ParamFlowRuleController { 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); 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 25ce2c9d..25edf997 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 @@ -22,8 +22,7 @@ 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.dashboard.rule.auth.AuthorityRuleNacosPublisher; -import com.alibaba.csp.sentinel.dashboard.rule.system.SystemRuleNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.SystemRuleNacosPublisher; import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity; @@ -55,6 +54,7 @@ public class SystemController { private AppManagement appManagement; @Autowired private SystemRuleNacosPublisher publisher; + private Result checkBasicParams(String app, String ip, Integer port) { if (StringUtil.isEmpty(app)) { return Result.ofFail(-1, "app can't be null or empty"); @@ -116,7 +116,7 @@ public class SystemController { int notNullCount = countNotNullAndNotNegative(highestSystemLoad, avgRt, maxThread, qps, highestCpuUsage); if (notNullCount != 1) { return Result.ofFail(-1, "only one of [highestSystemLoad, avgRt, maxThread, qps,highestCpuUsage] " - + "value must be set > 0, but " + notNullCount + " values get"); + + "value must be set > 0, but " + notNullCount + " values get"); } if (null != highestCpuUsage && highestCpuUsage > 1) { return Result.ofFail(-1, "highestCpuUsage must between [0.0, 1.0]"); @@ -171,7 +171,7 @@ public class SystemController { @GetMapping("/save.json") @AuthAction(PrivilegeType.WRITE_RULE) public Result apiUpdateIfNotNull(Long id, String app, Double highestSystemLoad, - Double highestCpuUsage, Long avgRt, Long maxThread, Double qps) { + Double highestCpuUsage, Long avgRt, Long maxThread, Double qps) { if (id == null) { return Result.ofFail(-1, "id can't be null"); } @@ -256,9 +256,9 @@ public class SystemController { List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); try { publisher.publish(app, rules); - logger.info("限流规则推送到nacos完成,app=[{}], ip=[{}]", app, ip); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]", "系统", app, ip); } catch (Exception e) { - logger.error("限流规则发布失败, app=[{}], ip=[{}]", app, ip, e); + logger.error("[{}]规则发布失败, app=[{}], ip=[{}]", "系统", app, ip, e); throw new RuntimeException(e); } return sentinelApiClient.setSystemRuleOfMachine(app, ip, port, rules); diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java index c7a405d9..493ba06b 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java @@ -26,6 +26,8 @@ import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.AddApiReqVo; import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.ApiPredicateItemVo; import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.UpdateApiReqVo; import com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemApiDefinitionStore; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.ApiDefinitionNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.AuthorityRuleNacosPublisher; import com.alibaba.csp.sentinel.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +58,9 @@ public class GatewayApiController { @Autowired private SentinelApiClient sentinelApiClient; + @Autowired + private ApiDefinitionNacosPublisher publisher; + @GetMapping("/list.json") @AuthAction(AuthService.PrivilegeType.READ_RULE) public Result> queryApis(String app, String ip, Integer port) { @@ -255,6 +260,13 @@ public class GatewayApiController { private boolean publishApis(String app, String ip, Integer port) { List apis = repository.findAllByMachine(MachineInfo.of(app, ip, port)); + try { + publisher.publish(app, apis); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]", "API定义", app, ip); + } catch (Exception e) { + logger.error("[{}]限流规则发布失败, app=[{}], ip=[{}]", "API定义", app, ip, e); + throw new RuntimeException(e); + } return sentinelApiClient.modifyApis(app, ip, port, apis); } } 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 b0a53e73..fc196a5b 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 @@ -27,6 +27,8 @@ import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.AddFlowRuleReqV import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.GatewayParamFlowItemVo; import com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.UpdateFlowRuleReqVo; import com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemGatewayFlowRuleStore; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.ApiDefinitionNacosPublisher; +import com.alibaba.csp.sentinel.dashboard.rule.publisher.GatewayRuleNacosPublisher; import com.alibaba.csp.sentinel.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,6 +61,9 @@ public class GatewayFlowRuleController { @Autowired private SentinelApiClient sentinelApiClient; + @Autowired + private GatewayRuleNacosPublisher publisher; + @GetMapping("/list.json") @AuthAction(AuthService.PrivilegeType.READ_RULE) public Result> queryFlowRules(String app, String ip, Integer port) { @@ -426,6 +431,13 @@ public class GatewayFlowRuleController { private boolean publishRules(String app, String ip, Integer port) { List rules = repository.findAllByMachine(MachineInfo.of(app, ip, port)); + try { + publisher.publish(app, rules); + logger.info("[{}]规则推送到nacos完成,app=[{}], ip=[{}]","网关限流", app, ip); + } catch (Exception e) { + logger.error("[{}]限流规则发布失败, app=[{}], ip=[{}]","网关限流", app, ip, e); + throw new RuntimeException(e); + } return sentinelApiClient.modifyGatewayFlowRules(app, ip, port, rules); } } diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/Converters.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/Converters.java new file mode 100644 index 00000000..049f9c39 --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/Converters.java @@ -0,0 +1,105 @@ +package com.alibaba.csp.sentinel.dashboard.rule; + +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.*; +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.fastjson.JSON; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class Converters { + + /***************** API Start ******************/ + @Bean + public Converter, String> apiRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> apiEntityDecoder() { + return s -> JSON.parseArray(s, ApiDefinitionEntity.class); + } + /***************** API End ******************/ + + /***************** Gateway Start ******************/ + @Bean + public Converter, String> gatewayRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> gatewayRuleEntityDecoder() { + return s -> JSON.parseArray(s, GatewayFlowRuleEntity.class); + } + /***************** Gateway End ******************/ + + /***************** System Start ******************/ + @Bean + public Converter, String> authorityRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> authorityRuleEntityDecoder() { + return s -> JSON.parseArray(s, AuthorityRuleEntity.class); + } + /***************** System End ******************/ + + + /***************** System Start ******************/ + @Bean + public Converter, String> degradeRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> degradeRuleEntityDecoder() { + return s -> JSON.parseArray(s, DegradeRuleEntity.class); + } + /***************** System End ******************/ + + + /***************** System Start ******************/ + @Bean + public Converter, String> systemRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> systemRuleEntityDecoder() { + return s -> JSON.parseArray(s, SystemRuleEntity.class); + } + /***************** System End ******************/ + + + /***************** Param Start ******************/ + @Bean + public Converter, String> paramRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> paramRuleEntityDecoder() { + return s -> JSON.parseArray(s, ParamFlowRuleEntity.class); + } + /***************** Param End ******************/ + + + /***************** Flow Start ******************/ + @Bean + public Converter, String> flowRuleEntityEncoder() { + return JSON::toJSONString; + } + + @Bean + public Converter> flowRuleEntityDecoder() { + return s -> JSON.parseArray(s, FlowRuleEntity.class); + } + + /***************** Flow End ******************/ + +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiProvider.java new file mode 100644 index 00000000..a2f88295 --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.dashboard.rule.api; + +import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; +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.rule.DynamicRuleProvider; +import com.alibaba.csp.sentinel.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class ApiDefinitionApiProvider implements DynamicRuleProvider> { + + @Autowired + private SentinelApiClient sentinelApiClient; + @Autowired + private AppManagement appManagement; + + @Override + public List getRules(String appName) throws Exception { + if (StringUtil.isBlank(appName)) { + return new ArrayList<>(); + } + List list = appManagement.getDetailApp(appName).getMachines() + .stream() + .filter(MachineInfo::isHealthy) + .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())).collect(Collectors.toList()); + if (list.isEmpty()) { + return new ArrayList<>(); + } else { + MachineInfo machine = list.get(0); + return sentinelApiClient.fetchApis(machine.getApp(), machine.getIp(), machine.getPort()).get(); + } + } +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiPublisher.java new file mode 100644 index 00000000..538fd3f3 --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionApiPublisher.java @@ -0,0 +1,57 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.dashboard.rule.api; + +import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; +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.rule.DynamicRulePublisher; +import com.alibaba.csp.sentinel.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +@Component +public class ApiDefinitionApiPublisher implements DynamicRulePublisher> { + + @Autowired + private SentinelApiClient sentinelApiClient; + @Autowired + private AppManagement appManagement; + + @Override + public void publish(String app, List rules) throws Exception { + if (StringUtil.isBlank(app)) { + return; + } + if (rules == null) { + return; + } + Set set = appManagement.getDetailApp(app).getMachines(); + + for (MachineInfo machine : set) { + if (!machine.isHealthy()) { + continue; + } + // TODO: parse the results + sentinelApiClient.modifyApis(app, machine.getIp(), machine.getPort(), rules); + } + } +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionNacosProvider.java new file mode 100644 index 00000000..d3f0df92 --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/api/ApiDefinitionNacosProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.dashboard.rule.api; + +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; +import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider; +import com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil; +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.util.StringUtil; +import com.alibaba.nacos.api.config.ConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class ApiDefinitionNacosProvider implements DynamicRuleProvider> { + + @Autowired + private ConfigService configService; + @Autowired + private Converter> converter; + + /** + * 获取规则 + * + * @return 规则列表 + * @throws Exception 异常 + * @degrade appName 应用名称 + */ + @Override + public List getRules(String appName) throws Exception { + String dataId = NacosConfigUtil.getApiDefinitionDataId(appName); + String rules = configService.getConfig(dataId, NacosConfigUtil.GROUP_ID, 3000); + if (StringUtil.isEmpty(rules)) { + return new ArrayList<>(); + } + return converter.convert(rules); + } +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiProvider.java new file mode 100644 index 00000000..6f2a8e5d --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.dashboard.rule.gateway; + +import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; +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.rule.DynamicRuleProvider; +import com.alibaba.csp.sentinel.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component("gatewayRuleDefaultProvider") +public class GatewayRuleApiProvider implements DynamicRuleProvider> { + + @Autowired + private SentinelApiClient sentinelApiClient; + @Autowired + private AppManagement appManagement; + + @Override + public List getRules(String appName) throws Exception { + if (StringUtil.isBlank(appName)) { + return new ArrayList<>(); + } + List list = appManagement.getDetailApp(appName).getMachines() + .stream() + .filter(MachineInfo::isHealthy) + .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())).collect(Collectors.toList()); + if (list.isEmpty()) { + return new ArrayList<>(); + } else { + MachineInfo machine = list.get(0); + return sentinelApiClient.fetchGatewayFlowRules(machine.getApp(), machine.getIp(), machine.getPort()).get(); + } + } +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiPublisher.java new file mode 100644 index 00000000..4780e729 --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleApiPublisher.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.dashboard.rule.gateway; + +import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; +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.rule.DynamicRulePublisher; +import com.alibaba.csp.sentinel.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +/** + * @author Eric Zhao + * @since 1.4.0 + */ +@Component("gatewayRuleDefaultPublisher") +public class GatewayRuleApiPublisher implements DynamicRulePublisher> { + + @Autowired + private SentinelApiClient sentinelApiClient; + @Autowired + private AppManagement appManagement; + + @Override + public void publish(String app, List rules) throws Exception { + if (StringUtil.isBlank(app)) { + return; + } + if (rules == null) { + return; + } + Set set = appManagement.getDetailApp(app).getMachines(); + + for (MachineInfo machine : set) { + if (!machine.isHealthy()) { + continue; + } + // TODO: parse the results + sentinelApiClient.modifyGatewayFlowRules(app, machine.getIp(), machine.getPort(), rules); + } + } +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleNacosProvider.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleNacosProvider.java new file mode 100644 index 00000000..c0b74337 --- /dev/null +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/gateway/GatewayRuleNacosProvider.java @@ -0,0 +1,59 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.dashboard.rule.gateway; + +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; +import com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider; +import com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil; +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.util.StringUtil; +import com.alibaba.nacos.api.config.ConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Eric Zhao + * @since 1.4.0 + */ +@Component("gatewayRuleNacosProvider") +public class GatewayRuleNacosProvider implements DynamicRuleProvider> { + + @Autowired + private ConfigService configService; + @Autowired + private Converter> converter; + + /** + * 获取规则 + * + * @degrade appName 应用名称 + * @return 规则列表 + * @throws Exception 异常 + */ + @Override + public List getRules(String appName) throws Exception { + String dataId = NacosConfigUtil.getDegradeRuleDataId(appName); + String rules = configService.getConfig(dataId, NacosConfigUtil.GROUP_ID, 3000); + if (StringUtil.isEmpty(rules)) { + return new ArrayList<>(); + } + return converter.convert(rules); + } +} 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 index 2ca72b2f..fb21d0b0 100644 --- 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 @@ -15,6 +15,8 @@ */ package com.alibaba.csp.sentinel.dashboard.rule.nacos; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.*; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.fastjson.JSON; @@ -38,72 +40,6 @@ public class NacosConfig { @Autowired private NacosServerConfig config; - /***************** System Start ******************/ - @Bean - public Converter, String> authorityRuleEntityEncoder() { - return JSON::toJSONString; - } - - @Bean - public Converter> authorityRuleEntityDecoder() { - return s -> JSON.parseArray(s, AuthorityRuleEntity.class); - } - /***************** System End ******************/ - - - /***************** System Start ******************/ - @Bean - public Converter, String> degradeRuleEntityEncoder() { - return JSON::toJSONString; - } - - @Bean - public Converter> degradeRuleEntityDecoder() { - return s -> JSON.parseArray(s, DegradeRuleEntity.class); - } - /***************** System End ******************/ - - - /***************** System Start ******************/ - @Bean - public Converter, String> systemRuleEntityEncoder() { - return JSON::toJSONString; - } - - @Bean - public Converter> systemRuleEntityDecoder() { - return s -> JSON.parseArray(s, SystemRuleEntity.class); - } - /***************** System End ******************/ - - - /***************** Param Start ******************/ - @Bean - public Converter, String> paramRuleEntityEncoder() { - return JSON::toJSONString; - } - - @Bean - public Converter> paramRuleEntityDecoder() { - return s -> JSON.parseArray(s, ParamFlowRuleEntity.class); - } - /***************** Param End ******************/ - - - /***************** Flow Start ******************/ - @Bean - public Converter, String> flowRuleEntityEncoder() { - return JSON::toJSONString; - } - - @Bean - public Converter> flowRuleEntityDecoder() { - return s -> JSON.parseArray(s, FlowRuleEntity.class); - } - - /***************** Flow End ******************/ - - @Bean public ConfigService nacosConfigService() throws Exception { // 创建Nacos配置服务 diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfigUtil.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfigUtil.java index dbf7f016..7d8445f4 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfigUtil.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfigUtil.java @@ -16,29 +16,31 @@ package com.alibaba.csp.sentinel.dashboard.rule.nacos; /** - * @author Eric Zhao - * @since 1.4.0 + * @author Ms.He + * 2025-11-21 07:37 + * e-mail crabapples.cn@gmail.com + * qq 294046317 + * pc-name mshe */ public final class NacosConfigUtil { - // public static final String GROUP_ID = "SENTINEL_GROUP"; public static final String GROUP_ID = "DEFAULT_GROUP"; public static final String GLOBAL_DATA_ID_POSTFIX = ".json"; // 流控规则 - public static final String FLOW_DATA_ID_PREFIX = "flow-"; + public static final String FLOW_DATA_ID_POSTFIX = "-FLOW"; // 热点参数规则 - public static final String PARAM_FLOW_DATA_ID_PREFIX = "param-"; + public static final String PARAM_FLOW_DATA_ID_POSTFIX = "-PARAM_FLOW"; // 熔断规则 - public static final String DEGRADE_DATA_ID_PREFIX = "degrade-"; + public static final String DEGRADE_DATA_ID_POSTFIX = "-DEGRADE"; // 授权规则 - public static final String AUTHORITY_DATA_ID_PREFIX = "auth-"; + public static final String AUTHORITY_DATA_ID_POSTFIX = "-AUTHORITY_FLOW"; // 系统规则 - public static final String SYSTEM_DATA_ID_PREFIX = "system-"; + public static final String SYSTEM_DATA_ID_POSTFIX = "-SYSTEM"; // api分组 - public static final String API_GROUP_DATA_ID_PREFIX = "api-group-"; + public static final String API_DEFINITION_DATA_ID_POSTFIX = "-API_DEFINITION"; // 网关流控规则 - public static final String GATEWAY_FLOW_DATA_ID_PREFIX = "gateway-flow-"; + public static final String GATEWAY_FLOW_DATA_ID_POSTFIX = "-GATEWAY_FLOW"; public static final String CLUSTER_MAP_DATA_ID_POSTFIX = "-cluster-map"; @@ -57,34 +59,33 @@ public final class NacosConfigUtil { } - public static String getApiGroupDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.API_GROUP_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + public static String getApiDefinitionDataId(String appName) { + return String.format("%s-%s%s", API_DEFINITION_DATA_ID_POSTFIX, appName, GLOBAL_DATA_ID_POSTFIX); } - public static String getGatewayFlowDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.GATEWAY_FLOW_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + return String.format("%s-%s%s", GATEWAY_FLOW_DATA_ID_POSTFIX, appName, GLOBAL_DATA_ID_POSTFIX); } public static String getSystemRuleDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.SYSTEM_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + return String.format("%s-%s%s", appName, SYSTEM_DATA_ID_POSTFIX, GLOBAL_DATA_ID_POSTFIX); } public static String getAuthorityRuleDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.AUTHORITY_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + return String.format("%s-%s%s", appName, AUTHORITY_DATA_ID_POSTFIX, GLOBAL_DATA_ID_POSTFIX); } public static String getDegradeRuleDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.DEGRADE_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + return String.format("%s-%s%s", appName, DEGRADE_DATA_ID_POSTFIX, GLOBAL_DATA_ID_POSTFIX); } public static String getParamRuleDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.PARAM_FLOW_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + return String.format("%s-%s%s", appName, PARAM_FLOW_DATA_ID_POSTFIX, GLOBAL_DATA_ID_POSTFIX); } public static String getFlowRuleDataId(String appName) { - return String.format("%s%s%s", NacosConfigUtil.FLOW_DATA_ID_PREFIX, appName, NacosConfigUtil.GLOBAL_DATA_ID_POSTFIX); + return String.format("%s-%s%s", appName, FLOW_DATA_ID_POSTFIX, GLOBAL_DATA_ID_POSTFIX); } } diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/param/ParamRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/ApiDefinitionNacosPublisher.java similarity index 61% rename from sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/param/ParamRuleNacosPublisher.java rename to sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/ApiDefinitionNacosPublisher.java index 4183442a..f3d35556 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/param/ParamRuleNacosPublisher.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/ApiDefinitionNacosPublisher.java @@ -13,40 +13,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.dashboard.rule.param; +package com.alibaba.csp.sentinel.dashboard.rule.publisher; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity; +import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity; import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher; import com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.util.AssertUtil; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.ConfigType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@Component("paramRuleNacosPublisher") -public class ParamRuleNacosPublisher implements DynamicRulePublisher> { +@Component +public class ApiDefinitionNacosPublisher implements DynamicRulePublisher> { + private static final Logger logger = LoggerFactory.getLogger(ApiDefinitionNacosPublisher.class); @Autowired private ConfigService configService; @Autowired - private Converter, String> converter; + private Converter, String> converter; @Override - public void publish(String app, List rules) throws Exception { + public void publish(String app, List rules) throws Exception { AssertUtil.notEmpty(app, "app name cannot be empty"); if (rules == null) { return; } - String dataId = NacosConfigUtil.getParamRuleDataId(app); - // 发布配置到nacos - configService.publishConfig(dataId, NacosConfigUtil.GROUP_ID, converter.convert(rules),ConfigType.JSON.getType()); + String dataId = NacosConfigUtil.getApiDefinitionDataId(app); + boolean status = configService.publishConfig(dataId, NacosConfigUtil.GROUP_ID, converter.convert(rules), ConfigType.JSON.getType()); + logger.info("配置文件:[{}],推送结果:[{}]", dataId, status); } } diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/auth/AuthorityRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/AuthorityRuleNacosPublisher.java similarity index 64% rename from sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/auth/AuthorityRuleNacosPublisher.java rename to sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/AuthorityRuleNacosPublisher.java index 2d809373..e9ec5abb 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/auth/AuthorityRuleNacosPublisher.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/AuthorityRuleNacosPublisher.java @@ -13,27 +13,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.dashboard.rule.auth; +package com.alibaba.csp.sentinel.dashboard.rule.publisher; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity; -import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher; import com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil; import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.util.AssertUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.ConfigType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; +import java.util.stream.Collectors; -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@Component("authorityRuleNacosPublisher") +@Component public class AuthorityRuleNacosPublisher implements DynamicRulePublisher> { + private static final Logger logger = LoggerFactory.getLogger(AuthorityRuleNacosPublisher.class); @Autowired private ConfigService configService; @@ -47,7 +48,15 @@ public class AuthorityRuleNacosPublisher implements DynamicRulePublisher collect = rules.stream().map(entity -> { + AuthorityRule rule = new AuthorityRule(); + rule.setResource(entity.getResource()); + rule.setLimitApp(entity.getLimitApp()); + rule.setStrategy(entity.getStrategy()); + return rule; + }).collect(Collectors.toList()); + String convert = JSON.toJSONString(collect); + boolean status = configService.publishConfig(dataId, NacosConfigUtil.GROUP_ID, convert, ConfigType.JSON.getType()); + logger.info("配置文件:[{}],推送结果:[{}]", dataId, status); } } diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/degrade/DegradeRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/DegradeRuleNacosPublisher.java similarity index 79% rename from sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/degrade/DegradeRuleNacosPublisher.java rename to sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/DegradeRuleNacosPublisher.java index 93cf9039..21e1df3a 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/degrade/DegradeRuleNacosPublisher.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/DegradeRuleNacosPublisher.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.dashboard.rule.degrade; +package com.alibaba.csp.sentinel.dashboard.rule.publisher; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity; import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher; @@ -22,17 +22,16 @@ import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.util.AssertUtil; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.ConfigType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@Component("degradeRuleNacosPublisher") +@Component public class DegradeRuleNacosPublisher implements DynamicRulePublisher> { + private static final Logger logger = LoggerFactory.getLogger(DegradeRuleNacosPublisher.class); @Autowired private ConfigService configService; @@ -46,7 +45,7 @@ public class DegradeRuleNacosPublisher implements DynamicRulePublisher> { + private static final Logger logger = LoggerFactory.getLogger(FlowRuleNacosPublisher.class); @Autowired private ConfigService configService; @@ -46,9 +45,7 @@ public class FlowRuleNacosPublisher implements DynamicRulePublisher> { + private static final Logger logger = LoggerFactory.getLogger(GatewayRuleNacosPublisher.class); + + @Autowired + private ConfigService configService; + @Autowired + private Converter, String> converter; + + @Override + public void publish(String app, List rules) throws Exception { + AssertUtil.notEmpty(app, "app name cannot be empty"); + if (rules == null) { + return; + } + String dataId = NacosConfigUtil.getGatewayFlowDataId(app); + boolean status = configService.publishConfig(dataId, NacosConfigUtil.GROUP_ID, converter.convert(rules), ConfigType.JSON.getType()); + logger.info("配置文件:[{}],推送结果:[{}]", dataId, status); + } +} diff --git a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/system/SystemRuleNacosPublisher.java b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/SystemRuleNacosPublisher.java similarity index 79% rename from sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/system/SystemRuleNacosPublisher.java rename to sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/SystemRuleNacosPublisher.java index 9b3c61bc..62635a7d 100644 --- a/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/system/SystemRuleNacosPublisher.java +++ b/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/publisher/SystemRuleNacosPublisher.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.dashboard.rule.system; +package com.alibaba.csp.sentinel.dashboard.rule.publisher; import com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity; import com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher; @@ -22,17 +22,16 @@ import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.util.AssertUtil; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.ConfigType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; -/** - * @author Eric Zhao - * @since 1.4.0 - */ -@Component("systemRuleNacosPublisher") +@Component public class SystemRuleNacosPublisher implements DynamicRulePublisher> { + private static final Logger logger = LoggerFactory.getLogger(SystemRuleNacosPublisher.class); @Autowired private ConfigService configService; @@ -46,7 +45,7 @@ public class SystemRuleNacosPublisher implements DynamicRulePublisher