
本文介绍如何在 vert.x 应用中优雅地实现配置外化,支持从 eks configmap(环境变量)、默认配置文件及 fallback 值三级联动,避免硬编码 `system.getenv().getordefault()`,达到与 spring boot `@value("${sud.mcs_subscription_endpoint:/v1/manag}")` 相同的表达力与灵活性。
Vert.x 本身的核心模块(vertx-core)不内置配置解析与多源合并能力,但其官方扩展模块 Vert.x Config 正是为此而生。它支持声明式配置源组合、类型安全读取、动态重载(可选),并天然兼容 Kubernetes 环境 —— 完美适配你在 EKS 中通过 ConfigMap 注入环境变量(如 SUD_SERVICE_BASE_PATH)的实践。
✅ 推荐方案:使用 Vert.x Config 实现“配置优先级链”
你需要将以下三类配置按优先级从高到低组合:
- 环境变量(EKS ConfigMap 注入) → 最高优先级(运行时覆盖)
- 本地 YAML/JSON 配置文件(如 config.yaml) → 提供默认结构与兜底值
- 硬编码 fallback(可选) → 仅在代码中做最终兜底(非推荐,建议全交由 Config 模块处理)
1. 添加依赖(Maven)
io.vertx vertx-config 4.5.7
2. 定义分层配置源(Java 示例)
import io.vertx.config.ConfigRetriever;
import io.vertx.config.ConfigRetrieverOptions;
import io.vertx.config.ConfigStoreOptions;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
public class ConfiguredApp {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
// ① 环境变量源(自动读取 SUD_SERVICE_*,支持 ${...:default} 语法!)
ConfigStoreOptions envStore = new ConfigStoreOptions()
.setType("env")
.setConfig(new JsonObject()
.put("keys", Arrays.asList(
"SUD_SERVICE_BASE_PATH",
"SUD_SERVICE_MCS_BASE_PATH",
"SUD_SERVICE_MCS_TOKEN",
"SUD_SERVICE_MCS_SUBSCRIPTION_ENDPOINT",
"SUD_SERVICE_HOST"
))
);
// ② YAML 文件源(提供默认值,路径可为 classpath 或文件系统)
ConfigStoreOptions fileStore = new ConfigStoreOptions()
.setType("yaml")
.setConfig(new JsonObject()
.put("path", "config.yaml") // classpath:/config.yaml
);
// 构建配置检索器:环境变量 > YAML 文件(顺序即优先级)
ConfigRetriever retriever = ConfigRetriever.create(vertx,
new ConfigRetrieverOptions()
.addStore(envStore)
.addStore(fileStore)
);
// 异步加载配置(支持失败重试、缓存、监听变更)
retriever.getConfig(ar -> {
if (ar.succeeded()) {
JsonObject config = ar.result();
// ✅ 自动解析带默认值的环境变量(无需手动 getOrDefault!)
String basePath = config.getString("SUD.BASEPATH");
String mcsEndpoint = config.getString("SUD.MCS_SUBSCRIPTION_ENDPOINT");
System.out.println("Resolved BASEPATH: " + basePath); // e.g., https://origin-sud.com or overridden value
System.out.println("Resolved MCS endpoint: " + mcsEndpoint);
// 启动你的 Vert.x 应用(如 WebServer)...
} else {
throw new RuntimeException("Failed to load config", ar.cause());
}
});
}
}3. 配置文件 config.yaml(classpath 根目录)
SUD:
BASEPATH: "${SUD_SERVICE_BASE_PATH:https://origin-sud.com}"
MCS_BASEPATH: "${SUD_SERVICE_MCS_BASE_PATH:https://sud.com/}"
MCS_TOKEN: "${SUD_SERVICE_MCS_TOKEN:a2341b8b-4ca5-4513-8c52-gf267bihbh}"
MCS_SUBSCRIPTION_ENDPOINT: "${SUD_SERVICE_MCS_SUBSCRIPTION_ENDPOINT:/v1/manag}"
HOST: "${SUD_SERVICE_HOST:sud.com}"? 关键点:YAML 中直接使用 ${KEY:default} 语法 —— 这是 Vert.x Config 原生支持 的占位符解析(需启用 env store 并确保 key 名匹配)。它会在运行时自动查找环境变量 SUD_SERVICE_BASE_PATH,未找到则回退到 https://origin-sud.com。
4. EKS ConfigMap 示例(部署时注入)
# sud-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: sud-service-config data: SUD_SERVICE_BASE_PATH: "https://prod-sud.internal" SUD_SERVICE_MCS_TOKEN: "xyz-987654321"
在 Deployment 中挂载为环境变量:
envFrom:
- configMapRef:
name: sud-service-config⚠️ 注意事项与最佳实践
- 环境变量名必须严格匹配:SUD_SERVICE_BASE_PATH 对应 YAML 中的 ${SUD_SERVICE_BASE_PATH:...},大小写敏感;
- 不要混用 System.getenv():一旦引入 ConfigRetriever,应统一通过 JsonObject 读取,避免逻辑割裂;
- 动态重载(进阶):如需热更新(如 ConfigMap 变更后自动生效),启用 watching 并监听 configChange 事件;
- 类型安全增强:可结合 Jackson 或自定义 ConfigProcessor 将配置映射为 Java Bean;
- 生产建议:始终在 YAML 中保留完整默认值,确保即使 ConfigMap 未注入,应用仍可启动。
通过 Vert.x Config,你不仅复刻了 Spring Boot 的配置体验,还获得了更轻量、更响应式的配置管理能力 —— 尤其适合云原生微服务场景。配置即代码,外化即标准,从此告别散落各处的 getOrDefault 调用。










