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

使用Nacos管理配置

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

@Value("${your.configuration}")
private String yourConfiguration; @GetMapping("/test_configuration")
public String testConfiguration(){
return yourConfiguration;
}

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

首先,添加依赖

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

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

spring:
application:
name: study01
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
cluster-name: HZ
file-extension: yaml
profiles:
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,回滚其他版本是可以正常使用的,所以该问题注意一下即可规避。

配置共享

不同环境之间的配置共享

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

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文件如下

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

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

测试代码

@Value("${common1.configuration1}")
private String common1Configuration; @Value("${common2.configuration2}")
private String common2Configuration; @GetMapping("/test_common_configuration1")
public String testCommonConfiguration1() {
return common1Configuration;
} @GetMapping("/test_common_configuration2")
public String testCommonConfiguration2() {
return common2Configuration;
}

测试结果

使用ext-config

实现

spring:
application:
name: study01
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
ext-config:
# 需共享的DataId,yaml后缀不能少,目前只支持yaml/properties
# 越靠后,优先级越高 优先级common2.yaml > common1.yaml
- data-id: common1.yaml
# common1.yaml所在的group
group: DEFAULT_GROUP
# 是否允许刷新,默认false
refresh: true
- data-id: common2.yaml
group: DEFAULT_GROUP
refresh: true
profiles:
active: dev

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

  • shared-dataids < ext-config < 自动

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

spring:
cloud:
config:
# 是否允许本地配置覆盖远程配置,默认true
allow-override: true
# 是否一切以本地配置为准,默认false
override-none: false
# 系统环境变量或系统属性才能覆盖远程配置文件的配置
# 本地配置文件中配置的优先级低于远程配置,默认true
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. win10 无法使用内置管理员账户打开应用

    运行gpedit.msc 启用两项 如何登陆 win 10 账户? 进入 win 10 应用商店,下载一个软件,然后登陆即可

  2. Noip2019暑期训练2

      题目名称 骑士遍历 和谐俱乐部 农场派对 对称二叉树 存盘文件名 knight Beautiful party tree 输入文件名 knight.in Beautiful.in party.in ...

  3. 再谈CAP

    CAP定理设计者Eric Brewer作为Google基础设施副总裁在时隔二十年后重谈CAP定律. Eric Brewer目前正在推动Kubernetes和容器建设,在这篇采访中:Google sys ...

  4. 【转】使用eclipse的todo标签管理任务

    Eclipse中的一些特殊的注释技术包括:    1.    // TODO —— 表示尚未完成的待办事项.    2.    // XXX —— 表示被注释的代码虽然实现了功能,但是实现方案有待商榷 ...

  5. mariadb使用with子句重写SQL性能提升5倍

    几个月前,我们有个产品的开发反馈了个问题,说有个组织结构的查询很慢,几千行的复杂关联需要1秒钟,表示太慢了,原语句如下: SELECT org.org_id, org.dimension, org.o ...

  6. ffmpeg接收udp输入的h264文件流,推流到rtmp服务器

    ffmpeg -re -f h264 -i udp://192.168.5.49:10002 -vcodec libx264 -f flv rtmp://192.168.5.155/live/1

  7. 2-4 【接口Interface Flex布局】让顶部导航滚动

    可以把复杂的类型做命名.例如接口中没有定义年龄,在定义person的时候 如果写了age那么就会报错.因为我们接口中并没有定义年龄. 可选属性,只读属性 新的布局方式 下面这里menu设置类型为Top ...

  8. django安装使用xadmin

    Xadmin介绍 直接替换掉Django自带的admin系统,并提供了很多有用的东西:完全的可扩展的插件支持,基于Twitter Bootstrap的漂亮UI. 完全替代Django admin 支持 ...

  9. 改进初学者的PID-正反作用

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  10. [LeetCode] 237. Delete Node in a Linked List 删除链表的节点

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...