详解SpringCloud微服务技术栈:Nacos配置管理

‍作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
上期文章:详解SpringCloud微服务技术栈:Nacos服务搭建及服务分级存储模型
订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

上一节讲了Nacos做服务搭建的方法,并与Eureka做了比较,Nacos除了可以做服务的搭建,比起Eureka还有更多的功能,即配置管理。
Nacos的集群搭建,感觉太复杂了,就一台电脑要弄很久去模拟,所以不做展示了。

Nacos配置管理

  • 统一配置管理
  • 微服务配置拉取
  • 配置热更新
  • 多环境配置共享

统一配置管理

在实际生产环境中会有很多的服务,服务之间又有互相调用的关系,每次重新配置,都可能使得其他服务也要修改一些配置,同时服务都得重启,在实际生产环境中的影响有时候还是很大的。因此需要将配置的文件进行统一的管理,同时这些配置的更改无须重启,直接热更新。
设置配置管理服务,当配置要做修改的时候,无须自己做改动,而是去配置服务管理中把需要配置的地方做修改。
而Nacos就拥有配置管理服务。
详解SpringCloud微服务技术栈:Nacos配置管理_第1张图片
这里可以新建配置管理,这里的配置放着的是有热更新需求的配置:
详解SpringCloud微服务技术栈:Nacos配置管理_第2张图片

微服务配置拉取

接下来,微服务需要得到这些统一配置。
假设没有Nacos的统一配置,其获取配置的步骤为:

1、启动项目
2、读取本地配置文件application.yml
3、创建Spring容器
4、加载bean

当加入了Nacos中的配置文件以后,服务启动之后,就需要先读Nacos中的配置文件,再将Nacos中的配置文件与本地的配置文件做一个合并。
需要考虑一些问题:从哪里读取Nacos地址,读取什么内容。
在此之前,要先获得Nacos的地址,就需要使用bootstrap.yml,优先级比application高。

步骤:
1、引入Nacos的配置管理客户端依赖:

		<dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>

2、在userservice中的resource中添加bootstrap.yml文件,这是引导文件,优先级高于application.yml:

spring:
  application:
    name: userservice
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

3、删除application.yml中的重复配置。

这样就可以拉取到配置了,可以在UserController中验证:

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

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

访问localhost:8081/user/now:
详解SpringCloud微服务技术栈:Nacos配置管理_第3张图片
这说明微服务已经成功获取了Nacos中的配置信息。

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

配置热更新

当我们直接修改Nacos配置后,重新访问网页是不会实现更新的,必须重启服务,这会导致损失,因此需要配置热更新。需要通过下面2种配置实现:
方式一:在@Value注入的变量所在类上添加@RefreshScope
详解SpringCloud微服务技术栈:Nacos配置管理_第4张图片
方式二:使用@ConfigurationProperties注解
SpringBoot中注入属性不只有@Value方式,可以新建一个类,专门用来完成属性的加载:

@Data
@Component //注册成bean,让所有类都可以直接使用
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

当需要用到的时候,直接注解获取即可:

	@Resource
    private PatternProperties patternProperties;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }

方式二是更方便的,推荐使用。

多环境配置共享

有些环境的配置可能都是一样的,这时候要是配置可以共享,就可以避免多次修改了,更为方便。
实际上,微服务启动时会从Nacos读取多个配置文件:

[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml

无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享的配置可以写入这个文件。
打开Nacos控制台进行配置:
详解SpringCloud微服务技术栈:Nacos配置管理_第5张图片
修改PatternProperties:
详解SpringCloud微服务技术栈:Nacos配置管理_第6张图片
在controller中增加GetMapping方法:

	@GetMapping("prop")
    public PatternProperties properties(){
        return patternProperties;
    }

访问网址:
详解SpringCloud微服务技术栈:Nacos配置管理_第7张图片
这里是访问到了dev环境的,我们可以将bootstrap.yml中的dev删掉或者做修改,并重启服务:
详解SpringCloud微服务技术栈:Nacos配置管理_第8张图片
可以发现,共有的属性是可以访问到的。

配置的优先级问题

如果userservice.yaml与userservice-dev.yaml中有相同的配置名,以谁的为准?
本地application.yml与远端配置有相同配置名,以谁的为准?

答案:userservice-dev.yaml>userservice.yaml>application.yml

也就是说,服务名-profile.yaml >服务名称.yaml > 本地配置

集群的搭建才是重点,但是我就一台电脑,就不做模拟了,太麻烦了。

你可能感兴趣的:(微服务技术全家桶,spring,cloud,微服务,java,nacos,springboot)