From e52e2ba8019b9b5afa45f8c339ddcae4eea364ef Mon Sep 17 00:00:00 2001 From: zhangjf Date: Thu, 19 Feb 2026 21:26:06 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=85=83=E6=95=B0=E6=8D=AE=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=86=97=E4=BD=99=E7=9A=84=20tenant-id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:metadata 中同时配置 tenant-id 和 tenant-group,但 tenant-id 未被使用 分析: - tenant-id: 用于数据隔离,但实际由 TenantContextHolder 提供,元数据中的值无意义 - tenant-group: 用于服务路由,负载均衡器实际只使用此字段 解决方案: 1. 移除 metadata.tenant-id 配置 2. 只保留 metadata.tenant-group 3. 更新 NacosMetadataConfig,移除 tenant-id 处理 4. 更新 docker-compose.yml,移除 TENANT_ID 环境变量 配置简化: 修改前: tenant-id + tenant-group 两个字段 修改后: 只有 tenant-group 一个字段 实例类型: 共享实例: tenant-group = "" (空) VIP实例: tenant-group = "TENANT_VIP_001" --- docker-compose.yml | 9 +-- .../common/nacos/NacosMetadataConfig.java | 66 +++++------------- .../common/nacos/NacosMetadataConfig.class | Bin 2947 -> 2486 bytes fund-sys/src/main/resources/application.yml | 6 +- fund-sys/target/classes/application.yml | 6 +- logs/fund-sys-shared-8100.log | 18 +++++ logs/fund-sys-tenant-vip001-8101.log | 36 ++++++++++ logs/fund-sys/error.log | 48 +++++++++++++ logs/fund-sys/info.log | 6 ++ 9 files changed, 136 insertions(+), 59 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ca64613..5b5eac5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -184,8 +184,7 @@ services: REDIS_HOST: redis REDIS_PORT: 6379 JAVA_OPTS: -Xms256m -Xmx512m - # 租户元数据 - 共享实例(无特定租户组,所有租户可用) - TENANT_ID: "1" + # 租户组 - 共享实例(空值,所有租户可用) TENANT_GROUP: "" ports: - "8100:8100" @@ -228,8 +227,7 @@ services: REDIS_HOST: redis REDIS_PORT: 6379 JAVA_OPTS: -Xms256m -Xmx512m - # 租户元数据 - VIP_001 专属实例 - TENANT_ID: "1001" + # 租户组 - VIP_001 专属实例 TENANT_GROUP: "TENANT_VIP_001" ports: - "8101:8101" @@ -272,8 +270,7 @@ services: # REDIS_HOST: redis # REDIS_PORT: 6379 # JAVA_OPTS: -Xms256m -Xmx512m - # # 租户元数据 - VIP_002 专属实例 - # TENANT_ID: "1002" + # # 租户组 - VIP_002 专属实例 # TENANT_GROUP: "TENANT_VIP_002" # ports: # - "8102:8102" diff --git a/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java b/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java index 4c0a208..aca6d9f 100644 --- a/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java +++ b/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java @@ -8,19 +8,27 @@ import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.annotation.Configuration; import jakarta.annotation.PostConstruct; -import java.util.HashMap; import java.util.Map; /** * Nacos 服务注册元数据配置 * - *

服务启动时自动注册租户标签到 Nacos,支持租户感知的负载均衡

+ *

服务启动时自动注册租户组标签到 Nacos,支持租户感知的负载均衡

* - *

支持两种配置方式:

- * + *

租户组配置规则:

+ *
+ * 共享实例: tenant-group 为空(或不配置)→ 所有租户都可使用
+ * VIP实例:  tenant-group = "TENANT_VIP_001" → 仅该租户组可用
+ * 
+ * + *

配置方式:

+ *
+ * # 方式1: 环境变量(Docker/K8s 推荐)
+ * TENANT_GROUP=TENANT_VIP_001
+ * 
+ * # 方式2: 配置文件
+ * spring.cloud.nacos.discovery.metadata.tenant-group=TENANT_VIP_001
+ * 
*/ @Configuration @ConditionalOnProperty(name = "tenant.routing.enabled", havingValue = "true", matchIfMissing = true) @@ -32,73 +40,37 @@ public class NacosMetadataConfig { private String applicationName; /** - * 租户 ID,优先级:环境变量 > 配置文件 > 默认值 - */ - @Value("${TENANT_ID:${spring.cloud.nacos.discovery.metadata.tenant-id:1}}") - private String tenantId; - - /** - * 租户组,优先级:环境变量 > 配置文件 > 自动生成 + * 租户组,优先级:环境变量 > 配置文件 * 为空表示共享实例,供所有租户使用 */ @Value("${TENANT_GROUP:${spring.cloud.nacos.discovery.metadata.tenant-group:}}") private String tenantGroup; - /** - * Nacos Registration Bean,用于动态添加元数据 - */ private final Registration registration; public NacosMetadataConfig(Registration registration) { this.registration = registration; } - /** - * 初始化 Nacos 元数据 - */ @PostConstruct public void init() { - logger.info("[Nacos Metadata] 应用名:{}", applicationName); - logger.info("[Nacos Metadata] 租户 ID: {}, 租户组:{}", tenantId, tenantGroup); - - // 动态添加租户元数据到服务注册信息 if (registration != null && registration.getMetadata() != null) { Map metadata = registration.getMetadata(); - // 添加租户 ID - if (tenantId != null && !tenantId.isEmpty()) { - metadata.put("tenant-id", tenantId); - } - - // 添加租户组(VIP 专属实例才有值,共享实例为空) + // 添加租户组元数据 if (tenantGroup != null && !tenantGroup.isEmpty()) { metadata.put("tenant-group", tenantGroup); - logger.info("[Nacos Metadata] 注册为 VIP 专属实例,租户组:{}", tenantGroup); + logger.info("[Nacos] {} 注册为 VIP 专属实例,租户组:{}", applicationName, tenantGroup); } else { - logger.info("[Nacos Metadata] 注册为共享实例,供所有租户使用"); + logger.info("[Nacos] {} 注册为共享实例,供所有租户使用", applicationName); } - - logger.info("[Nacos Metadata] 服务元数据:{}", metadata); } } - /** - * 获取当前租户 ID - */ - public String getTenantId() { - return tenantId; - } - - /** - * 获取当前租户组 - */ public String getTenantGroup() { return tenantGroup; } - /** - * 判断是否为 VIP 专属实例 - */ public boolean isVipInstance() { return tenantGroup != null && !tenantGroup.isEmpty(); } diff --git a/fund-common/target/classes/com/fundplatform/common/nacos/NacosMetadataConfig.class b/fund-common/target/classes/com/fundplatform/common/nacos/NacosMetadataConfig.class index a9c6cf2950b4a8451609d06c266b83af2fdd00e5..8a993c050d13e22d8e130ab84791cd03b55e6f58 100644 GIT binary patch delta 1182 zcmZWoSx*yD6#nkav{Tw)E1R+?7J;@bMJdR>uTlyKmQBD4r5RG&rX5U-ni_r9gxoj( zfG<3_g81Mg4?g-Ej6Z@Hf1w4t3r)zhQ*lg2|6?urc^3|f|0Q&cc> zpbI@Jx*2lKIqe#H%r_lQYUo8D*W}^60fzR~V0bf;UaNlegzw6YZ34iM1{H*G1Y;^j z3BbRT)G&?-nvWjePB3)3`M$M^*GUxxHr!w#No*XCpgyQ!oe@ljhN;<7(s1{YEXCyipt@JVlMcx=m z;j?=WQSEK`2-jI+o{6=U(E15qn^~YVdmC3#OIeg>qG6~b-NMKaBXr7Ge1~#pKbeDB*RX=u zC=|{~;XJ~W3_(CKnY(C2KqqzYBJjOvMy3zl=*Kh$FiStv?d62uHa zpQV^aGV7Tm?G||)kbYuTMb`=Kh+!TJbP9$(l41=O0qzYc=NB+8I%UjqVtLsCGTcV{ zY4*fvc8SP7M!pc{1T4zFyie8SbL*TkaSLpq|2tbuV3Wa$sBOq>zG&{ClI$h2mnm4d RvI>^QD(O}{01Y-zIFfr literal 2947 zcmbtW+fNi%82=qu+yxdys-jlQO0{y)ovL`_rih@}9Ap5B)n>eDu9(nto?y*)Hxj(ez>Wob#RY-G1L~{`h5v1fSwcoEtG^U~EED1;eT~-Oxn`LvejWxD-B=dQs*_Is6Q} zRWqSPQ${2i=OSua355s=(@+eqnzqs}|NAt-BV6z<(}?OZ2EV1nbX!8 z_LE&w>c8j=3u$m`IW}OU7n}Te6PpP>$Cn(n3?AKxnhZPY^O~t+I#WWAD}6lKS_TF0da>J& zJ=nV-i)f+9|6u%3=~@9}Y9LnMI%XKc3yE55& z7`EqYxph5#^}FAGK8Mc!n&=G#kEeuFojchHbZm4{xGI-!&aiMQiW$3lrWE{G>UP_ zl-w}XZJTj>OE9OLg9g=eOUjru%!|e>L+7@ck?#J^{*m)kU|9yI2hmgNVZn%QtLBtu zO$QU1b{5QLSIh2MlF^fuaeQdt^x*4?aq^}`3OZU}(BoI{hz()tI$dUjyk8yC4Xr)igx$!syFr$s3GW*EsprlH-!+Nrp#Bf6;P9KBOS1SxLB=uDB(9V&RcFekER80y5z*z0RY-)p zV^hoJ5>D_cTJdN|YNog*yc0 zGBE8Jqc>nu=G#DP=;5=44sRv*K-%1 z;veX$*ul%SC6*(uCS!~Avjj!!j!