文章目录
- 统一配置管理
- 在nacos中添加配置文件
- 从微服务拉取配置
- 配置热更新
- 方式1
- 方式2
- 配置优先级
之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos
的服务分级存储模型做理论与实践.
本篇文章阐述 Nacos
做配置中心的理论和实践.
统一配置管理
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos
一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
在nacos中添加配置文件
如何在nacos中管理配置呢?
然后在弹出的表单中,填写配置信息:
注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
从微服务拉取配置
微服务要拉取nacos
中管理的配置,并且与本地的application.yml
配置合并,才能完成项目启动。
但如果尚未读取application.yml
,又如何得知nacos
地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml
文件,会在application.yml
之前被读取,流程如下:
- 添加 bootstrap.yaml
在 user-server 微服务下添加个bootstrap.yaml
文件,内容如下
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: ip:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。
本例中,就是去读取user-server-dev.yaml
:
- 读取配置文件
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${test.name}")
private String name;
/** 测试配置文件 */
@GetMapping("/testConf")
public String testConf() {
return "testConf:" + name;
}
}
在页面访问,看效果:
nacos 中配置的 name 属性拿到了… 非常的nice~
配置热更新
我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
要实现配置热更新,可以使用两种方式:
方式1
在 @Value
注入的变量所在类上添加注解 @RefreshScope
:
方式2
使用 @ConfigurationProperties
注解代替 @Value
注解。
在 user-server
服务中,添加一个类,读取 test.name
属性:
/**
* @author: Snow
* @date: 2024/2/28
* **************************************************
* 修改记录(时间--修改人--修改说明):
*/
@Component
@Data
@ConfigurationProperties(prefix = "test")
public class TestConf {
private String name;
}
在 UserController 中使用这个类代替 @Value:
//@RefreshScope
@RestController
@RequestMapping("/user")
public class UserController {
//@Value("${test.name}")
//private String name;
@Autowired
private TestConf testConf;
/** 测试配置文件 */
@GetMapping("/testConf")
public String testConf() {
return "testConf:" + testConf.getName();
}
}
经过测试 效果一样滴~~
配置优先级
配置优先级: Nacos 中的配置 优先于本地的配置.