Nacos配置管理

举报
兮动人 发表于 2022/07/16 23:35:56 2022/07/16
【摘要】 1. 统一配置管理 2. 配置自动刷新 3. 多环境配置共享 1. 统一配置管理配置更改热更新在Nacos中添加配置信息:配置获取的步骤如下:引入Nacos的配置管理客户端依赖:<!--nacos配置管理依赖--><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibab...

1. 统一配置管理

  • 配置更改热更新
    在这里插入图片描述
    在这里插入图片描述

  • 在Nacos中添加配置信息:
    在这里插入图片描述
    在这里插入图片描述

  • 配置获取的步骤如下:
    在这里插入图片描述

  1. 引入Nacos的配置管理客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev # 开发环境
  cloud:
    nacos:
      server-addr: 47.107.53.146:8848 # nacos 地址
      config:
        file-extension: yaml # 文件后缀名
  • user-service中将pattern.dateformat这个属性注入到UserController中做测试:
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;

    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }

    @GetMapping("/now")
    public String now() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
}

在这里插入图片描述
在这里插入图片描述

  • 可以看到 8081 和 8082 两个微服务都可以访问到被格式化的时间,说明都可以从 nacos 控制台中读取到配置文件的信息

  • 小节:

  1. 将配置交给Nacos管理的步骤
  2. 在Nacos中添加配置文件
  3. 在微服务中引入nacos的config依赖
  4. 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件

2. 配置自动刷新

  • Nacos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:

  • 更改 userservice-dev.yaml 配置文件:
    在这里插入图片描述

  1. 方式一:在@Value注入的变量所在类上添加注解@RefreshScope
    在这里插入图片描述
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
  • 可以看到在不重启服务的情况下,更改 nacos 上的配置文件也能达到一致的效果
    在这里插入图片描述
  1. 方式二:使用@ConfigurationProperties注解代替@Value注解。
  • 配置更改如下:
    在这里插入图片描述

  • 在user-service服务中,添加一个类,读取patterrn.dateformat属性:

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
  • UserController 添加:
@Autowired
private PatternProperties properties;

@GetMapping("/now")
public String now() {
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}
  • 可以看到,在不重新启动服务的情况下修改nacos上对于的配置文件也能达到一致的效果
    在这里插入图片描述

  • 小节:

Nacos配置更改后,微服务可以实现热更新,方式:
①通过@Value注解注入,结合@RefreshScope来刷新
②通过@ConfigurationProperties注入,自动刷新

  • 注意事项:
    不是所有的配置都适合放到配置中心,维护起来比较麻烦
    建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

3. 多环境配置共享

微服务启动时会从nacos读取多个配置文件:

无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
在这里插入图片描述

  • 新建 userservice.yaml 配置文件如下:
    在这里插入图片描述

  • 验证 userservice.yaml 配置的是否一定被读取到

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
    private String envShareValue;
}
  • bootstrap.yml 如下,表示 userservice.yaml 和 userservice-dev.yaml 文件一定会被读取到
    在这里插入图片描述
@Autowired
private PatternProperties properties;

@GetMapping("prop")
public PatternProperties properties() {
    return  properties;
}
  • 启动 userservice 8082 环境,修改为 test 配置文件的环境
    在这里插入图片描述

  • 此时这个服务只能读取到 userservice.yml 配置文件

  • userservice 8081 读取如下
    在这里插入图片描述

  • userservice 8082 读取如下
    在这里插入图片描述

  • 此时这两个服务都能拿到这个共享的属性值,说明 userservice.yml 里的配置文件属性是共享的
    在这里插入图片描述

  • 也可以在控制台上看到读取的配置文件的信息

  • 如果在 nacos 配置中,userservice.yaml 和 userservice-dev.yaml 两个配置文件中都存在同一个属性,以哪个配置文件为准?如果在 idea 中也有相同的配置文件属性,以哪个为准?

  • 在远端和本地都配置同一个属性,测试如下:
    在这里插入图片描述

application.yml
在这里插入图片描述

  • 在 本地加上 name 属性值

  • 在 远端 nacos 的 userservice.yml 加上
    在这里插入图片描述

  • 访问属性值,发现是以nacos上的 userservice.yml 为准
    在这里插入图片描述

  • userservice-dev.yml 加上
    在这里插入图片描述

  • 测试,发现在本地配置文件的属性和 远端 userservice.yml 、userservice-dev.yml 都同时存在属性的情况下,以 userservice-dev.yml 为准
    在这里插入图片描述

  • 多种配置的优先级:
    在这里插入图片描述

  • 小节:

  • 微服务会从nacos读取的配置文件:
    [服务名]-[spring.profile.active].yaml,环境配置
    [服务名].yaml,默认配置,多环境共享

  • 优先级:
    [服务名]-[环境].yaml >[服务名].yaml > 本地配置

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。