Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。

首先我们来看一下,微服务架构下关于配置文件的一些问题:

  1. 配置文件相对分散,在一个微服务架构中,配置文件会随着微服务的增多变得越来越多,而且分散在各个微服务中,不好统一管理和配置。
  2. 配置文件无法区分环境,微服务项目可能会有多个环境,例如:开发环境、预发布环境、生成环境。每个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
  3. 配置文件无法实时更新,我们修改好了配置文件之后,必须重新启动微服务才能使配置文件生效,这对一个正在运行的项目来说是非常不友好的。

基于上面这些问题,我们就需要引入配置中心来解决。

创建一个config服务

  1. 新建一个config服务,在pom文件中添加必要依赖
 <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<!--Spring cloud Hoxton.SR3-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
  1. 在配置文件指定config地址等信息

    注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件

配置文件加载的优先级(由高到低)

bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml

server:
port: 9002
spring:
profiles:
active: dev
application:
name: nacos-config-server
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心
file-extension: yaml # 这里指定的文件格式需要和nacos上新建的配置文件后缀相同,否则读不到
  1. 在nacos客户端配置管理新建一个配置

  • Data ID:默认为 ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} 或 ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
  • Group:对应配置文件中的${spring.cloud.nacos.config.group},默认为DEFAULT_GROUP
  • 配置格式:对应配置文件中的${spring.cloud.nacos.config.file-extension},
  • 配置内容:根据你的配置格式按对应的格式填写即可。
  1. 在config服务中获取配置信息
@SpringBootApplication
public class NacosConfigServerApplication { public static void main(String[] args) {
SpringApplication.run(NacosConfigServerApplication.class, args);
}
@RestController
class TestController { @Value("${config.info}")
private String config; @GetMapping("/test")
public String hello() {
return config;
} }
}

我们通过@Value注解可以获取到配置中心的值。

@RefreshScope动态刷新配置

在TestController上加个@RefreshScope注解,然后我们去nacos客户端手动修改config.info的信息,然后重新调用这个/test接口,会发现响应的是修改后的内容。

配置自定义的命名空间

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

在没有明确指定命名空间配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。

首先我们在nacos客户端新建一个命名空间,

然后我们在配置文件中新增下面这个属性,具体的值填写我们新增命名空间的ID,这样启动config服务后,就会自动去这个命名空间下寻找对应的配置文件了。

spring:
cloud:
nacos:
config:
namespace:

多环境配置的三种方式

最开始的时候我们也说过微服务项目会有多个环境,我们如何实现和管理这些环境呢?

1.通过Data ID 和profiles实现

我们可以在配置文件中指定spring.profiles.active = **,然后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}配置来区分不同的环境。

2.通过Group实现

我们可以为不同的环境新建不同的分组,然后的配置文件中指定spring.cloud.nacos.config.group=组名,这样也可以实现不同环境的区分。

3.通过Namespace实现

这种方式是官方建议的方式,在nacos客户端中新建不同的分组,然后再配置文件中指定namespace就可以区分不同的环境了。

自定义扩展的Data ID

大多数时候我们可能更加倾向于将不同的配置分开写到不同的配置文件中,比如我想把文件类和日志类的配置拆分开写到两个配置中,nacos也是支持这种写法的。

  1. 我们在nacos中新建两个Data ID 分别是log.yaml 和 file.yaml 的文件。

我们在配置文件中分别加入以下内容:log:level: 2,file:url: "http://123.com"。

  1. 如何配置呢
spring:
cloud:
nacos:
config:
extension-configs[0]:
data-id: log.yaml
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
extension-configs[1]:
data-id: file.yaml
group: DEFAULT_GROUP
refresh: true

为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用如下配置:

spring:
cloud:
nacos:
config:
shared-configs[0]:
data-id: log.yaml
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
shared-configs[1]:
data-id: file.yaml
group: DEFAULT_GROUP
refresh: true
  1. 深入思考,既然我们有两个配置文件,假如两个配置文件中出现一样的key值,这样我们程序中会加载哪个配置呢,其实nacos在设计的时候也考虑到了优先级问题,下面我们一起来看看。

我们将file.yaml中的配置改成log:level: 22。这时候我们加载写个接口取一下配置。看看它取到的是哪个文件的内容。

	RestController
@RefreshScope
class TestController { @Value("${log.level}")
private String log; @GetMapping("/test")
public String hello() {
return "log.lelve="+log;
} }

结果取到的是file.yaml中的配置,这是因为多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。

注意:spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

扩展:不同方式配置加载优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

  • A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 通过内部相关规则(spring.cloud.nacos.config.prefixspring.cloud.nacos.config.file-extensionspring.cloud.nacos.config.group)自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

