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