1. 概述
1.1 配置
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。
在实际开发中,配置文件往往有以下一些配置:
- 数据库地址、用户名密码
- 各种框架的配置项,例如
Spring Boot
、Mybatis
、RabbitMQ
都有很多配置 - 项目参数配置,例如是否开启短信登录、密码限制长度等
配置可以让静态的系统工件或者交付物(如WAR
,JAR
包等)更好地和实际的物理运行环境进行适配。这些配置项往往都是以配置文件的形式存在,在系统部署的过程中,由系统管理员或者运维人员完成。
在Spring Cloud
微服务项目中,后台一般都有很多个,每个Spring Boot
都有一个application.yml
配置文件,这些配置是分散的,非常不方便管理。而且配置并不是一成不变的,往往还需要根据系统环境运行状态进行实时变更。
1.2 配置中心
配置中心就是一个集中式管理配置信息的解决方案,它最核心的功能就是配置管理,可以进行配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等与配置相关的活动。
常见的配置中心有:
Nacos
Apollo
Spring Cloud Config
在使用Nacos
作为注册中心后,一般都会直接选择Nacos
的配置中心,而不会去再接入一个第三方组件,接下来我们学习如何使用Nacos
进行管理配置。
2. 案例演示
注:还是在之前的案例代码基础上进行集成,使用的是Spring Cloud
生态环境。
2.1 环境搭建
引入配置中心依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
application.yml
配置文件添加配置:
server:
port: 9003
spring:
application:
name: order-demo
cloud:
nacos:
# 服务端用户名密码
username: nacos
password: nacos
# 服务发现
discovery:
# 命名空间
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
# 服务端地址,默认:127.0.0.1:8848
server-addr: 127.0.0.1:8848
# 配置中心
config:
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
server-addr: 127.0.0.1:8848
这时启动项目会直接报错,提示我们没有导入配置:
09:33:07.022 [main] DEBUG org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter -- Application failed to start due to an exception
org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set
2.2 自定义参数配置
配置项通常都是由参数名称与参数值组成,一组相关或者不相关的配置项的集合称为配置集,在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。
除了配置后台服务,业务系统中也会存在很多系统配置参数,比如OA
系统中需要配置一个密码长度限制参数。对于这些系统配置,我们可以放在数据库进行管理,但是需要开发前端管理页面,读取配置时每次都需要查询数据库,就算使用缓存,也需要支持缓存同步。这时可以使用Nacos
配置中心进行管理,这样更方便,并支持动态刷新。
对于上面的报错提示,在Nacos 1.x
的版本中,使用的是bootstrap.yml
添加Nacos
相关配置,例如:
server:
port: 9005
spring:
application:
name: app-service001
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
enabled: true
bootstrap.yml
机制是由spring-cloud-starter-bootstrap
提供的,Spring Boot
默认不支持,在Spring Boot 2.4
之后的版本,提供了spring.config.import
导入配置的方式,并支持远程配置中心,所以Spring Cloud
也就移除了spring-cloud-starter-bootstrap
,Spring Cloud Alibaba
在2021.0.1.0
开始,也移除了这种方式,改用spring.config.import
作为默认集成配置中心的方式。
使用spring.config.import
导入Nacos
中的配置,nacos:system-param.yaml
由两部分组成,第一部分表示某个类型的注册中心,第二部分表示对应的配置集ID
:
spring:
application:
name: order-demo
# 导入配置
config:
- nacos:system-param.yaml # 在拉取nacos配置异常时会快速失败,会导致 spring 容器启动失败
#- optional:nacos:test.yml # 监听 DEFAULT_GROUP:test.yml
#- optional:nacos:test01.yml?group=group_01 # 覆盖默认 group,监听 group_01:test01.yml
#- optional:nacos:test02.yml?group=group_02&refreshEnabled=false # 不开启动态刷新
# 省略其他......
进入到控制台,选择进行的命名空间,点击创建配置:
添加配置:
Nacos
根据以下规则找到对应的配置:
命名空间+分组+数据集ID
其中命名空间,之前我们已经介绍过了,分组表示对配置集进行分组,从而区分Data ID
相同的配置集。这里未填写配置分组的名称,默认采用DEFAULT_GROUP
作为分组名。当不同的应用或组件使用了相同的配置类型时,可以添加分组进行隔离。
Data ID
表示配置集ID
,简单理解为配置文件名称,一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
Data ID
完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
相关说明:
prefix
: 默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
: 即为当前环境对应的profile
,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId
的拼接格式变成${prefix}.${file-extension}
。file-exetension
: 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
添加完成后,显示如下:
使用@Value @RefreshScope
注解获取配置,@RefreshScope
是Spring Cloud
原生注解用于实现配置自动更新:
@RequestMapping("/order")
@RestController
@RefreshScope
public class OrderController {
@Value("${password.length}")
Integer length;
@GetMapping("/length")
public Integer length() {
return length;
}
}
访问接口,然后修改配置,观察是否动态刷新:
2.2 服务配置
除了这些自定义配置项,还可以将Spring Boot
、Mybatis
、RabbitMQ
等各种框架的配置项放在配置中心,项目部署时,直接在Nacos
中修改配置即可。
首先创建一个后台服务的配置集,Data ID
为服务名加文件后缀,添加服务启动端口。除此还可以添加数据库、Redis
、MQ
等部署时需要改动的配置项:
application.yml
文件中,只保存一些不会变动的配置项,以及Nacos
的配置,并使用spring.config.import
导入服务配置:
spring:
application:
name: order-demo
cloud:
nacos:
# 服务端用户名密码
username: nacos
password: nacos
# 服务发现
discovery:
# 命名空间
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
# 服务端地址,默认:127.0.0.1:8848
server-addr: 127.0.0.1:8848
# 配置中心
config:
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
server-addr: 127.0.0.1:8848
# 导入配置
config:
import:
- nacos:order-demo.yaml # 服务配置
- nacos:system-param.yaml # 系统参数配置
启动项目,查看启动端口是否使用的是配置中心的配置,无误则集成成功。
因为application.yml
配置了Nacos
的地址,在部署时需要修改,这时可以使用启动命令直接覆盖参数即可,例如:
java -Dspring.cloud.nacos.discovery.server-addr=xxx -Dspring.cloud.nacos.discovery.namespace=xxx -Dspring.cloud.nacos.config.server-addr=xxx ......