在我们的日常开发中,经常需要对数据库的连接配置、第三方接口的对接密钥等重要数据进行管理。
同时呢,开发环境、测试环境、生产环境,环境不同,配置也是不一样的,在不同的环境使用不同的配置,这也需要对不同环境的配置进行单独管理。
Spring-Cloud为我们提供了配置管理的微服务框架 Spring Cloud Config,正好解决了这个棘手的问题。
这个框架也不是新框架了,本篇文章使用 JDK17、Spring-Boot3.4.3 代替以前使用的JDK8、SpringBoot2.1.4.release版本,把这个框架重新过一遍,看看有什么变化。
一、什么是 Spring Cloud Config?
Spring Cloud Config 是一个用于集中式配置管理的框架,它可以将所有微服务的配置信息统一存储和管理。
这样,所有的微服务都可以从配置中心获取到相应的配置信息,并且支持动态刷新配置,避免了每次修改配置后都需要重启服务的麻烦。
本次使用的spring-cloud-dependencies版本为2024.0.0:
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2024.0.0</version>
<type>pom</type>
<scope>import</scope>
二、搭建 Spring Cloud Config 服务中心
配置服务中心是 Spring Cloud Config 的核心,它负责存储和管理微服务的配置信息。
我们将搭建一个 Spring Boot 应用来作为配置服务中心(Config Server)。
1、建立一个SpringBoot项目,打开pom.xml文件,确认包含以下依赖:
<!-- Spring Cloud Config Server依赖 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
2、在项目的主类中,添加@EnableConfigServer注解来启用配置服务功能:
package com.example.configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer // 启用 Spring Cloud Config Server
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3、配置application.properties文件,指定端口号和配置文件位置:
server.port=8800 # 设置服务中心的端口
spring.application.name=config-server # 配置服务名称
spring.profiles.active=native # 配置文件本项目中
spring.cloud.config.server.native.search-locations=classpath:/config
我把配置放在了本项目里,配置文件具体位置在src/main/resources的config目录下。
项目结果图如下:
在config 这个文件里,我定义了两个配置,一个指向开发环境,一个指向生产环境。
三、搭建 Spring Cloud Config 客户端
客户端是需要从配置服务中心获取配置信息的应用。
我们将创建一个 Spring Boot 项目作为配置客户端(Config Client),它会从配置服务中心加载配置信息。
1、创建一个SpringBoot 项目,打开pom.xml文件,确认它包含以下依赖:
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
在 Spring-Cloud 2020.0.x 就不再支持主动加载 bootstrap.properties 文件,如果想主动加载这个文件,就需要引入 spring-boot-configuration-processor 框架。
如果不加入这个框架,在启动项目时会报错:
No spring.config.import property has been defined
Action:
Add a spring.config.import=configserver: property to your configuration.
If configuration is not required add spring.config.import=optional:configserver: instead.
To disable this check, set spring.cloud.config.enabled=false or spring.cloud.config.import-check.enabled=false.
spring-boot-configuration-processor 框架是在IDE提示下加的,它有什么作用呢?
在编译过程中,spring-boot-configuration-processor 会自动生成 META-INF/spring-configuration-metadata.json 文件。这个文件包含了 Spring Boot 配置类的所有属性及其描述信息,例如每个属性的类型、默认值、合法值等。这个文件有助于 IDE(如 IntelliJ IDEA 和 Eclipse)在开发过程中提供自动补全和智能提示。
只要我们在类中使用了 @ConfigurationProperties 配置,IDE中就会提示我们添加这个框架。
另外,配置类可以通过 @Validated 注解进行校验,而 spring-boot-configuration-processor 也能帮助 IDE 更好地识别和校验配置属性。
2、配置application.properties文件,给客户端指定端口号:
server.port=8101# 设置客户端服务的端口
spring.application.name=api # 客户端服务名称
3、配置bootstrap.properties文件,指向配置中心服务器:
#指向配置服务的ip地址
spring.cloud.config.uri=http://127.0.0.1:8800
#获取开发环境的配置
spring.cloud.config.profile=dev
4、创建一个控制器来获取配置文件中的属性:
package com.example.configclient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclass ConfigController {
@Value("${my.config.property}")
private String myConfigProperty;
@GetMapping("/config")
public String getConfig() {
return"配置属性值: " + myConfigProperty;
}
}
在这个控制器中,@Value注解将会从配置服务中心加载名为my.config.property的配置属性。
四、验证配置的获取
1、启动配置服务中心的主类
2、启动客户端的主类
3、访问http://localhost:8101/config
五、客户端获取配置的两种方式
1、通过固定ip地址获取配置服务器地址
#指向配置服务的ip地址
spring.cloud.config.uri=http://127.0.0.1:8800
这种方式适合ip地址固定的项目。
2、通过服务发现
# 开启服务发现功能
spring.cloud.config.discovery.enabled=true
#指向配置服务中心的名称
spring.cloud.config.discovery.service-id=config-center
如果我们使用了服务发现功能,就可以通过服务名称获取配置,这样就可以不关心ip地址动态获取配置服务中心的配置了。
这种方式适合集成了服务发现功能的集群项目。
五、最后总结
通过以上两个简单的项目,我们使用 Spring Cloud Config 框架成功地搭建了配置服务中心(Config Server)和配置客户端(Config Client)的基础功能。
对比老版本,确实有新变化,比如对 bootstrap.properties 配置文件的读取,原来默认支持获取,现在需要添加额外框架读取。
时间有限,至于其他变化还需要在使用中逐一发现。
领取专属 10元无门槛券
私享最新 技术干货