单体项目中内置spring-cloud-config并使用mysql存储配置

2023-07-24 21:30:44 浏览数 (1)

简介随着微服务的流行,越来越多的项目开始使用配置中心来管理项目中复杂的配置,但是也有很多项目仍然在使用单体式架构,那么单体架构如何内置一个配置中心便于随时在后台修改配置呢。

1.依赖引入

代码语言:javascript复制
<!-- 健康管理 -->
<dependency>
      <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 内置配置中心,非微服务版 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>2.2.8.RELEASE</version>
        </dependency>
<!-- mysql数据库 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <!-- alibaba druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>

2.srcmainresourcesMETA-INF下新建spring.factories文件,内容如下:

此步骤主要是为了在bootstrap启动阶段加载DataSource和Jdbc,因为我们要使用jdbc作为配置存储。

代码语言:javascript复制
org.springframework.cloud.bootstrap.BootstrapConfiguration=
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration

3.srcmainresources下新建bootstrap.yml文件,内容如下:

代码语言:javascript复制
spring:
  application:
    name: summer # 必须在这里配置name
  profiles:
    active: dev,composite # 使用内置配置中心,生产打包时需要把dev改为prod
  cloud:
    config:
      label: main
      fail-fast: true
      server:
        prefix: /config
        bootstrap: true
        composite:
        - 
          type: jdbc
          sql: SELECT name, value from config_properties where APPLICATION=? and PROFILE=? and LABEL=?
          order: 1
  datasource:
    # Druid连接池配置
    type: com.alibaba.druid.pool.DruidDataSource
    # 初始化
    initialSize: 5
    # 最小
    minIdle: 5
    # 最大
    maxActive: 20
    # 最大连接等待超时时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打开PSCache,并且指定每个连接PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙
    filters: stat,wall,log4j2
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    useGlobalDataSourceStat: true

4.srcmainresources下新建bootstrap-dev.yml文件,内容如下:

代码语言:javascript复制
spring:
  # 因为配置中心使用jdbc作为存储,所以需要在bootstrap中配置数据库连接
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://xxx.com:3306/summer?characterEncoding=UTF-8&useSSL=true
    username: root
    password: 123456

5.srcmainresources下新建bootstrap-prod.yml文件,内容如下:

这里是方便开发与生产使用不同的数据库。

代码语言:javascript复制
spring:
  # 因为配置中心使用jdbc作为存储,所以需要在bootstrap中配置数据库连接
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://xxx.com:3306/summer_prod?characterEncoding=UTF-8&useSSL=true
    username: root
    password: 123456

6.新建数据表

代码语言:javascript复制
CREATE TABLE `config_properties` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_bin NOT NULL,
  `value` varchar(500) COLLATE utf8_bin DEFAULT NULL,
  `application` varchar(50) COLLATE utf8_bin NOT NULL,
  `profile` varchar(50) COLLATE utf8_bin NOT NULL,
  `label` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `config_properties` (`id`, `name`, `value`, `application`, `profile`, `label`) VALUES
(1, 'summer.site.title', '测试', 'yiju', 'dev', 'main');

7.删除application.yml、application-dev.yml、application-prod.yml中的datasource配置

如果您需要将配置和业务数据库分开,那么此步骤不需要执行。

8.在配置表中修改配置后不会立即执行,需要触发更新。

代码语言:javascript复制
curl -X POST http://localhost:8080/actuator/refreshh   

0 人点赞