详解spring cloud config实现datasource的热部署

详解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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Boot 多数据源处理事务的思路详解

    Spring Boot 多数据源处理事务的思路详解 为什么需要多数据源 在实际应用中,我们可能需要连接多个数据库来完成不同的业务需求,例如:用户数据存在 MySQL 数据库中,订单数据存在 MongoDB 数据库中,而且不同的数据源可能有不同的事务管理机制,为了更好地处理多数据源事务,我们需要进行多数据源处理。 Spring Boot 多数据源处理事务方案 …

    Java 2023年6月3日
    00
  • 如何检查线程状态?

    以下是关于如何检查线程状态的完整使用攻略: 如何检查线程状态? 在 Java 中,可以使用 Thread 类的 getState() 方法来获取线程的状态。该方法返回一个 Thread.State 枚举类型的值,表示线程的状态。 示例一:使用 getState() 方法获取线程状态。可以使用以下代码实现: public class MyThread exte…

    Java 2023年5月12日
    00
  • Springboot整合Freemarker的实现详细过程

    下面我将详细讲解Spring Boot整合Freemarker的实现过程。 一、添加Freemarker依赖 首先,在项目的pom.xml文件中添加Freemarker的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g…

    Java 2023年5月19日
    00
  • java分布式面试系统限流最佳实践

    针对Java分布式面试系统的限流最佳实践,我将分享以下攻略: 1. 需求调研与场景分析 首先,你需要了解你的系统在什么场景下存在限流的需求,例如有哪些接口需要限流、在什么情况下需要限流等等。在这个阶段中,你需要和业务对接人员进行沟通,了解产品的最大承载量、是否需要分区以及不同区之间的流量比例等。 2. 选择限流算法 常见的限流算法有令牌桶算法、漏桶算法以及计…

    Java 2023年5月24日
    00
  • PHP实现QQ空间自动回复说说的方法

    PHP实现QQ空间自动回复说说的方法 简介 在 PHP 中,可以通过调用第三方库实现登录QQ空间并发布评论、回复的功能。本文将介绍如何使用 PHP 向指定好友的说说进行自动回复。 整体思路 通过 QQ 登录,查找到指定好友的说说,获取说说的ID。通过模拟请求,向该说说增加回复。 具体来讲,可以分为以下步骤: 1.模拟登录 QQ 空间,获取 session、c…

    Java 2023年6月16日
    00
  • javascript实现自动填写表单实例简析

    下面我就为大家详细讲解一下“JavaScript实现自动填写表单实例简析”的完整攻略。 1. 确认表单元素 首先,在实现自动填写表单之前,我们需要先确认表单中需要填写的元素。可以通过浏览器的开发者工具或者JavaScript代码获取。在HTML中,表单元素通常通过<input>、<select>、<textarea>等标签…

    Java 2023年6月15日
    00
  • springboot与redis的简单整合实例

    在Spring Boot应用程序中,我们可以使用Redis来实现缓存和数据存储。以下是实现Spring Boot与Redis的简单整合实例的完整攻略: 添加依赖 在Spring Boot应用程序中,我们需要添加以下依赖来使用Redis: <dependency> <groupId>org.springframework.boot&lt…

    Java 2023年5月15日
    00
  • 【9种】ElasticSearch分词器详解,一文get!!!| 博学谷狂野架构师

    ElasticSearch 分词器 作者: 博学谷狂野架构师 GitHub:GitHub地址 (有我精心准备的130本电子书PDF) 只分享干货、不吹水,让我们一起加油!? 概述 分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具 什么是分词器 顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。…

    Java 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部