案例源码gitee地址:https://gitee.com/BanSheng/spring-cloud-alibaba-examples/tree/master/nacos-examples
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。
上一节 Spring Cloud Alibaba Nacos 注册中心记录了 Nacos 作为注册中心的使用方式,这节继续记录下Nacos作为配置中心的使用方式。本节使用的Spring Cloud版本为Hoxton.SR3,SpringCloud Alibaba 版本为 2.2.0.RELEASE,Spring Boot 版本为 2.2.3.RELEASE。
我们将在我们 nacos-examples 的基础上,搭建一个 config-client,用来今天 nacos 配置中心的案例测试
使用 IDEA 创建一个 Maven 模块:
点击下一步:
Parent:选择 nacos-examples
Name:config-client
其他的项,保持默认。
点击 FINISH 完成创建的过程:
我们的项目继承自 nacos-examples,它里面已经包含 2 个基本的依赖:
现在,我们在里面添加今天我们要学习的配置获取的组件:
spring-cloud-alibaba-nacos-config
编辑 config-client 里面的 pom.xml 文件,添加以下的内容:
com.alibaba.cloud
spring-cloud-alibaba-nacos-config
在添加一个 mavne 的打包插件:
org.springframework.boot
spring-boot-maven-plugin
现在,项目里面已经包含上面的 3 个依赖了。
nacos-examples
com.bjsxt
1.0
4.0.0
config-client
com.alibaba.cloud
spring-cloud-alibaba-nacos-config
org.springframework.boot
spring-boot-maven-plugin
至此,项目的搭建完成了。
相关的工作图,如图:
Nacos-client 会从 Nacos-Server 里面获取配置文件,首先,Nacos-Server 里面需要有配置文件才能获取。
新建如下所示的配置信息:
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置内容: user.name=nacos-config-properties
user.age=90
打开 Nacos 的管理页面:
现在我们看见,里面还没有任何的配置信息。
点击:
让我们来新建一个配置项:
填写的表单如下:
点击发布,完成配置文件的发表任务:
返回后,配置信息已经发布成功:
我们将演示在 config-client 里面获取上面我们写的 2 个配置信息
文件名称为:
注意:不是 application.yml ,bootstrap.yml 比 application 有更高的优先级。
Idea 能自动的识别该文件的格式:
编辑该文件,添加以下内容:
server:
port: 8070
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config: # 指定配置中心的地址和配置中心使用的数据格式
server-addr: localhost:8848
file-extension: properties
application:
name: config-client
配置说明:
server.port: 服务的运行端口
名称为:com.bjsxt.ConfigClientApplication
编辑该类:
@SpringBootApplication
@EnableDiscoveryClient
@RefreshScope
@RestController
public class ConfigClientApplication {
@Value("${user.name}")
private String userName ;
@Value("${user.age}")
private Integer userAge ;
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class,args) ;
}
/**
* 获取配置文件里面用户的信息
* @return
*/
@GetMapping("/user/info")
public ResponseEntity getUser(){
return ResponseEntity.ok(String.format("从配置中心获取的信息为:user:%s,age:%s",userName,userAge)) ;
}
}
说明:
@RefreshScope:代表配置文件是可以被刷新的
@Value:从 env 里面获取配置信息
在浏览器里面输入:
http://localhost:8070/user/info
效果已经完成了。
nacos 配置中心通过 namespace、dataId 和 group 来唯一确定一条配置。
其中:dataId 是最关键的配置字段:格式如下:
${prefix} - ${spring.profiles.active} .${file-extension}
说明:
这就是上面我们为什么能获得到配置的原因了。
Nacos 配置中心的 namespace、dataId 和 group 可以方便灵活地划分配置。比如,我们现在有一个项目需要开发,项目名称为 bjsxt,项目开发人员分为两个组:GROUP_A 和 GROUP_B,
项目分为三个环境:开发环境 dev、测试环境 test 和生产环境 prod。
Bjsxt->GRUOR_A->dev
点击新建命令空间:
填写以下的内容:
点击确定,完成创建。
完成后,如图所示:
新建完成后:我们看见它自动帮我们生产了一个 ID:
8defab18-df88-49e5-b13e-526f89da87ad
记录该 ID 值。
切换完成后,点击 +:
填写以上的信息。点击发布:
完成后:
已经完成创建。
修改 config-client 里的 bootstrap.yml 文件:
server:
port: 8070
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config: # 指定配置中心的地址和配置中心使用的数据格式
server-addr: localhost:8848
file-extension: yml #properties
group: GROUP_A # 获取 GROUP_A 里面的配置
namespace: 8defab18-df88-49e5-b13e-526f89da87ad # 命名空间,写 id的值
#prefix: ${spring.application.name} # 前缀,默认为应用的名称,不需要修改
application:
name: config-client
profiles:
active: dev # 使用的 dev 环境的配置
浏览器访问:
http://localhost:8070/user/info
得到:
配置信息已经获取成功。
Nacos 中,修改配置点击发布后会创建一个对应的历史版本快照,我们可以在 Nacos 控制台的历史版本列表中找到这些快照。
该注解,可以刷新配置。故无需启动就能看见最新的配置信息。
修改 user.name ,user.age:
点击发布。
出现对比页面:
点击确认发布:
然后点击返回。
可以看见修改的日期。
将配置信息回滚为之前的版本:
根据修改时间,我们将 12:38:53 的数据回滚为 12:25:12 的数据:
已经自动的展示回滚的内容了,点击回滚配置:
点击确认,完成回滚:
再次测试:
浏览器输入:
http://localhost:8070/user/info
已经回滚成功了:
除了通过上面的方式指定一个唯一配置外,我们还可以同时获取多个配置文件的内容。
server:
port: 8070
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
extension-configs: # 多个配置
- dataId: test-a.yml
group: DEFAULT_GROUP
refresh: true
- dataId: test-b.yml
group: DEFAULT_GROUP
refresh: false
# 指定配置中心的地址和配置中心使用的数据格式
# server-addr: localhost:8848
# file-extension: yml #properties
# group: GROUP_A # 获取 GROUP_A 里面的配置
# namespace: 8defab18-df88-49e5-b13e-526f89da87ad # 命名空间,写 id 的值
## prefix: ${spring.application.name} # 前缀,默认为应用的名称,不需要修改
application:
name: config-client
profiles:
active: dev # 使用的 dev 环境的配置
说明:
上 面 的 配 置 中 , 我 们 分 别 从 DEFAULT_GROUP 中 获 取 了 config-client-a.yml 和config-client-b.yml 配置内容,并且 config-client-a.yml 支持刷新,config-client-b.yml 不支持刷新。
注意:
没有 namespace 的配置,言外之意就是 Nacos 目前还不支持多个配置指定不同的命名空间。
config-client-a.yml:
切换 namespace:
点击 + 完成创建:
点击发布。
config-client-b.yml
完成后:
重启 config-client,测试:
浏览器访问:
配置项 | key | 默认值 | 说明 |
服务端地址 | spring.cloud.nacos.config.server-addr | ||
DataId 缀 | spring.cloud.nacos.config.prefix | spring.application.name | |
Group | spring.cloud.nacos.config.group | DEFAULT_GROUP | |
dataID 缀及内容文件格式 | spring.cloud.nacos.config.file-extension | properties | dataId 的后缀,同时也是配置内容的文件格式,目前只支持properties |
配置内容编码方式 | spring.cloud.nacos.config.encode | UTF-8 | 配置的编码 |
获取配置超时时间 | spring.cloud.nacos.config.timeout | 3000 | 单位为 ms |
配置的命空间 | spring.cloud.nacos.config.namespace | 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。 | |
AccessKey | spring.cloud.nacos.config.access-key | ||
SecretKey | spring.cloud.nacos.config.secret-key | ||
相对路径 | spring.cloud.nacos.config.context-path | 服务端 API 的相对路径 | |
接入点 | spring.cloud.nacos.config.endpoint | 地域的某个服务的入域名,通过此域名可以动态地拿到服务端地址 | |
是否开启听和自动刷新 | spring.cloud.nacos.config.refresh.enabled | true |