配置中心Nacos Config
为什么要使用配置中心?
先看看在我们没有使用配置中心之前存在的问题:
1.数据库账号密码放在本地配置中不安全
2.不能对更改的配置进行动态刷新
3.修改配置后没有历史记录
4.切换开发环境相对麻烦
5.无法对公共配置进行共享
小结:在我们微服务架构中,随着微服务越来越多,如果不使用配置中心进行统一管理,对于我们开发人员来说是非常不友好的,所以我们可以通过灵活的使用配置中心,减少我们的开发成本,提高项目的可维护性。
配置中心的思想(大白话)
使用Nacos作为配置中心,相当于把Nacos当做有个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在Nacos上,然后各个微服务从Nacos上拉取配置即可
Nacos Config入门案例
1.先搭建Nocos环境,如果不知道如何搭建可以看下往期分享springCloud Alibaba之Nacos组件
2.在微服务中添加Nacos的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.在微服务中添加nacos config的配置
注意:不能使用原来的application.yml
作为配置文件,而是新建一个bootstrap.yml
作为配置文件
配置文件优先级(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
spring:
application:
name: product-service #微服务名称①
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos中心地址
file-extension: yaml # 配置文件格式③
profiles:
active: dev # 环境标识②
4.在nacos中添加配置,然后把商品微服务application.yml配置复制到配置内容中.
5.注释本地的application.yam中的内容, 启动程序进行测试
6.如果成功访问程序,说明我们nacos的配置中心功能已经实现
Nacos config之配置动态刷新
上面的案例已经实现了把配置存放到配置中心了,但是如果我们修改了配置中心的配置,此时如果想让配置生效,那么还是需要重启才能生效,所以接下来我们看下如何在不重启的情况下让配置动态刷新。
-
在nacos中的product-service-dev.yaml配置项中添加下面配置:
appConfig: name: product2020
-
在商品微服务中新增NacosConfigControlller.java
@RestController @RefreshScope //记得贴上该注解,当配置发生变更时进行热部署 public class NacosConfigController { @Value("${appConfig.name}") private String appConfigName; @RequestMapping("/config") public String config(){ return "远程信息:"+appConfigName; } }
3.重启项目=>访问/config接口,看到product2020
4.修改nacos中的product-service-dev.yaml配置项中添加下面配置:
appConfig:
name: product2021
5.如果再次访问/config接口,显示product2021,证明动态刷新已经成功了
配置共享
同一个微服务,不同开发环境之间共享配置
在实现之前,先做个铺垫:克隆一个test环境的配置,假如跟dev环境只有端口号是不同的,看下图:
如果想在同一个微服务的不同环境之间实现配置共享,其实很简单。只需要提取一个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面即可。
-
新建一个名为product-service.yaml配置存放商品微服务的公共配置,把之前的公共配置都存放进去.
-
新建一个名为product-service-test.yaml配置存放测试环境的配置
- 新建一个名为product-service-dev.yaml配置存放测试环境的配置
- 需要的配置信息具体如下:
-
在NacosConfigController.java中新增如下逻辑
@RestController @RefreshScope public class NacosConfigController { @Value("${appConfig.name}") private String appConfigName; @Value("${env}") private String env; @RequestMapping("/config") public String config(){ return "远程信息:"+appConfigName; } @RequestMapping("/config2") public String config2(){ return "公共配置:"+appConfigName+",环境配置信息:"+env; } }
-
通过修改环境,参看是否可以读取公共配置和环境独有配置
7.最后可以来回切换环境,测试是否成功,如果成功的话可以看到env的值是dev/test
不同微服务之间共享配置
不同为服务之间实现配置共享的原理类似于文件引入,就是定义一个公共配置,然后在当前配置中引
入。
-
在nacos中定义一个DataID为global-config.yaml的配置,用于所有微服务共享
globalConfig: global
-
修改bootstrap.yaml
spring: application: name: product-service cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos中心地址 file-extension: yaml # 配置文件格式 shared-configs: - data-id: global-config.yaml # 配置要引入的配置 refresh: true profiles: active: test # 环境标识
-
在NacosConfigController.java中新增一个方法
@RestController @RefreshScope public class NacosConfigController { @Value("${appConfig.name}") private String appConfigName; @Value("${env}") private String env; @Value("${globalConfig}") private String globalConfig; @RequestMapping("/config") public String config(){ return "远程信息:"+appConfigName; } @RequestMapping("config2") public String config2(){ return "公共配置:"+appConfigName+",环境配置信息:"+env; } @RequestMapping("config3") public String config3(){ return "全局配置:"+globalConfig+",公共配置:"+appConfigName+",环境配置信息:"+env; } }
-
重启服务,访问/config3 进行测试.
总结:到这里我们已经解决了我们开篇时说到的,如果不用配置中心存在的所有问题了,比如不能动态刷新配置,账号密码配置在本地不安全,不能共享配置导致难以维护,切换环境相对麻烦,没有修改配置的历史记录…