导航

  • 引言
  • 一、什么是配置中心
  • 二、常见的配置中心组件
  • 三、Nacos Config 入门
  • 四、Nacos Config 动态配置
    • 4.1 硬编码方式(默认支持动态生效)
    • 4.2 属性注入
  • 五、配置共享
    • 5.1 相同微服务不同环境间共享
    • 5.2 不同微服务配置共享
  • 六、Nacos Config 的几个概念
  • 总结

引言

本文介绍 Nacos 作为注册中心的使用方法,相关文章《Spring Cloud Alibaba——Nacos实现服务治理》。

一、什么是配置中心

在微服务架构中,关于配置信息,存在一些问题。

  1. 配置文件相对分散,不好维护。
  2. 配置文件不好区分开发、测试、生产环境。
  3. 配置文件无法实时更新。

针对这些问题,引入了配置中心组件,其主要思路是:

  1. 集中配置数据,统一管理,提供一套标准接口。
  2. 由各个服务主动拉取配置中心中的配置信息。
  3. 动态更新。

二、常见的配置中心组件

  • Apollo
    由携程开源的分布式配置中心。特点很多,如配置实时生效,支持灰度发布功能,并能对所有配置进行版本管理、操作审计等功能,提供开放平台API,文档详尽。
  • Disconf
    由百度开源的分布式配置中心,底层基于Zookeeper实现配置变更后的实时通知和生效。
  • Spring Cloud Config
    Spring Cloud 自带的配置中心组件。可以和 Spring 无缝衔接,使用方便,并且它 配置存储支持Git 。但缺少可视化的操作界面,配置也无法实时生效,需要重启和刷新。
  • Nacos
    Spring Cloud Alibaba 技术栈中的一个组件,Nacos 除了可以做服务注册中心,也兼顾了服务配置中心。

三、Nacos Config 入门

以 Nacos Server 作为 配置中心,各个微服务作为客户端,将微服务中的配置文件统一存放在 Nacos 上,然后各个微服务从 Nacos 上拉取配置。

以 shop-product 微服务为例,简单演示下效果。

1、引入 nacos-config 依赖

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

2、将配置转移到 Nacos
登录 Nacos 控制台,点击新建配置,将本地配置粘贴到 Nacos 编辑器中,格式选择 yaml。

Data Id 规则
应用名-环境.格式
例如
spring.application.name=service-product
spring.profiles.active=dev
spring.cloud.nacos.config.file-extension=yaml
那么 data Id 就是 service-product-dev.yaml

3、引入 bootstrap.yml 文件
bootstrap.yml 作为新的引导文件,用于拉取 Nacos 上的远程配置信息。

spring boot 配置文件优先级
bootstrap.properties > bootstrap.yml > application.properties > application.yml

spring:application:name: service-productprofiles:active: devcloud:nacos:config:server-addr: localhost:8848file-extension: yaml   # 配置格式(默认是 properties)

4、测试
启动项目,可以正常访问。

四、Nacos Config 动态配置

4.1 硬编码方式(默认支持动态生效)

硬编码方式通过 Environment 对象提供的 getProperty(key) 来获取配置信息,本身就是支持动态更新的。

@Autowired
private ConfigurableApplicationContext applicationContext;@GetMapping("/appName")
public String getConfig() {String appName = applicationContext.getEnvironment().getProperty("config.appName");return appName;
}

启动程序,请求 appName 接口,获取不到任何数据:

打开 Nacos Config,配置 config.appName 信息,并发布:

直接重新访问,不需要重启,即可取得数据:

4.2 属性注入

使用 @Value("${key}") 的形式完成配置的注入:

@Value("${config.appName}")
private String appName;@GetMapping("/appName")
public String getConfig() {return appName;
}

这种方式可以解决硬编码的高耦合问题,代码也更优雅,是Spring 推荐的使用方式,但是这种方式默认是不支持动态刷新配置的,需要加入额外的一个类注解——@RefreshScope:

@RefreshScope
@RestController
@RequestMapping("/config")
public class ConfigController {@Value("${config.appName}")private String appName;@GetMapping("/appName")public String getConfig() {return appName;}
}

五、配置共享

配置共享旨在解决重复配置项的问题。Nacos 支持配置共享,即可以将大家都有的重复配置项提取到共享配置中。

5.1 相同微服务不同环境间共享

相同微服务的不同环境的公共配置,只需要在配置的 Data Id 上去掉诸如 -dev 等环境标识即可。

例如,dev 环境的配置是 service-product-dev.yaml ,test 环境的配置是 service-product-test.yaml,那么公共配置就可以是 service-product.yaml。
把公共的配置信息全部移动到 service-product.yaml 中,service-product-dev.yaml 或 service-product-test.yaml 只保留环境特定的配置项即可。

