👨?🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:详解SpringCloud微服务技术栈:Nacos服务搭建及服务分级存储模型
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助
上一节讲了Nacos做服务搭建的方法,并与Eureka做了比较,Nacos除了可以做服务的搭建,比起Eureka还有更多的功能,即配置管理。
Nacos的集群搭建,感觉太复杂了,就一台电脑要弄很久去模拟,所以不做展示了。
在实际生产环境中会有很多的服务,服务之间又有互相调用的关系,每次重新配置,都可能使得其他服务也要修改一些配置,同时服务都得重启,在实际生产环境中的影响有时候还是很大的。因此需要将配置的文件进行统一的管理,同时这些配置的更改无须重启,直接热更新。
设置配置管理服务,当配置要做修改的时候,无须自己做改动,而是去配置服务管理中把需要配置的地方做修改。
而Nacos就拥有配置管理服务。
这里可以新建配置管理,这里的配置放着的是有热更新需求的配置:
接下来,微服务需要得到这些统一配置。
假设没有Nacos的统一配置,其获取配置的步骤为:
1、启动项目
2、读取本地配置文件application.yml
3、创建Spring容器
4、加载bean
当加入了Nacos中的配置文件以后,服务启动之后,就需要先读Nacos中的配置文件,再将Nacos中的配置文件与本地的配置文件做一个合并。
需要考虑一些问题:从哪里读取Nacos地址,读取什么内容。
在此之前,要先获得Nacos的地址,就需要使用bootstrap.yml,优先级比application高。
步骤:
1、引入Nacos的配置管理客户端依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</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:
这说明微服务已经成功获取了Nacos中的配置信息。
将配置交给Nacos管理的步骤总结:
1、在Nacos中添加配置文件
2、在微服务中引入Naocs的config依赖
3、在微服务中添加bootstrap.yml,配置Nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去Nacos读取哪个文件。
当我们直接修改Nacos配置后,重新访问网页是不会实现更新的,必须重启服务,这会导致损失,因此需要配置热更新。需要通过下面2种配置实现:
方式一:在@Value注入的变量所在类上添加@RefreshScope
方式二:使用@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控制台进行配置:
修改PatternProperties:
在controller中增加GetMapping方法:
@GetMapping("prop")
public PatternProperties properties(){
return patternProperties;
}
访问网址:
这里是访问到了dev环境的,我们可以将bootstrap.yml中的dev删掉或者做修改,并重启服务:
可以发现,共有的属性是可以访问到的。
配置的优先级问题
如果userservice.yaml与userservice-dev.yaml中有相同的配置名,以谁的为准?
本地application.yml与远端配置有相同配置名,以谁的为准?
答案:userservice-dev.yaml>userservice.yaml>application.yml
也就是说,服务名-profile.yaml >服务名称.yaml > 本地配置
集群的搭建才是重点,但是我就一台电脑,就不做模拟了,太麻烦了。