Browse Source

nacos规则设置

dev
zhuibobo 2 months ago
parent
commit
9c0f4e1b13
  1. 11
      pom.xml
  2. 1
      zdxt-web-server/nacos-server/readme.md
  3. 6
      zdxt-web-server/zdxt-admin-web-server/pom.xml
  4. 7
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-enf-ep.yml
  5. 7
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-ent-ep.yml
  6. 7
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-job-ep.yml
  7. 7
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-sup-ep.yml
  8. 14
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application.yml
  9. 6
      zdxt-web-server/zdxt-gateway-web-server/pom.xml
  10. 4
      zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/ZdxtGatewayApplication.java
  11. 28
      zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/config/LoadBalancerConfig.java
  12. 74
      zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/config/PreferredFirstLoadBalancer.java
  13. 26
      zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application-dev.yml
  14. 36
      zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application-prod.yml
  15. 38
      zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application.yml

11
pom.xml

@ -58,6 +58,8 @@
<!-- Spring Cloud 版本 --> <!-- Spring Cloud 版本 -->
<spring-cloud.version>2025.0.0</spring-cloud.version> <spring-cloud.version>2025.0.0</spring-cloud.version>
<!-- Spring Cloud Alibaba 版本(适配 SC 2025.0.0 / SB 3.5 / Nacos Server 3.x) -->
<spring-cloud-alibaba.version>2025.0.0.0-preview</spring-cloud-alibaba.version>
<!-- 插件版本 --> <!-- 插件版本 -->
<maven-jar-plugin.version>3.4.2</maven-jar-plugin.version> <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
<maven-war-plugin.version>3.4.0</maven-war-plugin.version> <maven-war-plugin.version>3.4.0</maven-war-plugin.version>
@ -117,6 +119,15 @@
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<!-- Spring Cloud Alibaba BOM(Nacos 服务发现/配置中心) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringBoot的依赖配置--> <!-- SpringBoot的依赖配置-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

1
zdxt-web-server/nacos-server/readme.md

@ -1,2 +1,3 @@
nacos-server-3.2.2
http://127.0.0.1:8080/ http://127.0.0.1:8080/
nacos/nacos nacos/nacos

6
zdxt-web-server/zdxt-admin-web-server/pom.xml

@ -18,6 +18,12 @@
<dependencies> <dependencies>
<!-- Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Mysql驱动包 --> <!-- Mysql驱动包 -->
<dependency> <dependency>
<groupId>com.mysql</groupId> <groupId>com.mysql</groupId>

7
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-enf-ep.yml

@ -3,3 +3,10 @@ server:
port: 18002 port: 18002
servlet: servlet:
context-path: / context-path: /
spring:
cloud:
nacos:
discovery:
metadata:
zdxt-role: enf-ep

7
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-ent-ep.yml

@ -3,3 +3,10 @@ server:
port: 18000 port: 18000
servlet: servlet:
context-path: / context-path: /
spring:
cloud:
nacos:
discovery:
metadata:
zdxt-role: ent-ep

7
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-job-ep.yml

@ -6,6 +6,13 @@ server:
# 应用的访问路径 # 应用的访问路径
context-path: /job-ep context-path: /job-ep
spring:
cloud:
nacos:
discovery:
metadata:
zdxt-role: job-ep
--- # Quartz 定时任务配置 --- # Quartz 定时任务配置
spring: spring:
quartz: quartz:

7
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev-sup-ep.yml

@ -3,3 +3,10 @@ server:
port: 18001 port: 18001
servlet: servlet:
context-path: / context-path: /
spring:
cloud:
nacos:
discovery:
metadata:
zdxt-role: sup-ep

14
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application.yml

@ -54,6 +54,20 @@ spring:
allow-circular-references: true allow-circular-references: true
application: application:
name: EnforcementCode-2.0 name: EnforcementCode-2.0
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
username: nacos
password: nacos
# 注册到 Nacos 的服务名(与 application.name 解耦,方便网关按 lb://zdxt-admin-service 路由)
service: zdxt-admin-service
# 默认 role,各 profile(dev-ent-ep/dev-sup-ep/dev-enf-ep/dev-job-ep)会覆盖
# 注意:key 不能含 '.' (Spring Boot 会把点号视为嵌套路径),用 '-' 分隔
metadata:
zdxt-role: ent-ep
threads: threads:
# 开启虚拟线程 仅jdk21可用 # 开启虚拟线程 仅jdk21可用
virtual: virtual:

