SpringCloud-Nacos配置中心

举报
不会压弯的小飞侠 发表于 2022/08/23 14:27:31 2022/08/23
【摘要】 🍁Nacos配置管理Nacos除了可以做注册中心,同样可以做配置管理中心来使用。 🔥统一配置管理当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。 🔥在nacos中添加配置文件首先打开Nac...

🍁Nacos配置管理

Nacos除了可以做注册中心,同样可以做配置管理中心来使用。

🔥统一配置管理

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

🔥在nacos中添加配置文件

  • 首先打开Nacos,选择配置列表,点击右侧的 “+” 号

在这里插入图片描述

  • 填写配置信息,并点击发布

在这里插入图片描述

  • 注意:
    • Data ID: 配置文件的id:[服务名称]-[profile].[后缀名]
    • Group: 分组,默认即可
    • 格式,支持yaml和properties

发布之后查看是否配置成功:
在这里插入图片描述

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

🔥从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
因此spring引入了一种新的配置文件:bootstrap.yaml文件(注意名字不要拼错),会在application.yml之前被读取,流程如下:
在这里插入图片描述

  • 1.引入nacos-config依赖
  • 在user-service服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 添加bootstrap.yaml
  • 在user-service中添加一个bootstrap.yaml文件,内容如下:
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名
  • 读取nacos配置
  • 在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}

最后在页面访问:localhost:8081/user/now

🔥配置热更新

通过修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。

  • 实现配置热更新有两种方式:

  • 方式一

    • 在@Value注入的变量所在类上添加注解@RefreshScope
@Slf4j
@RestController
@RefreshScope
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}
  • 方式二
    • 使用@ConfigurationProperties注解代替@Value注解
    • 在user-service服务中,添加一个类,读取patterrn.dateformat属性:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
  • 在UserController中使用这个类代替@Value:
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }
 /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
    
}

🔥配置共享

  • 微服务启动时,会去nacos读取多个配置文件
    例如:[spring.application.name]-[spring.profiles.active].yaml
    例如:userservice-dev.yaml[spring.application.name].yaml
    例如:userservice.yaml,而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

  • 添加一个环境共享配置

  • 在nacos中添加一个userservice.yaml文件:

在这里插入图片描述

  • 在user-service中读取共享配置
  • 在user-service服务中,修改PatternProperties类,读取新添加的属性:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
    private String envSharedValue;
}
  • 在user-service服务中,修改UserController,添加一个方法:
@Autowired
    private PatternProperties properties;

    @GetMapping("prop")
    public PatternProperties properties(){
        return properties;
    }
  • 运行两个UserApplication,使用不同的profile(配置环境)
  • 右键UserApplication2-->Edit Configuration
  • 修改UserApplication2这个启动项,改变其profile值:test

在这里插入图片描述

  • UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。
    • 启动UserApplication和UserApplication2
    • 访问http://localhost:8081/user/prop
    • 访问http://localhost:8082/user/prop

结论:不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。但是test读取 不到dev环境的值,只有dev能够读取。

🔥配置共享的优先级

  • 当nacos、服务本地同时出现相同属性时,优先级有高低之分:

在这里插入图片描述

  • 微服务会从nacos读取的配置文件:
    • [服务名]-[spring.profile.active].yaml,环境配置
    • [服务名].yaml,默认配置,多环境共享
  • 优先级:
    • [服务名]-[环境].yaml >[服务名].yaml >本地配置
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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