Spring Boot微服务多模块间如何共享配置文件?
问题描述
使用Consul作为外部配置中心,多个模块间存在大量重复YAML配置(如Redis、Consul连接及发现配置),敏感配置已迁移至配置中心,但配置中心连接等通用配置仍需重复复制。
当前采用父子项目结构,包含auth和common两个模块,尝试将common作为依赖引入auth后,移至common的配置未生效,导致auth启动失败。
期望实现:
common模块的配置文件定义通用配置auth模块引入common后自动继承其配置auth可按需覆盖common中的特定配置
common模块示例配置:
# config in commons spring: cloud: consul: host: 192.168.124.147 port: 8500 config: ... com: example: my: auth: parameter: Authorization time: 1 unit: hours config: ...
auth模块示例配置:
# config in auth spring: cloud: consul: host: 192.168.124.148 # 无需修改common中定义的其他默认属性 com: example: my: auth: time: 2 # 无需修改common中定义的其他默认属性
可行解决方案
1. 把common的配置文件改成bootstrap.yaml
Spring Cloud里bootstrap.yaml的加载优先级高于application.yaml,且依赖该模块的项目会自动加载它。之前用application.yaml可能因加载顺序问题导致配置不生效,改成bootstrap.yaml后,auth模块会先加载common的bootstrap配置,再加载自身的application配置,相同属性会自动被auth的配置覆盖。
注意:如果是Spring Cloud 2020.0及以后版本,需要在common的pom.xml手动引入bootstrap依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
2. 确保common的配置被正确打包并引入
先检查common的pom.xml,确保配置文件能被打包到jar包中:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*.yaml</include> <include>*.yml</include> </includes> </resource> </resources> </build>
再检查auth的pom.xml,确认common依赖的scope为compile(默认就是该值,一般无需修改):
<dependency> <groupId>你的groupId</groupId> <artifactId>common</artifactId> <version>你的版本号</version> </dependency>
3. 用配置类统一管理通用配置
在common模块中定义配置类绑定通用属性,auth模块引入后可直接使用,需要覆盖时仅修改自身配置文件即可:
- 在common中创建配置类:
@ConfigurationProperties(prefix = "spring.cloud.consul") public class ConsulConfigProperties { private String host; private int port; // 添加getter、setter方法 } @ConfigurationProperties(prefix = "com.example.my.auth") public class AuthConfigProperties { private String parameter; private int time; private String unit; // 添加getter、setter方法 }
- 创建自动配置类启用这些属性:
@Configuration @EnableConfigurationProperties({ConsulConfigProperties.class, AuthConfigProperties.class}) public class CommonAutoConfiguration { }
- 在common模块的
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加配置类的全路径,确保auth引入common后自动加载:
com.example.common.config.CommonAutoConfiguration
4. 利用Maven父子项目的Profile继承配置
如果是Maven父子项目结构,可以在父项目中存放通用配置,子模块通过Profile引入并按需覆盖:
- 在父项目
src/main/resources下创建application-common.yaml,存放通用配置:
spring: cloud: consul: host: 192.168.124.147 port: 8500 config: ... com: example: my: auth: parameter: Authorization time: 1 unit: hours config: ...
- 在父项目pom.xml中配置资源过滤,确保子模块能读取到该配置文件:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>application-common.yaml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
- 在auth模块的application.yaml中通过
spring.profiles.include引入通用配置:
spring: profiles: include: common cloud: consul: host: 192.168.124.148 com: example: my: auth: time: 2
内容的提问来源于stack exchange,提问作者Emiya Elien
相关产品推荐
相关产品推荐