5.2 不同微服务配置共享

可以单独提取一个公共配置,例如,dataId --> all-service.yaml ,然后在各个微服务的 bootstrap.yaml 中加入如下配置:

spring:cloud:nacos:config:# ...其他配置...shared-dataids: all-service.yaml # 公共配置refreshable-dataids: all-service.yaml # 动态刷新的配置文件

测试,以下几个问题:

  1. 通过shared-dataids引入的公共配置是否可以在不同的微服务之间生效?
  2. 通过shared-dataids引入的公共配置是否可以做到相同微服务不同环境的切换?
  3. 通过refreshable-dataids 表示的 dataId,是否可以在不使用 @RefreshScope 注解的情况下,直接刷新指定配置文件(不仅是公共也可能是私有配置)的配置项?
  4. shared-dataids 和 refreshable-dataids 都是复数形式,如何配置多个 dataId?

在 Nacos Config Server 上指定三个配置文件:all-service.yaml、service-product-dev.yaml 和 service-product-test.yaml。它们的配置信息如下:

all-service.yaml

server:port: 8081tomcat:max-threads: 5
spring:application:name: service-productdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=trueusername: rootpassword: 123456cloud:nacos:discovery:server-addr: localhost:8848jpa:properties:hibernate:hbm2ddl:auto: update#InnoDB方言dialect: org.hibernate.dialect.MySQL5InnoDBDialect

service-product-dev.yaml

config:appName: productenv: dev

service-product-test.yaml

config:appName: productenv: test

本地 bootstrap.yaml 配置:

spring:application:name: service-productprofiles:active: devcloud:nacos:config:server-addr: localhost:8848file-extension: yaml   # 配置格式(默认是 properties)shared-dataids: all-service.yaml # 公共配置refreshable-dataids: all-service.yaml # 动态刷新的配置文件

测试代码:

@RestController
@RequestMapping("/config")
public class ConfigController {@Value("${config.appName}")private String appName;@Value("${config.env}")private String env;@GetMapping("/env")public String getConfig() {return env;}
}

启动成功,说明可以获取公共配置,且访问测试接口,可以拿到配置信息:

修改本地 bootstrap.yaml 配置信息:active=test,重新启动,也可以拿到对应的test环境的配置信息:

对于自动刷新问题

对于 refreshable-dataids 配置,只针对公共配置有效。自动刷新的生效规则如下:

环境配置
必须使用 @RefreshScope 的方式动态生效,且不需要增加其他额外配置
公共配置
不仅要使用 @RefreshScope,还要增加 refreshable-dataids 令其支持自动刷新

如果想引入多个共享配置,可以使用逗号分隔:

spring:cloud:nacos:config:shared-dataids: 'all-service.yaml,common.yaml' # 公共配置refreshable-dataids: 'all-service.yaml,common.yaml'  # 动态刷新的配置文件

六、Nacos Config 的几个概念

1、命名空间(Namespace)
命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间。

可以在 Nacos 上新建命名空间:

若希望引用不同命名空间的配置,可以在 bootstrap.yaml 中加入 namespace: 命名空间ID :

spring:cloud:nacos:config:namespace: 835f29bd-4cf8-4bd7-9ace-462a69643bd4

2、配置分组(Group)
配置分组可以将不同的服务归类到同一个分组。一般以项目为单位,这个项目下的所有微服务的配置放到同一个组。

3、配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。

总结

如何使用Nacos 配置中心,只需要在项目本地引入 bootstrap.yaml 文件,并配置如下信息,就可以拉取 Nacos Config Server 上的远程配置:

spring:application:name: service-productprofiles:active: testcloud:nacos:config:server-addr: localhost:8848 # Nacos 地址file-extension: yaml   # 配置格式(默认是 properties)

关于共享配置,(经过实际测试)有以下几点重要规则:

1、同一微服务,公共配置项,可直接以 ${spring.application.name}.yaml 来命名 DataId,视为共享配置。
1、在本地的 bootstrap.yaml 中使用 shared-dataids 和 refreshable-dataids 来指定共享配置
2、多共享配置的格式(注意引号):shared-dataids: ‘all-service.yaml,common.yaml’
3、refreshable-dataids 用于设置共享配置是否支持动态刷新,至于要不要动态刷新还需要使用 @RefreshScope 。也就是说,如果希望共享配置动态刷新,不仅要指定 refreshable-dataids,还需要配置 @RefreshScope。
4、环境配置的动态刷新只受 @RefreshScope 影响,不需要额外指定 refreshable-dataids。
5、配置重复问题。多个共享配置都包含重复的配置项,则以 bootstrap.yaml 中 shared-dataids 配置项靠后的共享配置为准。如两个共享配置 all.yaml 和 common.yaml,都包含 appName 配置项,如果 shared-dataids=‘all.yaml,common.yaml’,则以 common.yaml 中的配置信息为准。
共享配置和环境配置的配置项重复,以环境配置的配置项为准。

