Nacos配置管理
新建配置文件
当微服务部署的实例越来越多时,如果需要修改微服务的配置就需要逐个修改配置文件并且还要重启关联的微服务十分繁琐还易出错
项目中的配置文件分为每个项目特有的配置,项目所公用的配置
-
每个项目特有的配置
: 有些项目中需要但有些项目中又不需要的配置,或者在每个项目中配置的值不同的配置- 比如
spring.application.name
每个项目都需要配置但值不一样 - 有些项目需要连接数据库/消息队列而有些项目不需要,有些项目需要配置消息队列而有些项目不需要
- 比如
-
项目所公用的配置
: 在若干项目中配置内容相同的配置,比如很多项目一般用的是同一套的Redis服务的配置
Nacos除了可以做注册中心同样还可以集中管理所有服务实例的配置
热更新
: 在配置变更时及时通知微服务实例实现配置的热更新,即不需要重启服务实例修改后的配置就可以立即生效- 只有运行时需要调整配置属性值的配置才有被Nacos管理的必要,基本不会变更的一些配置还是保存到微服务本地如数据库连接配置
在Nacos的配置管理中添加配置文件: 配置列表->点击右侧加号->填写表单中的配置信息
配置拉取
引入方式
引入配置文件的形式有三种形式: 以服务名称
方式引入,以扩展配置文件(extension-configs)
方式引入,以共享配置文件(shared-configs)
方式引入
各配置文件的优先级
: 本地bootstrap.yaml文件 > 服务名-环境名.yaml > 服务名.yaml > 扩展的远程配置文件 > 共享的远程配置文件 > 本地application.yaml文件
Spring引入了一种新的配置文件bootstrap.yml(只有配置到本地才能确定Nacos地址和配置文件Id)
引导文件,读取的优先级高于application.yml文件
服务配置文件
第一步: 在user-service模块
的pom文件中引入Nacos配置管理依赖spring-cloud-starter-alibaba-nacos-config
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
第二步: 在user-service模块
的类路径下添加bootstrap.yml
文件,通过NameSpace,Group,DataId(含应用名,环境,格式)
定位Nacos服务端的远程配置文件
user-service(应用名)
: 通过spring.application.name
指定dev(环境名)
: 通过spring.profiles.active
指定Yaml(文件格式)
: 通过spring.cloud.nacos.config.file-extension
指定,目前Nacos支持properties、yaml
等格式的文件
# 以下这部分配置必须配置到本地
spring:
application:
name: user-service # 服务名称(与Nacos远程配置文件的名称一致)
profiles:
active: dev # 开发环境
cloud:
nacos:
server-addr: localhost:8848 # Nacos服务端的地址
config:
file-extension: yaml # 文件后缀名
如果服务对应的远程配置文件不在默认的命名空间(public)和默认分组
下,还需要在bootstrap.yaml中增加namespace和group属性
配置命名空间和分组
spring:
application:
name: user-service # 服务名称(要与Nacos配置文件的名称一致)
profiles:
active: dev # 开发环境
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
namespace: xxxxxxx # 远程配置文件所在的命名空间名称或ID
group: xxxx # 远程配置文件所在的分组
file-extension: yaml # 远程配置文件的后缀名
第三步: 在user-service模块
的UserController中读取对应远程配置文件中的配置,打开浏览器访问http://localhost:8081/user/now查看服务器响应的日期格式
@NacosValue注解或@Value注解
: 注入Nacos管理的远程配置文件中的属性
@RestController
@RequestMapping("/user")
public class UserController {
// 注入Nacos中的配置属性
//@NacosValue("${pattern.dateformat}")
@Value("${pattern.dateformat}")
private String dateformat;
// 编写controller,通过日期格式化器来格式化现在时间并返回
@GetMapping("/now")
public String test() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
扩展配置文件
实际开发中一个微服务模块可能依赖其他模块的配置文件,此时我们就需要使用extension-configs属性
引入一个或多个配置文件
#微服务配置
spring:
application:
name: content-api
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
namespace: ${spring.profiles.active}
group: xuecheng-plus-project
config:
namespace: ${spring.profiles.active}
group: xuecheng-plus-project
file-extension: yaml
# 以上内容完成是引入content-api-dev.yaml
refresh-enabled: true
# 引入扩展的配置文件content-service-dev.yaml
extension-configs:
- data-id: content-service-${spring.profiles.active}.yaml
group: xuecheng-plus-project
refresh: true
## 服务实例启动时的环境,默认为dev
profiles:
active: dev
公用配置文件
实际开发中多个微服务模块的配置可能相同,此时我们可以编写一个公用的配置文件,然后添加shared-configs
在不同服务中引入一个或多个配置文件
spring:
application:
name: content-api
cloud:
nacos:
server-addr: localhost:8848
discovery:
namespace: dev
group: xuecheng-plus-project
config:
namespace: dev
group: xuecheng-plus-project
file-extension: yaml
# 以上内容完成是引入content-api-dev.yaml
refresh-enabled: true
# 引入公用的配置
shared-configs:
- data-id: swagger-${spring.profiles.active}.yaml
group: xuecheng-plus-common
refresh: true
- data-id: logging-${spring.profiles.active}.yaml
group: xuecheng-plus-common
refresh: true
## 服务实例启动时的环境,默认为dev
profiles:
active: dev
配置热更新
配置热更新的目的就是在Nacos服务端修改远程配置文件后,对应使用该配置文件中配置的微服务实例无需重启修改后的配置也会生效
@RefreshScope
在使用@Value注解(注入远程配置文件的属性值)
所在的类上添加@RefreshScope注解
刷新作用域
第一步: 在Nacos服务端的配置文件中重新编辑日期格式并保存,此时无需重新启动服务,直接访问http://localhost:8081/user/test查看响应的日期的格式
pattern:
# dateformat: yyyy年MM月dd日 HH:mm:ss
dateformat: yyyy-MM-dd MM:hh:ss
@Slf4j
@RestController
@RequestMapping("/user")
// 刷新属性
@RefreshScope
public class UserController {
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("/test")
public String test() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
@ConfigurationProperties
使用@ConfigurationProperties
注解代替@Value注解和@RefreshScope注解
第一步: 在user-service模块
中新建一个PatternProperties属性配置类
专门用来读取Nacos服务端中user-service-dev.yaml
远程配置文件的属性
@Component
@Data
@ConfigurationProperties(prefix = "pattern")// 指定读取的属性前缀
public class PatternProperties {
// "属性前缀+属性名"确定配置文件中的pattern.dateformat属性
private String dateformat;
}
第二步: 在UserController
中注入PatternProperties配置类
,然后从中获取读到的pattern.dateformat属性
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
// 注入配置类
@Autowired
private PatternProperties patternProperties;
@GetMapping("/test")
public String test() {
// 从PatternProperties类中获取读到的pattern.dateformat属性
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
}
配置共享
共享步骤
微服务启动时会去Nacos服务端读取多个配置文件
[spring.application.name]-[spring.profiles.active].yaml
: 远程配置文件名包含环境说明改变环境后就不能读取该配置文件中的内容[spring.application.name].yaml
: 远程配置文件名不包含环境说明即使改变环境后也可以读取该配置文件中的内容,一般写入多环境共享的配置
第一步: 在Nacos服务端中新建一个Data ID为user-service.yaml
的远程配置文件,无论环境如何变化,user-service服务实例
都可以读取到该配置文件的内容
pattern:
envSharedValue: 多环境共享属性值
第二步: 在PatternProperties属性配置类
中添加envSharedValue属性
读取远程配置文件中的pattern.envSharedValue属性
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
// 多环境共享属性值
private String envSharedValue;
}
第三步: 在UserController
中添加一个方法输出读取到的所有属性
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("/prop")
public PatternProperties prop(){
return patternProperties;
}
}
第四步: 在user-service模块
的配置文件中添加spring.profiles.active属性
更改服务实例启动时的环境或选择服务实例右键Edit Configuration
spring:
application:
name: user-service # 服务名称
profiles:
active: dev/test # 开发环境
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
第五步: 打开浏览器分别访问http://localhost:8081/user/prop和http://localhost:8082/user/prop
- UserApplication服务实例启动的环境是
dev
,所以加载的是user-service-dev.yml和user-service.yml
这两个配置文件 - UserApplication2服务实例启动的环境是
test
,所以加载的是user-service-test.yml和user-service.yml
这两个配置文件
// UserApplication(dev环境)
{"dateformat": null,"envSharedValue": "多环境共享属性值"}
// UserApplication2(test环境)
{"dateformat": "yyyy-MM-dd HH:mm:ss","envSharedValue": "多环境共享属性值"}
配置共享的优先级
目前为止用到的配置文件有本地的配置文件bootstrap.yaml
和application.yaml
以及Nacos上管理的远程配置文件
远端配置大于本地配置,当前环境配置大于共享环境配置
: bootstrap.yaml(确定Nacos地址和配置文件Id) > 服务名-环境名.yaml > 服务名.yaml > application.yaml
第一步: 在user-service模块
本地application.yml
中添加name属性验证: user-service-dev.yaml > user-service.yaml > application.yaml
pattern:
name: 本地环境属性
第二步: 在Nacos服务端的远程配置文件user-service.yaml
中新增name属性
pattern:
name: 环境共享属性
第三步: 在Nacos服务端的远程配置文件user-service-dev.yaml
中新增name属性
pattern:
name: dev环境属性
第四步: 在PatternProperties属性配置类
中添加name属性
读取远程配置文件中的pattern.name属性
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
// 测试配置共享属性的优先级
private String name;
}
第五步: 在UserController
中添加一个方法输出读取到的所有属性
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("/prop")
public PatternProperties prop(){
return patternProperties;
}
}
配置本地优先
配置本地优先
: 在模块的本地配置文件中添加spring.cloud.config.override-none
配置提升本地配置的优先级,通过服务实例启动时的端口号
验证
#配置本地优先
spring:
cloud:
config:
override-none: true