微服务架构 | 2.2 Alibaba Nacos 的统一配置管理
前言
参考资料:
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
《Nacos 官网》
Nacos 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理;
1. Nacos 配置中心基础知识
1.1 Nacos 在配置中心中的功能
- CRUD、版本管理、灰度管理、监听管理、推送轨迹、聚合数据等功能;
1.2 Nacos 配置管理 Data ID 的构成
${prefix}-${spring.profiles.active}.${file-extension}
;- 默认为:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
;- prefix:默认为
spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置; - spring.profiles.active:即为当前环境对应的
profile
。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
; - file-exetension:为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties 和 yaml 类型;
- prefix:默认为
1.3 Nacos 配置的回滚机制
- Nacos 会记录配置文件的历史版本默认保留 30 天,此外还有一键回滚功能,回滚操作将会触发配置更新;
1.4 Nacos 配置的图形化管理界面
- 配置管理;
- 命名空间;
1.5 Namespace、Group、Data ID 三者的关系
类似 Java 里面的 package 名和类名,最外层的 Namespace 是可以用于区分部署环境的,Group 和 Data ID 逻辑上区分两个目标对象;
默认情况下,
Namespace=public
,Group=DEFAULT_GROUP
,Cluster=DEFAULT
;- Namespace 命名空间:主要用来实现隔离,用于解决多环境及多租户数据的隔离问题。比如有三个环境:开发、测试、生产环境,可以创建三个Namespace,不同的Namespace 之间是隔离的;
- Group 分组:可以把不同的微服务划分到同一个分组里面去,用来实现 Data ID 分组管理的机制;
- Data ID:通常用于组织划分系统的配置集;
- Cluster 簇:对指定微服务的一个虚拟划分;
- Instance 实例:微服务的实例;
官方的建议是,通过 Namespace 来区分不同的环境,而 Group 可以专注在业务层面的数据分组;
1.6 Nacos 对配置的 CRUD
- 主要通过提供 Open API 接口或 SDK 实现;
- 客户端通过 Open API 或调用 SDK 接口发送请求给服务器,服务器解析请求,并做相应的处理;
对配置的操作 | SDK | Open API | 说明 |
---|---|---|---|
发布配置 | public boolean publishConfig(String dataId, String group, String content) throws NacosException | POST: /nacos/v1/cs/configs | 将配置保存到 Nacos Config Server 中 |
删除配置 | public boolean removeConfig(String dataId, String group)throws NacosException | DELETE: /nacos/v1/cs/configs | 删除配置中心的指定配置 |
获取配置 | public string getConfig(String dataId, String group, long timeoutMs) throws NacosException | GET: /nacos/v1/cs/configs | 从 Nacos Config Server 中读取配置 |
监听配置 | public void addListener(String dataId, String group, Listener listener) | POST: /nacos/v1/cs/configs/listener | 订阅感兴趣的配置,当配置发生变化时可以收到一个事件 |
1.7 Nacos 动态监听的长轮询机制
- 一般来说,动态监听有两种机制:
比较项 | Pull 机制 | Push 机制 |
---|---|---|
说明 | 客户端从服务端主动拉取数据 | 服务端主动把数据推送到客户端 |
缺点 | 不能保证数据实时性;在服务端配置长时间不更新的情况下,客户端的定时任务会做一些无效的 Pull | 如果客户端的数量比较多,服务端需要耗费大量的内存资源来保存每个连接;需要心跳机制来维持每个连接状态 |
- Nacos 的解决方案:长轮询机制:
- 如果客户端发起 Pull 请求,服务端收到请求之后,先检查配置是否发生了变更:
- 变更:返回变更配置;
- 无变更:设置一个定时任务,延期 29.5s 执行,把当前的客户端长轮询连接加入 allSubs 队列;
- 在这 29.5s 内的配置变化:
- 配置无变化:等待 29.5s 后触发自动检查机制,返回配置;
- 配置变化:在 29.5s 内任意一个时刻配置变化,会触发一个事件机制,监听到该事件的任务会遍历 allSubs 队列,找到发生变更的配置项对应的 ClientLongPolling 任务,将变更的数据通过该任务中的连接进行返回。相当于完成了一次 PUSH 操作;
- 长轮询机制结合了 Pull 机制和 Push 机制的优点;
- 源码分析详情请见:微服务架构 | *2.5 Nacos 长轮询定时机制的源码分析;
1.8 Nacos 配置中心的源码分析
- 由于篇幅有限,该内容放在以下两篇文章:
2. Nacos 基础配置
以 Data ID 方案为例,更多方案详情请见本篇第三点《3. Nacos 加载配置的三种方案》;
2.1 下载 Nacos 服务器
- 详情请见:《微服务架构 | 3.2 Alibaba Nacos 注册中心》的 2. 安装并运行 Nacos 服务器;
2.2 引入 pom.xml 依赖文件
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.3 修改 yml 配置文件
- bootstrap.yml:
# nacos配置
server:
port: 18082
spring:
application:
name: nacos-config-client #必须,构成 Nacos 配置管理 Data ID 字段的一部分
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos 服务注册中心地址
config:
server-addr: localhost:8848 #Nacos 作为配置中心地址
file-extension: yaml #指定 yaml 格式的配置
# prefix: hhh #Data ID 的前缀,如果不指定,就是 nacos-config-client-dev.yaml。指定后,是 hhh-dev.yaml
# refresh: true #是否动态刷新
# group: DEFAULT_GROUP #指定组
# namespace: PUBLIC #指定命名空间 ID
- application.yml:
spring:
profiles:
active: dev # 表示开发环境
2.4 在主程序类上添加注解
- @EnableDiscoveryClient:使用其他组件(Nacos、zookeeper、Consul)作为注册中心;
2.5 编写业务类
- 这里仅编写一个 controller 作为示例:
@RestController
@RefreshScope //使当前类下的配置支持 Nacos 的动态刷新功能
public class ConfigClientController{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
2.6 在 Nacos 服务器中添加配置信息
- 在 Nacos 服务器里新建并添加配置:
- 启动服务,调用接口:
http://localhost:18082/config/info
获取配置信息;
2.7 报错无法装配 bean
- 注意:如果
.yml
和 Nacos 服务器配置的Data ID
匹配不上,将导致 ConfigClientController 类里的${config.info}
找不到,最终报 ConfigClientController 无法装配的错误,如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.configClientController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:380) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:356) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:389) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:186) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:353) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.eagerlyInitialize(RefreshScope.java:134) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.start(RefreshScope.java:125) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.onApplicationEvent(RefreshScope.java:119) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.cloud.context.scope.refresh.RefreshScope.onApplicationEvent(RefreshScope.java:73) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
......
3. Nacos 加载配置的三种方案
- 以下对 bootstrap.yml 的修改都可以在启动时配置 JVM 环境替代,使用如下命令:
-Dspring.profiles.active=${profile}
3.1 Data ID 方案
- 新建三个 Data ID 的环境:
- 指定
spring.profile.active
中的配置,重启服务,可以看到配置已经切换成其他环境了:
spring:
profiles:
active: prod
3.2 Group 方案
- 新建三个 Group 的环境:
- 指定
spring.profile.active
和spring.cloud.nacos.config.group
中的配置,重启服务,可以看到配置已经切换成其他环境了: - application.yml:
spring:
profiles:
active: info #修改
- bootstrap.yml:
server:
port: 18082
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: PROD_GROUP #新增
3.3 Namespace 方案
- 新建两个 Namespace 的环境:
- 克隆 / 新建几份配置文件到新的命名空间,然后编辑修改;
- 指定
spring.profile.active
和spring.cloud.nacos.config.group
中的配置,重启服务,可以看到配置已经切换成其他环境了: - application.yml:
spring:
profiles:
active: dev #修改
- bootstrap.yml:
server:
port: 18082
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: DEFAULT_GROUP #新增
namespace: 48b2da7d-0b26-4c15-907b-9a379db8f7de #新增,命名空间的 ID,在新建命名空间时会给出
最后
新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!
微服务架构 | 2.2 Alibaba Nacos 的统一配置管理的更多相关文章
- 微服务架构 | 3.2 Alibaba Nacos 注册中心
目录 前言 1. Nacos 基础知识 1.1 Nacos 命名方式 1.2 Nasoc 是什么 1.3 Nacos 的 4 个关键特性 1.4 Nacos 生态图 1.5 Nacos 架构图 1.6 ...
- 微服务架构 | *3.5 Nacos 服务注册与发现的源码分析
目录 前言 1. 客户端注册进 Nacos 注册中心(客户端视角) 1.1 Spring Cloud 提供的规范标准 1.2 Nacos 的自动配置类 1.3 监听服务初始化事件 AbstractAu ...
- 微服务架构 | 12.1 使用 Apache Dubbo 实现远程通信
目录 前言 1. Dubbo 基础知识 1.1 Dubbo 是什么 1.2 Dubbo 的架构图 1.3 Spring Cloud 与 Dubbo 的区别 1.4 Dubbo 的特点 1.5 Dubb ...
- Spring Cloud Alibaba+Nacos搭建微服务架构
1. Spring Cloud Alibaba 简介 Spring Cloud Alibaba是阿里巴巴为分布式应用提供的一站式解决方案,能够更方便快捷地搭建分布式平台,nacos拥有着替换eu ...
- Spring Cloud Alibaba微服务架构入门最容易理解篇
微服务架构介绍 Spring Cloud Alibaba推荐的微服务生态架构基于分层架构实现如下: 接入层:最外层为LVS+Keepalived,可承受几十万级高并发流量洪峰,然后再通过内层的ngin ...
- 今天介绍一下自己的开源项目,一款以spring cloud alibaba为核心的微服务架构项目,为给企业与个人提供一个零开发基础的微服务架构。
LaoCat-Spring-Cloud-Scaffold 一款以spring cloud alibab 为核心的微服务框架,主要目标为了提升自己的相关技术,也为了给企业与个人提供一个零开发基础的微服务 ...
- SpringCloud SpringBoot 前后端分离企业级微服务架构源码赠送
基于SpringBoot2.x.SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务敏捷开发系统架构.并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手 ...
- SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
源码地址:GitHub·点这里||GitEE·点这里 一.阿里微服务简介 1.基础描述 Alibaba-Cloud致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开 ...
- Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务
Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...
随机推荐
- vue+uniapp实现美颜拍照录像,相册选择 | 录像限制时长,美颜拍照录像
一.插件简介 Zhimi-BeautyCamera(智密 - 美颜相机图册插件)是一个支持美颜录像,美颜拍照,选择图视频功能,带录像参数时长限制的uniapp原生插件.平台支持:Android.IOS ...
- SpringBoot整合MQTT (使用官方demo)
依赖 <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse. ...
- 交通运输类文档下载——JT/T 808-2019、JT/T 809-2019文档分享
JT/T 808-2019.JT/T 809-2019文档分享 网盘:https://pan.baidu.com/s/1vfgenani8WR3in2lua3qWQ提取码:fktd 官网下载808协议 ...
- 【LeetCode】217. Contains Duplicate 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计词频 使用set 排序 日期 [LeetCo ...
- 【LeetCode】851. Loud and Rich 解题报告(Python)
[LeetCode]851. Loud and Rich 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:// ...
- Chapter 22 Target Trial Emulation
目录 22.1 The target trial 22.2 Causal effects in randomized trails 22.3 Causal effects in observation ...
- 人脸识别中的重要环节-对齐之3D变换-Java版(文末附开源地址)
一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...
- CH7511|LT7211|PS8625替代方案 CS5211 设计EDP转LVDS优势方案原理图+PCB板设计
CH7511|LT7211|PS8625这三款都是专门用于设计EDP转LVDS转接板或者屏转换方案板,CH7511.LT7211.PS8625目前这几款都是出于缺货状态,台湾瑞奇达Capstone 新 ...
- RabbitMQ基础教程系列
Ubuntu16.04下,erlang安装和rabbitmq安装步骤 Ubuntu16.04下,rabbimq集群搭建 C# .net 环境下使用rabbitmq消息队列 .net core使用rab ...
- oceanbase数据库比赛总结
前言 ob数据库大赛由蚂蚁金服的oceanbase团队组织,今年是第一届,宣传很广,比赛十月份开始,但早在上半年就看见大量的宣传了,比赛也是相当的卷.我们进了复赛之后感觉要卷进决赛需要付出的时间精力都 ...