6
zdxt-web-server/zdxt-gateway-web-server/pom.xml

@ -30,6 +30,12 @@
<artifactId>spring-cloud-starter-loadbalancer</artifactId> <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency> </dependency>
<!-- Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Spring Boot Actuator --> <!-- Spring Boot Actuator -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

4
zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/ZdxtGatewayApplication.java

@ -13,9 +13,7 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
*/ */
@SpringBootApplication @SpringBootApplication
@LoadBalancerClients({ @LoadBalancerClients({
@LoadBalancerClient(name = "ent-ep-service", configuration = LoadBalancerConfig.class), @LoadBalancerClient(name = "zdxt-admin-service", configuration = LoadBalancerConfig.class)
@LoadBalancerClient(name = "enf-ep-service", configuration = LoadBalancerConfig.class),
@LoadBalancerClient(name = "sup-ep-service", configuration = LoadBalancerConfig.class)
}) })
public class ZdxtGatewayApplication { public class ZdxtGatewayApplication {
public static void main(String[] args) { public static void main(String[] args) {

28
zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/config/LoadBalancerConfig.java

@ -1,7 +1,6 @@
package com.zdxt.gateway.webserver.config; package com.zdxt.gateway.webserver.config;
import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryProperties;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
@ -9,18 +8,11 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* 负载均衡配置 - 优先级策略 * 负载均衡配置 - 优先角色策略基于 Nacos 实例 metadata
* <p>
* 始终优先选择配置列表中的第一个健康实例
* 首选实例不可用时按配置顺序从剩余健康实例中选取
* <p> * <p>
* 通过 {@link SimpleDiscoveryProperties} 读取原始配置顺序 * 通过路由 metadata.role-order 声明角色优先级PreferredRoleFilter 将其注入到请求头
* 确保健康检查并发返回结果后仍能正确识别首选实例 * PreferredFirstLoadBalancer 从头读取并按顺序在 Nacos 实例 metadatazdxt.role中匹配
* *
* @author zdxt * @author zdxt
*/ */
@ -30,21 +22,11 @@ public class LoadBalancerConfig {
@Bean @Bean
public ReactorLoadBalancer<ServiceInstance> preferredFirstLoadBalancer( public ReactorLoadBalancer<ServiceInstance> preferredFirstLoadBalancer(
Environment environment, Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory, LoadBalancerClientFactory loadBalancerClientFactory) {
SimpleDiscoveryProperties discoveryProperties) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
// 从配置中获取该服务的原始实例顺序(即优先级)
List<String> preferredOrder = discoveryProperties.getInstances()
.getOrDefault(name, Collections.emptyList())
.stream()
.map(instance -> instance.getHost() + ":" + instance.getPort())
.collect(Collectors.toList());
return new PreferredFirstLoadBalancer( return new PreferredFirstLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),
name, name
preferredOrder
); );
} }
} }

74
zdxt-web-server/zdxt-gateway-web-server/src/main/java/com/zdxt/gateway/webserver/config/PreferredFirstLoadBalancer.java

