一、Nacos配置管理
1.前言
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
由此我们可以引入Nacos用于统一的配置管理:
- 一方面可以用于将配置集中管理。
- 另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
2.统一配置管理
nacos配置管理->配置列表->+
- dataId:服务名称+开发环境.yaml
- 配置内容: 项目的核心配置,需要热更新的配置才有放到nacos管理的必要,例如(开关类变量、模版类配置等)。
3.微服务拉取配置
- 微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
- 但如果尚未读取application.yml,又如何得知nacos地址呢?
- 因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,所以要将nacos的配置信息放到bootstrap.yaml文件中被优先读取到。流程如下:
操作步骤
- 1.引入Nacos配置管理的客户端依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:如果未在工程中统一管理依赖版本,此处需要指定具体版本
- 2.新建bootstrap.yaml(application.yaml中重复配置要删除)
spring:
application:
name: user-service # 服务名称
profiles:
active: dev # 开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
discovery:
cluster-name: HZ
这时${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置
- 3.测试
4.配置热更新
我们的目的之一是当我们修改nacos中的配置后,无需重启微服务即可让配置即可生效,也就是配置热更新。
要实现配置热更新,可以使用两种方式:
- 1.在@Value注入的变量所在类上添加注解
@RefreshScope:
- 2.使用
@ConfigurationProperties注解代替@Value注解。
新建一个类来读取nacos中配置的patterrn.dateformat属性
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
//读取配置属性注解,通过前缀+变量属性名来获取配置文件中对应的属性(约定大于配置)
public class PatternProperties {
private String dateformat;
}
5.配置共享
(1)前言
在微服务启动时,会去nacos按顺序读取多个配置文件,例如:
-
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
-
[spring.application.name].yaml,例如:userservice.yaml
而[spring.application.name].yaml不包含环境,每种环境都会去读取,因此可以被多个环境共享。
(2)使用
添加一个环境共享配置
读取共享配置
运行两个UserApplication,修改UserApplication2这个启动项,改变其active-profile值为test,此时UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test