首页 / 资讯中心 / 文章详情

Apereo CAS 集成 Spring Cloud Etcd:外部化配置中心与运行时动态更新实战指南

Apereo CAS 集成 Spring Cloud Etcd:外部化配置中心与运行时动态更新实战指南 ★ FEATURED ARTICLE
后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载导读本文面向部署和维护 Apereo CAS 单点登录服务的开发者讲解如何借助cas-server-support-configuration-cloud-etcd模块将 CAS 的配置属性从 WAR 包中彻底剥离统一存放于 etcd 键值存储并支持运行时动态更新配置而无需重启服务。读完本文你将掌握该模块的依赖引入方式、cas.spring.cloud.etcd配置项的用法、etcd 中属性键的路径组织约定Profile 感知以及通过casConfig管理端点实现配置读取、加密、修改与清理的完整方案并有对应的源码与测试用例作为依据。一、功能定位CAS 配置从哪里来默认情况下CAS 的属性配置以application.properties等文件形式随应用包一同发布。一旦配置需要调整就必须重新构建或至少重启应用。Apereo CAS 的 Spring Cloud 配置体系允许把配置源外置到各类分布式存储中官方文档 明确指出CAS 能够使用 etcd 来定位locate属性和设置。适用场景包括多环境dev / test / prod共享同一套 CAS 部署包仅通过 Profile 从 etcd 拉取不同配置运维侧希望用统一的 etcd 管理界面或命令行工具维护 CAS 配置而无需触碰应用文件需要运行时动态调整属性如临时修改认证策略开关追求最小化停机时间。文档同时强调了一个容易被忽略的细节本模块并不专属于 Spring Cloud Configuration Server。虽然它主要在 Spring Cloud 配置服务器环境中发挥作用但也可以直接放进 CAS Server overlay 中使用——即由 CAS 自身充当配置消费者直接从 etcd 拉取设置。因此即便你没有独立部署配置中心同样可以享受 etcd 外部化配置的能力。二、在 WAR Overlay 中引入依赖在 CAS WAR Overlay 的build.gradle中声明如下依赖implementation org.apereo.cas:cas-server-support-configuration-cloud-etcd:${projectVersion}对应的模块位于仓库的 support/cas-server-support-configuration-cloud-etcd 目录。查看其 build.gradle可以看到该模块的核心依赖为libraries.springcloudbootstrap提供 Spring Cloud Bootstrap 阶段的PropertySourceLocator扩展点libraries.jetcdetcd 官方 Java 客户端jetcd内部依赖cas-server-core-configuration-api与cas-server-core-util-api。模块描述原文为Loads CAS configuration from etcd so settings can be managed outside the application package从 etcd 加载 CAS 配置使设置可以在应用包之外管理这正是本模块的设计意图。三、核心配置cas.spring.cloud.etcd属性前缀文档中通过casproperties宏声明了cas.spring.cloud.etcd这一属性前缀。结合源码CasEtcdCloudConfigBootstrapAutoConfiguration.java 中常量定义如下public static final String CAS_CONFIGURATION_PREFIX cas.spring.cloud.etcd;目前该前缀下最关键也是唯一必需的配置项是客户端端点地址。源码通过environment.getRequiredProperty(CAS_CONFIGURATION_PREFIX .endpoints)强制获取缺失会直接报错# application.properties / application.ymlWAR overlay 或启动参数 cas.spring.cloud.etcd.endpointshttp://localhost:2379,http://etcd-2.example.org:2379支持逗号分隔的多个端点客户端会基于这些端点构建io.etcd.jetcd.ClientBean ConditionalOnMissingBean(name etcdClient) public Client etcdClient(final ConfigurableEnvironment environment) { val endpoints environment.getRequiredProperty(CAS_CONFIGURATION_PREFIX .endpoints); return Client.builder() .endpoints(StringUtils.commaDelimitedListToSet(endpoints).toArray(String[]::new)) .executorService(Executors.newVirtualThreadPerTaskExecutor()) .build(); }从源码可以看到两个值得注意的实现细节端点支持高可用多个 endpoint 会被解析为集合并全部注入 jetcd Client由客户端自行处理节点故障切换虚拟线程执行器客户端使用Executors.newVirtualThreadPerTaskExecutor()对应 JDK 21 的虚拟线程说明该模块面向较新 JDK 运行环境设计。另外自动配置类上标注了ConditionalOnFeatureEnabled(feature CasFeatureModule.FeatureCatalog.CasConfiguration, module etcd)即该模块的生效受 CAS 功能开关体系控制需要在运行时启用对应 feature通常由模块本身或cas.feature.*开关驱动这是排查依赖已引入但属性源未生效时的第一检查点。四、配置加载的底层机制Bootstrap 阶段如何拉取属性Spring Cloud 的配置拉取发生在应用启动的 Bootstrap 阶段。本模块通过 spring.factories 注册为BootstrapConfigurationorg.springframework.cloud.bootstrap.BootstrapConfigurationorg.apereo.cas.config.CasEtcdCloudConfigBootstrapAutoConfiguration自动配置中会创建EtcdPropertySourceLocator并标记为最高优先级Bean ConditionalOnMissingBean(name etcdPropertySourceLocator) public PropertySourceLocator etcdPropertySourceLocator(Qualifier(etcdClient) final Client etcdClient) { return new EtcdPropertySourceLocator(etcdClient); }EtcdPropertySourceLocator.java 实现了 Spring Cloud 的PropertySourceLocator接口并使用Order(Ordered.HIGHEST_PRECEDENCE)声明最高优先级——这意味着从 etcd 拉取的属性在属性源链中拥有最高权重可覆盖本地配置文件中的同名属性。locator 在定位时传入当前激活的 Profile 列表return new EtcdPropertySource(sourceName, client, List.of(environment.getActiveProfiles()));五、etcd 中的键路径约定/cas/config/{profile}属性在 etcd 中如何存放直接决定了你是否能用好这个模块。从 EtcdPropertySource.java 的refresh()逻辑可以看到清晰的路径约定val profilesToChoose new ArrayList(this.profiles); profilesToChoose.add(default); this.propertyNames new LinkedHashSet(); profilesToChoose.forEach(profile - { val profilePath /cas/config/%s.formatted(profile); val keyPath ByteSequence.from(profilePath, StandardCharsets.UTF_8); val keyValues getSource().getKVClient().get(keyPath, GetOption.builder().isPrefix(true).build()).get().getKvs(); ... });规则总结如下规则说明根前缀所有配置键统一挂在/cas/config/之下Profile 维度每个 Profile 对应一个目录/cas/config/{profile}例如/cas/config/dev默认 Profile无论激活了哪些 Profiledefault目录始终会被读取前缀匹配使用GetOption.builder().isPrefix(true)做前缀扫描目录下所有键一次性拉取键名截取属性名 完整键去掉/cas/config/{profile}/前缀例如键/cas/config/default/cas.authn.accept.users对应属性cas.authn.accept.users因此要向 etcd 写入一个 CAS 属性实际命令形如# 写入默认 Profile 下的静态认证用户配置 etcdctl put /cas/config/default/cas.authn.accept.users casuser::WHATEVER # 写入指定 Profile如 dev下的服务注册表配置 etcdctl put /cas/config/dev/cas.service-registry.json.location file:/etc/cas/services模块自带的集成测试 CasEtcdCloudConfigBootstrapAutoConfigurationTests.java 验证的正是这条路径约定——测试在启动前向http://localhost:2379写入键/cas/config/default/cas.authn.accept.users随后断言casProperties.getAuthn().getAccept().getUsers()能取回该值证明 etcd 属性源已正确进入 Spring 环境并绑定到 CAS 配置属性对象。Profile 优先级由于 locator 按激活 Profile 列表 default的顺序读取且属性名会以Set去重实际生效规则是先读到的 Profile 键优先于后读到的同名键即激活列表中的 Profile 目录优先于default目录。若多个 Profile 同时激活则按激活列表顺序依次覆盖。六、运行时动态配置更新无需重启文档明确强调此能力支持运行时动态配置更新。这一承诺的落地依赖EtcdPropertySource对MutablePropertySource接口的实现。EtcdPropertySource.java 声明为public class EtcdPropertySource extends EnumerablePropertySourceClient implements MutablePropertySourceClient其中MutablePropertySource定义于 core/cas-server-core-configuration-api/src/main/java/org/apereo/cas/configuration/api/MutablePropertySource.java约定了一套可变的属性源操作契约setProperty(name, value)写入或更新属性getProperty(name)读取属性removeProperty(name)删除单个属性removeAll()清空当前属性源中所有属性refresh()重新从 etcd 拉取getPropertyNames(filterPattern)支持按正则过滤属性名。具体到 etcd 实现写入setProperty会先在已加载属性中按键名找到其所属的 Profile 目录找不到则回退到/cas/config/default然后拼出完整路径{profilePath}/{name}通过 jetcd KV 客户端put落盘并同步更新本地缓存删除removeProperty与removeAll都会对相应键执行kvClient.delete(...)真正从 etcd 中移除数据读取getProperty在本地属性名集合中命中后按{source}/{name}重新向 etcd 发起一次实时get保证拿到最新值。这种本地索引 实时读取的设计使得通过外部工具修改 etcd 后CAS 能在下一次读取该属性时感知到变化。集成测试中也完整验证了这一行为链测试对cas.server.prefix依次执行setProperty→ 断言读取 →removeProperty→ 断言已删除 →removeAll→ 断言属性数为 0见 CasEtcdCloudConfigBootstrapAutoConfigurationTests.java。七、Actuator 管理端点casConfig文档最后给出 CAS 提供的管理端点信息端点名称casConfig提供模块cas-server-support-reports该端点的实现位于 CasReportsAutoConfiguration.java通过CasConfigurationEndpoint对外暴露并配置了加解密用的CipherExecutorString, String即casConfigurationCipherExecutor。从配套测试 CasConfigurationEndpointTests.java 可以看到端点支持的主要操作HTTP 操作路径用途GET/POST/actuator/casConfig查看当前 CAS 配置属性源与属性内容POST/actuator/casConfig/encrypt对敏感配置值进行加密POST/actuator/casConfig/decrypt解密已加密的配置值POST/actuator/casConfig/update更新配置借助MutablePropertySource写回POST/actuator/casConfig/retrieve按条件检索属性DELETE/actuator/casConfig清空/重置配置使用时需注意管理端点默认受 Spring Boot Actuator 的安全与访问控制约束测试中以management.endpoint.casConfig.accessUNRESTRICTED放开权限生产环境应配置为受控访问如AUTHENTICATED或结合 CAS 自身安全策略更新类操作最终落到MutablePropertySource的实现上因此当属性源为 etcd 时update操作实际就是在修改 etcd 中的键值从而实现通过管理 API 改配置的闭环。八、本地快速验证一条命令启动 etcd仓库 CI 脚本 ci/tests/etcd/run-etcd-server.sh 给出了 etcd 服务的标准启动方式可直接用于本地验证export DOCKER_IMAGEregistry.k8s.io/etcd:3.7.1-0 docker run --quiet --rm -d --name etcd-server \ -p 2379:2379 -p 2380:2380 \ ${DOCKER_IMAGE} \ /usr/local/bin/etcd \ --listen-client-urlshttp://0.0.0.0:2379 \ --advertise-client-urlshttp://0.0.0.0:2379关键点客户端端口2379映射到宿主机与cas.spring.cloud.etcd.endpointshttp://localhost:2379对应镜像使用registry.k8s.io/etcd:3.7.1-0etcd 3.7.x 版本线监听地址明确绑定0.0.0.0:2379便于容器外访问。启动 etcd 后向其中写入任一 CAS 属性键如/cas/config/default/cas.authn.accept.users再以启用了cas-server-support-configuration-cloud-etcd依赖的 CAS 启动即可观察到属性被成功拉取并生效。九、使用注意事项小结Bootstrap 阶段生效属性拉取发生在 Spring Cloud Bootstrap 阶段cas.spring.cloud.etcd.endpoints本身必须能够在该阶段被解析通常放在application.properties或bootstrap.yml中否则getRequiredProperty会因取不到端点而启动失败。功能开关自动配置由ConditionalOnFeatureEnabled(feature CasConfiguration, module etcd)门控若依赖已引入但日志中看不到 etcd 属性源优先检查 feature 开关是否启用。键路径敏感务必遵循/cas/config/{profile}/{property-name}约定default目录始终生效写错根前缀例如写成/cas/...而非/cas/config/...会导致属性扫描不到。属性覆盖顺序etcd 属性源以Ordered.HIGHEST_PRECEDENCE注册优先级最高可覆盖本地文件配置多个 Profile 同名键按激活顺序取舍。端点访问控制casConfig端点具有读写能力且涉及加密/解密生产环境必须限制访问不可按UNRESTRICTED暴露。运行时更新的边界动态更新能力保证属性值可被重新读取与修改但具体某个配置是否能在不重启的情况下即时生效仍取决于该配置对应的 CAS 组件是否支持热刷新例如部分认证策略、注册表等建议结合具体功能模块的刷新机制评估。十、延伸阅读Spring Cloud 配置服务器管理官方文档本文的主题源头包含依赖引入与端点说明CasEtcdCloudConfigBootstrapAutoConfiguration.java模块自动配置与 jetcd 客户端构建EtcdPropertySource.java键路径约定、读写删改与刷新实现MutablePropertySource.java可变属性源抽象契约CasEtcdCloudConfigBootstrapAutoConfigurationTests.java端到端集成测试演示键写入、属性读取与运行时修改run-etcd-server.shCI 中 etcd 容器启动脚本CasConfigurationEndpointTests.javacasConfig端点加密、解密、更新、检索的完整测试。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Ryujinx在PC上免费畅玩Switch游戏的终极完整指南Ryujinx在PC上免费畅玩Switch游戏的终极完整指南 想要在电脑上体验任天堂Switch游戏的魅力吗Ryujinx Switch模拟器为你提供了完美后端认证鉴权单点登录G-Helper终极指南华硕游戏本轻量化控制完全手册G Helper终极指南华硕游戏本轻量化控制完全手册 G Helper是一款专为华硕笔记本和掌上设备打造的轻量级控制工具支持ROG Zephyrus、Flo后端认证鉴权单点登录Kiba ETL核心组件深度解析Source、Transform、Destination全攻略Kiba ETL核心组件深度解析Source、Transform、Destination全攻略 如果你正在寻找一个 简单高效 的Ruby ETL框架来处理数据后端认证鉴权单点登录上一篇Claude Code CLI启动技术7大核心机制揭秘与快速入门指南下一篇StarWars EF Core迁移实战类库项目迁移陷阱与Workaround完整解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站