代码示例

Spring Cloud Alibaba系列(二)nacos作为服务配置中心的更多相关文章

  1. Spring Cloud Alibaba(二) 配置中心多项目、多配置文件、分目录实现

    介绍 之前Spring Cloud Config基础篇这篇文章介绍了Spring Cloud Config 配置中心基础的实现,今天继续聊下Spring Cloud Config 并结合nacos做服 ...

  2. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  3. Spring Cloud Alibaba基础教程-Nacos(二)

    在Spring Cloud Alibaba基础教程-Nacos(一)当中学习了,如何从 nacos当中 通过Java的方式获取值,以及连接数据库,下面我们开始第二篇的学习 ,如果对你有帮助,方便下次寻 ...

  4. Spring Cloud Alibaba基础教程-Nacos(三)

    在Spring Cloud Alibaba基础教程-Nacos(二)当中学习了,如何使用 nacos图形化界面操作 ,使用Nacos部署集群,下面我们开始Nacos最后一篇的学习 ,如果对你有帮助,记 ...

  5. Spring Cloud Alibaba基础教程-Nacos(一)

    2019快结束,也有很久没写博客了,今天我们来谈谈Nacos,如果对您有帮助,麻烦左上角点个关注 ,谢谢 ! 嘻嘻 今天先写第一篇 文章目录 为什么要使用Nacos Eureka 闭源 Nacos的优 ...

  6. spring cloud 2.x版本 Eureka Server服务注册中心教程

    本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1.创建服务注册中心 1.1 新建Spring boot工程:eureka-server 1 ...

  7. Spring Cloud Alibaba系列(一)nacos作为服务注册中心

    Spring Cloud Alibaba各组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Ver ...

  8. Spring Cloud Alibaba 实战 之 Nacos 服务注册和发现

    服务注册与发现,服务发现主要用于实现各个微服务实例的自动化注册与发现,是微服务治理的核心,学习 Spring Cloud Alibaba,首先要了解框架中的服务注册和发现组件——Nacos. 一.Sp ...

  9. Spring Cloud Alibaba系列之分布式服务组件Dubbo

    本博客的例子代码可以在github找到下载链接:代码下载 SpringBoot.SpringCloud Alibaba系列博客专栏:链接 1.分布式理论 1.1.分布式基本定义 <分布式系统原理 ...

随机推荐

  1. webWMS开发过程记录(二)- WMS是什么

    (参考:WMS-百度百科) 简介 WMS是仓库管理系统(Warehouse Management System)的缩写,是一款标准化.智能化过程导向管理的仓库管理软件仓库管理系统,是通过出入库业务.仓 ...

  2. echarts多个数据添加多个纵坐标

    在我们echarts开发中,肯定会遇到一个问题.那就是当有多个数据且数据大小差距太大时,就会出现有些数据小到看不到的情况.所以在遇到这种情况时,我通常的解决办法就是给他多加一个坐标轴. option  ...

  3. DES原理及代码实现

    一.DES基础知识DES技术特点 DES是一种用56位密钥来加密64位数据的方法    DES采取了分组加密算法:明文和密文为64位分组长度    DES采取了对称算法:加密和解密除密钥编排不同外,使 ...

  4. 如何使用python,才能像人民日报的“点亮”武汉景点

    如何使用python,才能像人民日报的“点亮”武汉景点 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Allen P ...

  5. L15卷积神经网络基础

    卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维互相关运 ...

  6. stand up meeting 12/01/2015

    part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云   赶工sprint3,各部分要合在一起时出现各种问题,各种修改测试:UI本身的功能继续实现完善    6 UWP对控件的 ...

  7. T - Nash Matrix CodeForces - 1316D

    题意: 输入n行数,没行由2*n个数,表示一个坐标(x,y). 如果x和y==-1表示从该点(i,j)出发,按照构造的前移动不会停下. 否则就要到点(x,y)处停下. 题解: 首先处理-1  枚举每个 ...

  8. Python巩固 - 第N天

    一.函数解释: def fact(n, m = 1): s = 1 for j in range(1, n+1): s = s*j return n, m, s//m print(fact(10, 5 ...

  9. net core天马行空系列:降低net core门槛,数据库操作和http访问仅需写接口,实现类由框架动态生成

    引文   hi,大家好,我是三合.不知各位有没有想过,如果能把数据库操作和http访问都统一封装成接口(interface)的形式, 然后接口对应的实现类由框架去自动生成,那么必然能大大降低工作量,因 ...

  10. C# WCF 之优势及特性

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...