Spring Cloud配置中心(Config)
Spring Cloud配置中心(Config)
Spring Cloud是现在流行的分布式服务框架,它提供了很多有用的组件。比如:配置中心、Eureka服务发现、 消息总线、熔断机制等。
配置中心在Spring Cloud的众多组件中是比较基础的,它提供了配置文件的统一管理,可以很轻松的切换不通的环境。 它的具体结构如下:
- 存储配置文件的文件系统(通常使用git)
- 配置中心服务端(从文件系统获取最新的配置文件,为客户端提供配置信息)
- 配置客户端(从配置中心获取配置信息)
Spring Cloud是建立在Spring Boot基础上的,Spring Cloud离不开Spring Boot,所以我们的项目都是基于Spring Boot的。
配置文件一般我们放在git上,也好做版本控制。接下来我们讲一下配置中心的搭建。
配置中心搭建
首先,引入Spring Boot和Spring Cloud的依赖BOM:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</version> <type>pom</type> <scope> import </scope> </dependency> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version> 1.5 . 9 .RELEASE</version> <type>pom</type> <scope> import </scope> </dependency> </dependencies> </dependencyManagement> |
这里我们需要仔细看一下官方文档,Spring Cloud的Finchley版本是基于Spring Boot2.0的,在Spring Boot1.5下 是不能工作的。而Edgware版本是基于1.5的,在2.0下不能正常工作。这点大家要注意,以免出现不必要的麻烦。 这里我们采用Spring Cloud 的Edgware和Spring Boot的1.5版本。
然后倒入必须的依赖,如下:
1 2 3 4 5 6 7 8 9 10 | <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> |
最后编写配置中心的启动类,如下:
1 2 3 4 5 6 7 | @SpringBootApplication @EnableConfigServer public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication. class , args); } } |
@EnableConfigServer
标志着这个服务是一个配置中心服务,具体的信息在application.properties
文件中配置:
1 2 3 4 5 6 | #服务端口 server.port= 9000 #配置文件的git地址 spring.cloud.config.server.git.uri=https: //github.com/liubo-tech/spring-cloud-properties #配置文件的临时文件目录 spring.cloud.config.server.git.basedir=/d:/config-repo |
服务端口和git地址大家都比较明白,第三个是配置临时文件的目录。在配置中心被调用后,配置中心会从git 上拉取配置文件,并在本地缓存,这个就是配置缓存的目录,也可以不配置,使用系统默认的。 这样配置中心就搭好了,也可以通过Nginx搭建集群做的高可用。
访问配置文件格式的如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中:
{application}
对应客户端的应用名称(spring.application.name){profile}
对应客户端的spring.profiles.active{label}
是可选的git标签(默认为“master”)。
客户端调用
以前配置文件都是放在项目中,这使得我们在切换不同环境时非常麻烦,一些配置的敏感信息也对开发人员暴露了。 使用统一的配置中心就可以避免这些,让我们看一看客户端是如何调用的。
首先,导入必须依赖的jar包,如下:
1 2 3 4 5 6 7 8 9 10 | <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> |
只要Spring Cloud Config Client的jar在项目的classpath下,它就会在项目启动时从配置中心获取配置,通过 bootstrap配置文件中的spring.cloud.config.uri属性指定配置中心。
这使得客户端的项目必须有一个bootstrap.yml或者bootstrap.properties文件,否则客户端是不会从配置中心加载配置文件的。
我们创建bootstrap.properties,如下:
1 2 | #配置中心地址 spring.cloud.config.uri=http: //localhost:9000 |
指定配置中心的地址,上面的例子中,配置中心的端口我们指定9000。我们在application.properties文件中配置应用的名称:
1 | spring.application.name=eg-config |
我们应用叫作“eg-config”,项目启动时会从配置中心加载eg-config的文件。接下来我们做个例子,创建一个Bean,并从配置中心注入值
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Component public class MyBean { @Value ( "${my.name}" ) private String name; public String getName() { return name; } public void setName(String name) { this .name = name; } } |
其中,name会从配置中心加载属性my.name。启动类如下:
1 2 3 4 5 6 7 8 9 10 11 | @SpringBootApplication public class Application { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(Application. class , args); //获取bean并打印name字段 MyBean bean = applicationContext.getBean(MyBean. class ); System.out.println(bean.getName()); } } |
启动后,控制台打印的结果如下:
1 | test |
这样配置中心就介绍完了,具体请参考项目示例:https://github.com/liubo-tech/spring-cloud-config。
*如果您觉得对您有帮助,请关注+推荐
*您的支持就是我继续下去的动力
*承接项目+V:ronaldoliubo
***************************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端