Nacos Config 服务配置中心
首先暴露问题,然后提出解决方案。先来看下微服务架构中,关于配置文件的一些问题:配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。配置文件无法区分环境。微服务项目可能会有多个环境。例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置一般情况下是不同的。打个比方,出个包更新到预发布环境,还得把配置改好了才能进行,很痛苦。配
首先暴露问题,然后提出解决方案。先来看下微服务架构中,关于配置文件的一些问题:
- 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
- 配置文件无法区分环境。微服务项目可能会有多个环境。例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置一般情况下是不同的。打个比方,出个包更新到预发布环境,还得把配置改好了才能进行,很痛苦。
- 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
基于上述这些问题,我们就需要配置中心的加入来解决问题。
配置中心的思路是:
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
- 微服务来配置中心拉取自己的配置。
- 当配置中心里面的参数有更新时,也能通知到各个微服务实时的过来同步最新的信息,使之动态更新。
当加入服务配置中心之后,系统架构图变成了下面这样:
下面介绍使用Nacos Config作为服务配置中心。其实就是将Nacos当做一个服务器,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在Nacos上,然后各个微服务从Nacos上拉取配置即可。
目录
一、搭建Nacos环境
关于Nacos环境的搭建,这里不再赘述,参考另外一篇博文:Nacos入门
二、在微服务中引入nacos config的依赖
<!--nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
三、在微服务中添加nacos config的配置
注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件
配置文件优先级(由高到低):
bootstrap.properties > bootstrap.yml > application.properties > application.yml
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # Nacos配置中心的地址
file-extension: yaml # 配置的格式
profiles:
active: dev # 环境标识
四、在nacos中添加配置
五、配置动态刷新
上述操作已经实现了配置的远程存放和拉取。但是如果此时修改了配置,我们的程序是无法读取到的。因此,我们需要开启配置的动态刷新功能。
为了方便测试,在nacos中的service-product-dev.yaml配置项中添加以下配置,用于后续打印输出。
config:
appName: jack-product
gender: man
方式一:硬编码方式(此方式默认就支持动态刷新,但是不够简洁,不推荐)
package cn.jack.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/nacos/config") public class NacosConfigController { @Autowired private ConfigurableApplicationContext configurableApplicationContext; @RequestMapping("/test1") public String test1() { return this.configurableApplicationContext.getEnvironment().getProperty("config.appName"); } }
方式二:注解方式(推荐)
package cn.jack.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/nacos/config") @RefreshScope // 注解方式读取配置,如果需要动态更新,需要加上此注解 public class NacosConfigController { @Value("${config.gender}") private String gender; @RequestMapping("/test2") public String test2() { return gender; } }
六、配置共享
当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就需要考虑能不能将公共配置提取出来,然后实现共享呢?当然是可以的。接下来演示如何实现这一功能。
6.1 同一个微服务的不同环境之间共享配置
如果想在同一个微服务的不同环境之间实现配置共享,其实很简单。
只需要提取一个以spring.application.name命名的配置文件,然后将所有环境的公共配置放在里面即可。
第一步:新建一个名为service-product.yaml配置,用于存放商品微服务的公共配置
第二步:新建一个名为service-product-test.yaml的配置,用于存放测试环境的配置
第三步:修改service-product-dev.yaml的配置,存放开发环境独有的配置
第四步:进行测试
package cn.jack.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/nacos/config") @RefreshScope // 注解方式读取配置,如果需要动态更新,需要加上此注解 public class NacosConfigController { @Value("${config.gender}") private String gender; @RequestMapping("/test2") public String test2() { return gender; } }
启动微服务,访问测试
接下来,修改bootstrap.yml中的配置,将active修改为test,再次访问测试,观察输出结果
6.2 不同微服务之间共享配置
不同微服务之间共享配置的原理,类似于文件引入,就是定义一个公共配置,然后在当前配置中引入。
1 在nacos中定义一个DataId为all-service.yaml的配置,用于所有微服务共享
2 修改微服务的bootstrap.yml
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: test # 环境标识
3 添加测试方法
package cn.jack.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/nacos/config") @RefreshScope // 注解方式读取配置,如果需要动态更新,需要加上此注解 public class NacosConfigController { @Value("${test.name}") private String name; @RequestMapping("/test3") public String test3() { return name; } }
4 启动微服务进行测试
更多推荐
所有评论(0)