详解Spring Cloud Config实现Datasource的热部署
前言
Spring Cloud Config是一个分布式配置中心,它可以将应用的配置集中管理并进行统一的配置管理。在一些场景下,我们需要配置信息能够动态变更,而这时我们便需要将配置文件的热部署进行实现。 在这篇文章中,我们将详细讲解如何使用Spring Cloud Config实现Datasource的热部署。
步骤
步骤一:添加依赖
在工程的pom文件中添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.2.0</version>
</dependency>
步骤二:配置文件
在配置文件中添加如下配置:
spring:
application:
name: datasource-demo
cloud:
config:
uri: http://config-server:8888
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: HikariCP
maximum-pool-size: 10
max-lifetime: 30000
leak-detection-threshold: 60000
idle-timeout: 10000
spring.cloud.config.uri
表示配置服务的地址,spring.datasource
表示数据源的配置,其中 type
需要指定为 com.zaxxer.hikari.HikariDataSource
,以启用 Hikari 连接池的支持。
步骤三:配置服务端
新建Spring Boot项目用于作为配置中心(config-server),并添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
在 application.yml
中添加如下配置:
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/username/repo.git
search-paths: '{profile}'
username: ${GIT_USERNAME}
password: ${GIT_PASSWORD}
其中 spring.cloud.config.server.git.uri
表示配置文件所在的Git仓库地址, spring.cloud.config.server.git.search-paths
表示配置文件所在的目录,在这里可以使用占位符 {profile}
来指定配置在仓库中应该存在哪个文件夹下,方便不同环境下的管理。
步骤四:配置客户端
在项目中添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
在 bootstrap.yml
中添加如下配置:
spring:
application:
name: datasource-demo
cloud:
config:
uri: http://config-server:8888
profile: dev
label: master
其中 spring.cloud.config.label
表示从Git仓库中那个分支获取配置文件,spring.cloud.config.profile
表示要获取的配置文件所在的文件夹。
步骤五:配置监听器
在 ApplicationContext
中添加 @RefreshScope
注解和监听配置刷新事件的监听器,如下所示:
@Component
@RefreshScope
public class DataSourceRefreshListener {
private static Logger logger = LoggerFactory.getLogger(DataSourceRefreshListener.class);
@Autowired
DataSource dataSource;
@EventListener
public void refresh(ConfigRefreshEvent e) {
try (
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement()
) {
ResultSet rs = stmt.executeQuery("select 1");
if (rs.next()) {
logger.info("Refresh Datasource Success!");
}
} catch(SQLException ex) {
logger.error("Refresh Datasource Failed. Error: {}", ex.getMessage());
}
}
}
在监听器实现类中,我们使用 @Autowired
注解注入 DataSource
,并在 @EventListener
注解的方法中通过 getConnection()
方法获取连接,从而判断连接是否可用,若可用则表示配置刷新成功。
示例说明
示例一:本地测试
我们可以在本地测试环境中进行测试,具体步骤如下:
- 启动config-server项目。
- 执行maven命令
mvn spring-boot:run
启动datasource-demo项目,之后会输出“ Refresh Datasource Success!”。 - 修改配置文件中的数据库名和用户名等信息,再执行
POST http://localhost:8080/actuator/refresh
请求,等待数秒后,输出“Refresh Datasource Success!”,表示配置已经成功刷新。
示例二:Docker Compose 测试
我们可以使用 Docker Compose 进行测试,具体步骤如下:
- 将上述准备好的项目和配置文件保存,创建
docker-compose.yml
文件,内容如下:
version: '3'
services:
config-server:
build:
context: ./config-server
ports:
- "8888:8888"
environment:
GIT_USERNAME: your-github-username
GIT_PASSWORD: your-github-password
volumes:
- ./config:/config
datasource-demo:
build:
context: ./datasource-demo
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: docker
depends_on:
- config-server
- 在终端中进入到该文件所在的文件夹下,执行
docker-compose up
命令,等待容器启动成功。 - 修改
config
文件夹中的配置文件,将数据库名和用户名等信息修改,保存后观察datasource-demo
日志的输出,可以看到输出了 "Refresh Datasource Success!",表示配置已经成功刷新。
总结
通过以上步骤,我们就可以成功实现Spring Cloud Config客户端的配置文件热部署。而在外部配置服务(config-server)中对配置文件进行修改后,只需执行一次刷新请求,即可将最新的配置文件信息更新到客户端中。 该方法的好处在于,保证配置的一致性,提高了系统的可靠性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解spring cloud config实现datasource的热部署 - Python技术站