目前业界流行的统一配置管理中心组件有Spring Cloud Config、Spring Cloud Alibaba的Nacos及携程开源的Apollo,本文将介绍Nacos作为统一配置管理中心的使用。

使用Nacos管理配置

比如我现在有这样一段代码:

  1. @Value("${your.configuration}")
  2. private String yourConfiguration;
  3. @GetMapping("/test_configuration")
  4. public String testConfiguration(){
  5. return yourConfiguration;
  6. }

这段代码读取了一个配置项,常规的配置方式应该配置于项目的application.yaml或者.properties文件中,那么使用Nacos要如何管理这段配置呢?

首先,添加依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  4. </dependency>

然后在resources目录下新建一个名为bootstrap.yml的文件,添加配置项:

  1. spring:
  2. application:
  3. name: study01
  4. cloud:
  5. nacos:
  6. config:
  7. server-addr: 127.0.0.1:8848
  8. namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
  9. cluster-name: HZ
  10. file-extension: yaml
  11. profiles:
  12. active: dev

打开Nacos控制台-配置管理-配置列表,点击+号新建配置,详情如下。

注意,这里的Data ID是具有一定格式的,需要与项目中的配置对应上。如上图中的:study01-dev.yaml,其中study01是微服务名称,dev是环境,yaml是配置文件的格式,对应关系如下:

到目前为止,我们就已经为项目整合了Nacos的配置管理功能,并在Nacos Server上新建了项目所需的配置。启动项目,访问/test_configuration接口,返回结果如下则代表整合成功:

动态刷新配置及回滚

动态刷新配置

在实际的应用开发中,我们通常希望在配置中心上修改了配置项后,不需要重启项目就能够实现实时的动态配置刷新。对于整合了Nacos的微服务项目来说,想要实现这个功能是很简单的,只需要在读取了配置属性的类上加上@RefreshScope注解即可。

添加完该注解后,重启项目,然后到Nacos上修改之前配置项的值,点击发布后会有一个内容比较的提示:

点击确认发布后,然后再访问/test_configuration接口,返回的就是修改后的值了,而此时我们并没有重启项目:

回滚

我们可以在Nacos控制台-配置管理-历史版本中查询指定配置的历史版本,Data IDGroup必填,点击查询可以看见所有的历史版本:

点击“回滚”则可以回滚到指定的历史版本。需要注意的是当选择回滚的版本是最初版本时就会触发一个Bug,回滚失败,配置丢失,官方称会在1.2版本中修复该问题。只要回滚的不是初始版本则不会触发这个bug,回滚其他版本是可以正常使用的,所以该问题注意一下即可规避。

配置共享

不同环境之间的配置共享

想要实现配置共享只需要新建一个配置文件即可,首先我们来看一段日志信息,当我们启动项目时,控制台会出输出如下一段日志信息:

  1. 2019-10-29 09:35:17.986 INFO 9104 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='study01-dev.yaml'}, NacosPropertySource {name='study01.yaml'}]}

该日志信息可以看到,项目在启动时会到Nacos上读取两个配置文件,即study01-dev.yaml和study01.yaml,其中study01-dev.yaml里保存的是开发环境下特定的配置,而study01.yaml里保存的则是所有环境下通用的配置。项目在启动时具体读取哪个环境的配置文件是由bootstrap.yml文件中的spring.profiles.active配置项所决定的。

既然我们知道保存在content-center.yaml里的配置项会在所有环境中共享,那么只需要到Nacos上新建这个配置文件即可,配置方法同上。

PS:特定环境下的配置优先级高于通用环境配置,例如${your.configuration}配置项同时存在于content-center-dev.yaml和content-center.yaml中,若spring.profiles.active的值为dev,那么读取的将是content-center-dev.yaml里所配置的值。

不同应用之间的配置共享

目前Nacos提供了两种方式可以实现不同应用之间的配置共享

使用shared-dataids

实现

首先需要到Nacos上创建一些共享配置

修改项目中的bootstrap.yml文件如下

  1. spring:
  2. application:
  3. name: study01
  4. cloud:
  5. nacos:
  6. config:
  7. server-addr: 127.0.0.1:8848
  8. namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
  9. cluster-name: HZ
  10. file-extension: yaml
  11. # 共享配置的DataId,多个使用,分隔
  12. # 越靠后,优先级越高
  13. # .yaml后缀不能少,只支持yaml/properties
  14. shared-dataids: common1.yaml,common2.yaml
  15. # 哪些共享配置支持动态刷新,多个使用,分隔
  16. refreshable-dataids: common1.yaml
  17. profiles:
  18. active: dev

从以上的配置示例可以看出,其实shared-dataids的主要作用就是用来指定共享配置的Data ID,使得该微服务可以读取这些共享配置。同理,其他微服务若想读取这些共享配置,只需在项目的bootstrap.yml文件中添加相应的shared-dataids配置即可,如此一来就实现了多个微服务之间的配置共享。

测试代码

  1. @Value("${common1.configuration1}")
  2. private String common1Configuration;
  3. @Value("${common2.configuration2}")
  4. private String common2Configuration;
  5. @GetMapping("/test_common_configuration1")
  6. public String testCommonConfiguration1() {
  7. return common1Configuration;
  8. }
  9. @GetMapping("/test_common_configuration2")
  10. public String testCommonConfiguration2() {
  11. return common2Configuration;
  12. }

