前言
在上一篇nacos初始中,已经描述过Nacos的基本知识,在这篇博客里记录的是Nacos配置中心的使用。
Nacos配置中心的作用
-
集中化配置管理:Nacos配置中心支持将应用程序的配置信息集中管理,包括常规的属性配置、文本配置、JSON配置等。你可以通过Nacos的控制台或API进行配置的创建、更新、删除和查询。
-
动态配置更新:配置中心可以实现配置的动态更新,即在应用程序运行期间,无需重启应用程序就能修改已经配置的属性。当配置更新时,Nacos能够即时通知到应用程序,应用程序可以立即获取新的配置值。
-
配置版本管理:Nacos配置中心支持配置的版本管理,可以为每个配置项设定不同的版本,并且可以查看和恢复历史版本的配置。
-
统一的命名空间管理:Nacos配置中心支持命名空间的划分,不同的命名空间可以实现配置的隔离和管理。每个命名空间都具有独立的配置存储和权限设置。
-
高可用和可扩展:Nacos配置中心支持集群部署,可以确保高可用性和可伸缩性。你可以根据应用程序的需求进行配置中心的水平扩展,以应对高并发的配置读取请求。
🆗上图描述了如何通过nacos集中管理多个服务的配置
- 用户通过Nacos Server的控制太集中对多个服务的配置进行管理
- 各个服务统一从Nacos Server 中获取各自的配置,并监听配置的变化
发布配置
在上一篇博客中,我简单发布了一个配置,并通过Java代码进行了获取。在这篇博客中,我还是先发布一个自定义配置,然后基于微服务进行获取。
配置发布后获取配置,首先需要有搭建好的微服务项目,分别新建service1和service2两个微服务,下面以service1为例,进行获取
step1:修改配置文件名为bootstrap.yaml
step2:设置配置文件,如下图所示
step3:定义访问端点,我偷懒,在启动类上加了
这里的@Value是Spring提供的用于属性赋值的注解,支持直接注入常量值、SpEL表达式、属性文件中的值以及其他Spring容器中的bean,这里的用法是注入属性文件中的值
配置热更新
所谓配置热更新是说可以在不重启服务器的情况下,在运行时对应用程序的配置进行动态的修改,配置热更新可以通过两种方式实现,分别是硬编码和添加注解
1.硬编码方式
@RestController
public class NacosConfigController {
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/nacos-config-test2")
public String nacosConfingTest2() {
return applicationContext.getEnvironment().getProperty("config.appName");
}
}
2.在@Value注入的变量所在类上添加注解@RefreshScope
@RestController
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
@Value("${config.appName}")
private String appName;
@GetMapping("/nacos-config-test1")
public String nacosConfingTest1() {
return appName;
}
}
配置共享
配置共享是说,提取各个微服务中的相同配置生成一个公共的配置文件,供所有微服务使用。通过配置共享,可以避免在每个应用程序中都配置相同的信息,提高配置的复用性和一致性。
同一服务下的配置共享
实现步骤:
- 新建一个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面
- 新建一个名为service-product-test.yaml配置存放测试环境的配置
- 新建一个名为service-product-dev.yaml配置存放开发环境的配置
- 在两个环境文件中配置独有信息,例如:
#多配置一段
config:
env: test
#多配置一段
config:
env: dev
- 添加测试方法
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${config.env}")
private String env;
//3 同一微服务的不同环境下共享配置
@GetMapping("/nacos-config-test3")
public String nacosConfingTest3() {
return env;
}
}
在不同服务下共享配置
不同服务之间实现配置共享的原理类似于文件引入,就是定义一个公共配置,然后在当前配置中引入。
- 在nacos中定义一个DataID为all-service.yaml的配置,用于所有微服务共享
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///shopserverTimezone=UTC
username: root
password: root
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 修改bootstrap.yaml
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos中心地址
file-extension: yaml # 配置文件格式
shared-dataids: all-service.yaml # 配置要引入的配置
refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
profiles:
active: dev # 环境标识
然后启动微服务测试就可以啦