@ -6,74 +6,104 @@ import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.DefaultResponse; import org.springframework.cloud.client.loadbalancer.DefaultResponse;
import org.springframework.cloud.client.loadbalancer.EmptyResponse; import org.springframework.cloud.client.loadbalancer.EmptyResponse;
import org.springframework.cloud.client.loadbalancer.Request; import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.RequestDataContext;
import org.springframework.cloud.client.loadbalancer.Response; import org.springframework.cloud.client.loadbalancer.Response;
import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer; import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.http.HttpHeaders;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
* 优先级负载均衡器 - 首选优先策略 * 优先级负载均衡器 - 按角色顺序选择实例
* <p> * <p>
* 根据配置文件中实例的声明顺序确定优先级 * 从请求 header {@value #HEADER_ROLE_ORDER} 读取角色优先级列表 PreferredRoleFilter 从路由 metadata 注入
* 始终选择优先级最高的健康实例 * 依次在 Nacos 拉到的健康实例中匹配 metadata {@value #METADATA_ROLE_KEY}命中即返回
* 若列表中所有角色均未命中则回退取第一个健康实例作为兜底
* <p> * <p>
* 健康检查并发执行后返回结果顺序不确定 * 完全替代原有静态 SimpleDiscoveryProperties 方案同时保留首选优先 + 兜底容错语义
* 因此通过 preferredOrder 显式匹配配置中的优先级顺序
* *
* @author zdxt * @author zdxt
*/ */
@Slf4j @Slf4j
public class PreferredFirstLoadBalancer implements ReactorServiceInstanceLoadBalancer { public class PreferredFirstLoadBalancer implements ReactorServiceInstanceLoadBalancer {
/** 路由 metadata 中优先级顺序注入到请求头的名称 */
public static final String HEADER_ROLE_ORDER = "X-Preferred-Role-Order";
/** Nacos 实例 metadata 中标识角色的 key admin 服务 application.yml 保持一致
* 注意:不使用点号(Spring Boot 会把点号视为嵌套路径拆分 Map key) */
public static final String METADATA_ROLE_KEY = "zdxt-role";
private final String serviceId; private final String serviceId;
private final ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider; private final ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
/** 配置中声明的实例顺序(host:port),索引越小优先级越高 */
private final List<String> preferredOrder;
public PreferredFirstLoadBalancer( public PreferredFirstLoadBalancer(
ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
String serviceId, String serviceId) {
List<String> preferredOrder) {
this.serviceId = serviceId; this.serviceId = serviceId;
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider; this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
this.preferredOrder = preferredOrder; log.info("[{}] PreferredFirstLoadBalancer 已启用,将按请求头 {} 指定的角色顺序优先选择实例",
log.info("[{}] 优先级顺序: {}", serviceId, preferredOrder); serviceId, HEADER_ROLE_ORDER);
} }
@Override @Override
public Mono<Response<ServiceInstance>> choose(Request request) { public Mono<Response<ServiceInstance>> choose(Request request) {
List<String> roleOrder = extractRoleOrder(request);
ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
.getIfAvailable(NoopServiceInstanceListSupplier::new); .getIfAvailable(NoopServiceInstanceListSupplier::new);
return supplier.get(request) return supplier.get(request)
.next() .next()
.map(this::selectInstance); .map(instances -> selectByRoleOrder(instances, roleOrder));
} }
private Response<ServiceInstance> selectInstance(List<ServiceInstance> instances) { private Response<ServiceInstance> selectByRoleOrder(List<ServiceInstance> instances, List<String> roleOrder) {
if (instances.isEmpty()) { if (instances.isEmpty()) {
log.warn("[{}] 无可用服务实例", serviceId); log.warn("[{}] 无可用服务实例", serviceId);
return new EmptyResponse(); return new EmptyResponse();
} }
// 按配置优先级顺序遍历,找到第一个在健康列表中的实例 // 按 roleOrder 顺序遍历,找到第一个匹配角色且健康的实例
for (String preferred : preferredOrder) { for (String role : roleOrder) {
for (ServiceInstance instance : instances) { for (ServiceInstance instance : instances) {
String key = instance.getHost() + ":" + instance.getPort(); String instanceRole = instance.getMetadata().get(METADATA_ROLE_KEY);
if (preferred.equals(key)) { if (role.equals(instanceRole)) {
log.debug("[{}] 选择优先实例: {}, 健康实例数: {}", log.debug("[{}] 命中优先角色 [{}] -> {}:{} (metadata={})",
serviceId, key, instances.size()); serviceId, role, instance.getHost(), instance.getPort(), instance.getMetadata());
return new DefaultResponse(instance); return new DefaultResponse(instance);
} }
} }
} }
// 如果配置顺序中的实例都不在健康列表中(不应发生),取健康列表第一个 // 兜底:所有优先角色都不健康,取列表首个健康实例
ServiceInstance fallback = instances.get(0); ServiceInstance fallback = instances.get(0);
log.warn("[{}] 未匹配到配置优先级实例,回退使用: {}:{}", log.warn("[{}] roleOrder={} 未匹配到任何健康实例,回退到首个健康实例 {}:{} (role={})",
serviceId, fallback.getHost(), fallback.getPort()); serviceId, roleOrder, fallback.getHost(), fallback.getPort(),
fallback.getMetadata().get(METADATA_ROLE_KEY));
return new DefaultResponse(fallback); return new DefaultResponse(fallback);
} }
/**
* 从请求头 X-Preferred-Role-Order 提取角色优先级列表逗号分隔
*/
private List<String> extractRoleOrder(Request<?> request) {
Object context = request.getContext();
if (context instanceof RequestDataContext rdc) {
HttpHeaders headers = rdc.getClientRequest().getHeaders();
if (headers != null) {
String raw = headers.getFirst(HEADER_ROLE_ORDER);
if (raw != null && !raw.isBlank()) {
return Arrays.stream(raw.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.toList();
}
}
}
return Collections.emptyList();
}
} }

26
zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application-dev.yml

@ -5,6 +5,13 @@ spring:
application: application:
name: zdxt-gateway name: zdxt-gateway
cloud: cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
username: nacos
password: nacos
gateway: gateway:
# 全局CORS配置 # 全局CORS配置
globalcors: globalcors:
@ -20,26 +27,33 @@ spring:
allowedHeaders: "*" allowedHeaders: "*"
allowCredentials: true allowCredentials: true
maxAge: 3600 maxAge: 3600
# 路由配置 # 路由配置 - 通过 metadata.role-order 声明每条路由的角色优先级
# (由 PreferredRoleFilter + PreferredFirstLoadBalancer 生效,后端在 Nacos 中注册为 zdxt-admin-service)
routes: routes:
- id: enterprise-service - id: enterprise-service
uri: http://localhost:18000 uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/ent-ep/** - Path=/ent-ep/**
metadata:
role-order: ent-ep,enf-ep,sup-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: supervision-service - id: supervision-service
uri: http://localhost:18001 uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/sup-ep/** - Path=/sup-ep/**
metadata:
role-order: sup-ep,ent-ep,enf-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: enforcement-service - id: enforcement-service
uri: http://localhost:18002 uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/enf-ep/** - Path=/enf-ep/**
metadata:
role-order: enf-ep,ent-ep,sup-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
@ -66,5 +80,7 @@ logging:
level: level:
root: info root: info
org.springframework.cloud.gateway: info org.springframework.cloud.gateway: info
org.springframework.cloud.loadbalancer: debug
com.zdxt.gateway: info com.zdxt.gateway: info
com.zdxt.gateway.webserver.filter: info com.zdxt.gateway.webserver.filter: debug
com.zdxt.gateway.webserver.config: debug

36
zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application-prod.yml

@ -5,31 +5,15 @@ spring:
application: application:
name: zdxt-gateway name: zdxt-gateway
cloud: cloud:
# 静态服务实例列表(无需注册中心,配置顺序即优先级) # LoadBalancer 配置
discovery: # 健康检查交给 Nacos 心跳(gRPC),不启用 Spring Cloud LoadBalancer 自带的 HTTP 探测,
client: # 否则会因后端 /actuator/health 被 Sa-Token 拦截返回 401 而把实例误判为不健康。
simple:
instances:
ent-ep-service:
- uri: http://10.76.108.7:18000
- uri: http://10.76.108.8:18002
- uri: http://10.76.108.9:18001
enf-ep-service:
- uri: http://10.76.108.8:18002
- uri: http://10.76.108.7:18000
- uri: http://10.76.108.9:18001
sup-ep-service:
- uri: http://10.76.108.9:18001
- uri: http://10.76.108.7:18000
- uri: http://10.76.108.8:18002
# LoadBalancer 健康检查配置
loadbalancer: loadbalancer:
health-check: health-check:
initial-delay: 0s initial-delay: 0s
interval: 10s interval: 10s
path: path:
default: /actuator/health default: /actuator/health
configurations: health-check
gateway: gateway:
# 全局CORS配置 # 全局CORS配置
globalcors: globalcors:
@ -45,26 +29,32 @@ spring:
allowedHeaders: "*" allowedHeaders: "*"
allowCredentials: true allowCredentials: true
maxAge: 3600 maxAge: 3600
# 路由配置 - 使用 lb:// 协议启用优先级负载均衡 # 路由配置 - 后端统一在 Nacos 注册为 zdxt-admin-service,通过 metadata.role-order 声明每条路由的角色优先级
routes: routes:
- id: enterprise-service - id: enterprise-service
uri: lb://ent-ep-service uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/ent-ep/** - Path=/ent-ep/**
metadata:
role-order: ent-ep,enf-ep,sup-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: supervision-service - id: supervision-service
uri: lb://sup-ep-service uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/sup-ep/** - Path=/sup-ep/**
metadata:
role-order: sup-ep,ent-ep,enf-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: enforcement-service - id: enforcement-service
uri: lb://enf-ep-service uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/enf-ep/** - Path=/enf-ep/**
metadata:
role-order: enf-ep,ent-ep,sup-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE

38
zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application.yml

@ -5,31 +5,17 @@ spring:
application: application:
name: zdxt-gateway name: zdxt-gateway
cloud: cloud:
# 静态服务实例列表(无需注册中心,配置顺序即优先级) # LoadBalancer 配置
discovery: # 健康检查交给 Nacos 心跳(gRPC),不启用 Spring Cloud LoadBalancer 自带的 HTTP 探测,
client: # 否则会因后端 /actuator/health 被 Sa-Token 拦截返回 401 而把实例误判为不健康,
simple: # 导致 LoadBalancer 拉到的实例列表残缺,PreferredFirstLoadBalancer 无法命中正确角色。
instances:
ent-ep-service:
- uri: http://localhost:18000
- uri: http://localhost:18002
- uri: http://localhost:18001
enf-ep-service:
- uri: http://localhost:18002
- uri: http://localhost:18000
- uri: http://localhost:18001
sup-ep-service:
- uri: http://localhost:18001
- uri: http://localhost:18000
- uri: http://localhost:18002
# LoadBalancer 健康检查配置
loadbalancer: loadbalancer:
# 保留 health-check 相关默认值(未启用时不生效),便于将来在 /actuator 免鉴权后重新开启
health-check: health-check:
initial-delay: 0s initial-delay: 0s
interval: 10s interval: 10s
path: path:
default: /actuator/health default: /actuator/health
configurations: health-check
gateway: gateway:
# 全局CORS配置 # 全局CORS配置
globalcors: globalcors:
@ -45,26 +31,32 @@ spring:
allowedHeaders: "*" allowedHeaders: "*"
allowCredentials: true allowCredentials: true
maxAge: 3600 maxAge: 3600
# 路由配置 - 使用 lb:// 协议启用优先级负载均衡 # 路由配置 - 后端统一在 Nacos 注册为 zdxt-admin-service,通过 metadata.role-order 声明每条路由的角色优先级
routes: routes:
- id: enterprise-service - id: enterprise-service
uri: lb://ent-ep-service uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/ent-ep/** - Path=/ent-ep/**
metadata:
role-order: ent-ep,enf-ep,sup-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: supervision-service - id: supervision-service
uri: lb://sup-ep-service uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/sup-ep/** - Path=/sup-ep/**
metadata:
role-order: sup-ep,ent-ep,enf-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: enforcement-service - id: enforcement-service
uri: lb://enf-ep-service uri: lb://zdxt-admin-service
predicates: predicates:
- Path=/enf-ep/** - Path=/enf-ep/**
metadata:
role-order: enf-ep,ent-ep,sup-ep
filters: filters:
- StripPrefix=1 - StripPrefix=1
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE

Loading…
Cancel
Save