1,统一配置管理
在单体应用中,配置管理可能不是什么大的事情,通常会以配置文件的方式。常见的方法比如将配置通过打包脚本打入应用包中,或者直接放到运行应用的服务器的特定目录下,或者存储到数据库中。这种方式在传统的单体应用中简单有效,但是也会有些比较棘手的问题,比如:
- 配置变化频繁时,需要频繁的打包部署应用(服务重启带来的影响还是很大的)
- 不同环境的配置需要分开管理(比如测试环境与生产环境)。
- 而在分布式微服务架构中,服务数量剧增,如果还是手动去实现配置信息的修改或数据的迁移等,效率是很低的,而且手动操作配置也极有可能出现错误的情况
复杂的业务对应大量的配置项,对集群部署的应用配置进行修改时需要修改每个节点上的应用配置,在这种背景下,中心化的配置服务即配置中心应运而生。配置中心就是一种统一管理各种应用配置的基础服务组件,配置中心可以把业务开发者从复杂以及繁琐的配置中解脱出来,只需专注于业务代码本身,从而能够显著提升开发以及运维效率。同时将配置和发布包解藕也进一步提升发布的成功率,并为运维的细力度管控、应急处理等提供强有力的支持。
在微服务架构中,微服务的统一配置管理一般有以下需求:
- 集中管理配置:一个使用微服务架构的应用系统可能会包括成千上万个微服务,因此集中管理配置是非常有必要的。
- 不同环境不同配置:例如,数据源配置在不同的环境(开发、测试、预发布、生产等)中是不同的。
- 运行期间可动态调整:例如,可根据各个微服务的负载情况,动态调整数据源连接池大小或熔断阈值,并且在调整配置时不重启微服务。
- 配置修改后自动更新:如配置内容发生变化,微服务能够自动更新配置。
综上所述,对于微服务架构而言,一个通用的配置管理机制必不可少,常见做法是使用配置服务器管理配置。
Nacos不仅可以用注册发现,还可以做配置管理
2,Nacos配置管理
1,把配置交给nacos去管理
点击配置管理,点击加号
DataId一般是 服务名称-开发环境.文件后缀,我们这里是springboot项目,习惯使用yaml文件,分组默认即可,在配置内容中填写你需要的配置发布即可
发布成功如下:
2,服务拉取配置
配置获取流程:项目启动-->读取本地配置文件-->创建spring容器-->加载bean
那项目启动如何读取nacos'中的配置文件囊,在项目启动后,会先读取nacos中的配置文件之后和本地的aoolication.yml文件做合并,之后在合并配置步骤如下:
但是项目如何知道nacos的地址等信息呢,不知道地址就无法读取nacos的配置信息,那就需要读取配置文件,但是我先要读nacos你却让我读万配置文件在都nacos这就尴尬了,于是我们需要一个优先级高于application.yml文件的配置文件,也就是bootstrap.yml
关于优先级文件不清楚,可以参考:
1,引入Nacos的配置管理客户端依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2,在该服务的resource目录中创建bootstrap.yml文件,配置nacos信息
spring:
application:
name: userservice #配置服务名称
profiles:
active: dev #配置环境,这里是dev 开发环境
cloud:
nacos:
server-addr: localhost:8848 #Nacos的地址
config:
file-extension: yaml #配置文件后缀名
3,在当前服务中编写一个controller看看能不能读取到配置文件,这里书写一个简单的get接口,代码如下:
//读取配置文件中的配置
@Value("${pattern.dataformat}")
private String pattren;
//读取testname配置
@Value("${testname}")
private String testname;
@GetMapping("now")
public String now(){
return "dataformat:"+LocalDateTime.now().format(
DateTimeFormatter.ofPattern(pattren, Locale.CHINA)
)+"testname:"+testname;
}
这是在nacos书写的配置:
可以看到时间格式匹配正确,并且输出测试姓名,说明配置读取成功
3,配置热更新
配置热更新,简单来说就是在nacos中修改配置,服务不需要重启,即可完成感知,读取到修改的配置
方法一:对于使用@Value注解读取配置内容的controller中,在服务有关读取配置的controller中加上注解@RefreshScope注解
方法二:对于使用@ConfigurationProperties注解读取的配置,无需进行任何配置,他会自动更新
所以建议使用和@ConfigurationProperties(prefix=”“)来读取配置,如果不清楚如何读取配置文件,可参考:
4,多环境配置共享
微服务在启动的时候会从nacos中读取配置文件
一种是 服务名-环境..yaml 当前环境配置
一种是 服务名.yaml 默认配置文件,用于多环境共享
就是说如果配置了 服务名.yaml配置文件,那莫他就会在这个微服务的多个实例之间作为共享配置
那莫配置的优先级如何确定呢,经过测试如下: