自学内容网 自学内容网

SpringCloud&Nacos配置管理及热更新



在这里插入图片描述


之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos 的服务分级存储模型做理论与实践.


本篇文章阐述 Nacos 做配置中心的理论和实践.

统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

在这里插入图片描述

Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。


在nacos中添加配置文件

如何在nacos中管理配置呢?

在这里插入图片描述

然后在弹出的表单中,填写配置信息:

在这里插入图片描述

注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。


从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此spring引入了一种新的配置文件:bootstrap.yaml 文件,会在application.yml之前被读取,流程如下:

在这里插入图片描述

  1. 添加 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

在这里插入图片描述

  1. 读取配置文件
@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 中的配置 优先于本地的配置.

在这里插入图片描述




原文地址:https://blog.csdn.net/2301_78386975/article/details/136341744

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!