测试结果

使用ext-config

实现

  1. spring:
  2. application:
  3. name: study01
  4. cloud:
  5. nacos:
  6. config:
  7. server-addr: 127.0.0.1:8848
  8. file-extension: yaml
  9. ext-config:
  10. # 需共享的DataId,yaml后缀不能少,目前只支持yaml/properties
  11. # 越靠后,优先级越高 优先级common2.yaml > common1.yaml
  12. - data-id: common1.yaml
  13. # common1.yaml所在的group
  14. group: DEFAULT_GROUP
  15. # 是否允许刷新,默认false
  16. refresh: true
  17. - data-id: common2.yaml
  18. group: DEFAULT_GROUP
  19. refresh: true
  20. profiles:
  21. active: dev

ext-config提供了较为细化的配置方式,并且可以指定配置组。到目前为止,我们介绍了三种从Nacos上读取配置的方式,其优先级如下:

  • shared-dataids < ext-config < 自动

除此之外,当存在相同的远程配置和本地配置时,远程配置优先级要高于本地配置文件。但可以通过添加如下配置调整,需要注意的是这段配置需要放在远程配置才会生效:

  1. spring:
  2. cloud:
  3. config:
  4. # 是否允许本地配置覆盖远程配置,默认true
  5. allow-override: true
  6. # 是否一切以本地配置为准,默认false
  7. override-none: false
  8. # 系统环境变量或系统属性才能覆盖远程配置文件的配置
  9. # 本地配置文件中配置的优先级低于远程配置,默认true
  10. override-system-properties: true

Spring Cloud Alibaba学习笔记(22) - Nacos配置管理的更多相关文章

  1. Spring Cloud Alibaba学习笔记(1) - 整合Spring Cloud Alibaba

    Spring Cloud Alibaba从孵化器版本毕业:https://github.com/alibaba/spring-cloud-alibaba,记录一下自己学习Spring Cloud Al ...

  2. Spring Cloud Alibaba学习笔记(2) - Nacos服务发现

    1.什么是Nacos Nacos的官网对这一问题进行了详细的介绍,通俗的来说: Nacos是一个服务发现组件,同时也是一个配置服务器,它解决了两个问题: 1.服务A如何发现服务B 2.管理微服务的配置 ...

  3. Spring Cloud Alibaba 实战(十二) - Nacos配置管理

    本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理 ...

  4. Spring Cloud Alibaba学习笔记(15) - 整合Spring Cloud Gateway

    Spring Cloud Gateway 概述 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于Netty.Reactor以及WEbFlux构建,它 ...

  5. Spring Cloud Alibaba学习笔记(3) - Ribbon

    1.手写一个客户端负载均衡器 在了解什么是Ribbon之前,首先通过代码的方式手写一个负载均衡器 RestTemplate restTemplate = new RestTemplate(); // ...

  6. Spring Cloud Alibaba学习笔记

    引自B站楠哥:https://space.bilibili.com/434617924 一.创建父工程 创建父工程hello-spring-cloud-alibaba Spring Cloud Ali ...

  7. Spring Cloud Alibaba学习笔记(23) - 调用链监控工具Spring Cloud Sleuth + Zipkin

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求陷入性能瓶颈或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何 ...

  8. Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用

    Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...

  9. Spring Cloud Alibaba学习笔记(18) - Spring Cloud Gateway 内置的过滤器工厂

    参考:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-clou ...

随机推荐

  1. 一次修复linux的efi引导的集中方法总结记录

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...

  2. 【cf补题记录】A. Hotelier

    思考之后再看题解,是与别人灵魂之间的沟通与碰撞 A. Hotelier 题意 给出长度为n的字符串,字符串由'L'.'R'以及数字0~9组成.旅馆有10间房子,L代表客人从左边入住,R代表客人从右边入 ...

  3. HTML页面之间的参数传递

    HTML 与 HTML 的跳转中如何在HTML之中实现参数的传递?主要代码如下:request为方法名称,params 为要获取的参数. function request(params) { var ...

  4. 推荐一款阿里开源的 Java 诊断工具,好用到爆!

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  5. epoll 或者 kqueue 的原理是什么?

    来自知乎:http://www.zhihu.com/question/20122137 epoll 或者 kqueue 的原理是什么? 为什么epoll和kqueue可以用基于事件的方式,单线程的实现 ...

  6. C# 反射、使用场景

    创建一个 Console 控制台应用程序, 1. 创建一个 Project 类 public class Project { public int ID { get; set; } public st ...

  7. git,指南,操作

    助你开始使用 git 的简易指南,木有高深内容,;). Tweet 作者:罗杰·杜德勒 感谢:@tfnico, @fhd and Namics其他语言 english, deutsch, españo ...

  8. 太厉害了,终于有人能把TCP/IP协议讲的明明白白了!

    从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议.实际生活当中有时也确实就是指这两种协议.然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称.具体来说 ...

  9. 无法反序列化的java.util.ArrayList实例出来VALUE_STRING的(Can not deserialize instance of java.util.ArrayList out of VALUE_STRING)

    解决方法: 设置DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY.问题解决.

  10. WebGL第一步

    什么是WebGL? WebGL使用了GLSL ES(OpenGL ES)着色器语言,通过配合调用js相关的绘制接口来实现3D效果. 采用页面中的<canvas>元素来定义绘图区域,canv ...