Spring Cloud Alibaba —— Nacos Config 配置中心相关推荐

  1. Spring Cloud Alibaba Nacos 分布式配置中心

    文章目录 1 摘要 2 核心 Maven 依赖 3 核心代码 3.1 bootstrap 配置文件 3.2 application 配置文件 3.3 配置测试类 - Controller 层 3.4 ...

  2. Spring Cloud Alibaba——Nacos服务配置中心

    Nacos服务配置中心 建Module 改Pom 改yml Nacos端操作 写启动类 写controller层 测试 Tips 简单记录下使用Nacos作为服务配置中心,此篇建立在上篇的Nacos服 ...

  3. nacos 配置动态刷新_使用 Spring Cloud Alibaba Nacos Config 作为配置中心

    什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Con ...

  4. Spring Cloud Alibaba Nacos 分布式配置

    Spring Cloud Alibaba 分布式配置 1. 简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spr ...

  5. SpringCloud Alibaba - Nacos 作为配置中心 读取Properties配置信息

    SpringCloud Alibaba是阿里巴巴致力于对微服务的管理.配置.注册等一整套的解决方案. 简介 Nacos 提供用于存储配置和其他元数据的 K-V 存储,为分布式系统中的外部化配置提供服务 ...

  6. Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注 ...

  7. Spring Cloud Alibaba - 19 Nacos Config配置中心加载不同微服务的通用配置的两种方式

    文章目录 Pre 实现 方式一 通过 shared-dataids 方式 方式二 通过 ext-config方式 配置文件优先级 源码 Pre Spring Cloud Alibaba - 18 Na ...

  8. Spring Cloud Alibaba - 18 Nacos Config配置中心加载相同微服务的不同环境下的通用配置

    文章目录 需求 实现 Step 1 Nacos Config 新增公共配置 Step 2 验证 配置文件优先级 源码 需求 举个例子,同一个微服务,通常我们的servlet-context 都是相同的 ...

  9. 513、Java Spring Cloud Alibaba -【Spring Cloud Alibaba Nacos】 2021.08.30

    目录 1.Nacos简介 2.使用 Docker 快速搭建 Nacos 1.4 2.1 从 git 上 clone 项目: 2.2 clone 完成后,进入 naocs-docker 目录: 2.3 ...

最新文章

  1. 练习7-11 字符串逆序 (15 分)
  2. Centos7 搭建FastDFS文件管理系统及简单的迁移方法
  3. 【笔记】shellcode相关整理
  4. Vue后台管理系统实现登录功能
  5. MVC与MVVM框架
  6. 自己写的简易多任务系统---基于pic18fxxx
  7. PHP图形图像的典型应用 --常用图像的应用(验证码)
  8. 不要重新发明轮子_是否重新发明轮子
  9. 【渝粤教育】广东开放大学 Python基础与应用 形成性考核 (21)
  10. spine纹理解包 黑底_“包治百病”是真理,这些小众包真的很治愈系
  11. Redis源码解析(1)——源码目录介绍
  12. post postman 传递数组对象_okhttp传递数组参数
  13. HDU-4035 Maze 概率DP
  14. ICCV 2021 best paper-Swin Transformer:对各类SOTA的降维打击!
  15. JAVA内存管理+String创建字符串对象+常量池详解(合集)
  16. Office | Office365 离线安装包选择安装word、ppt、excel
  17. t420i升级固态硬盘提升_老电脑想升级,如何选购最适合的固态硬盘
  18. 蚂蚁金服入职考试_我是如何拿到蚂蚁金服实习 offer 的
  19. android热成像模块,Thermal Camera
  20. 使用Tensorflow实现声纹识别

热门文章

  1. Linux系统下启动MySQL的命令及相关知识
  2. vb.net 的 openFileDialog 控件文件筛选器使用
  3. linux——进程(创建、终止、等待、替换)
  4. 【Jetson-Nano】2.Tensorflow object API和Pytorch的安装
  5. centos安装php7编译
  6. 计算机中隐藏的文件找不到了怎么办,隐藏文件夹找不到了怎么办【图解】
  7. python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
  8. php对数组进行合成的函数,php合并数组函数array_merge()
  9. sublime python插件配置_sublime text 3 + python配置,完整搭建及常用插件安装
  10. oracle undo段的作用,Oracle数据库中Undo数据段的作用及类型