Spring Cloud Alibaba —— Nacos Config 配置中心

导航

  • 引言
  • 一、什么是配置中心
  • 二、常见的配置中心组件
  • 三、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 中的配置信息为准。
共享配置和环境配置的配置项重复,以环境配置的配置项为准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codesys com库_CODESYS在线库,酷德网镜像站启用

近期由于国内网络问题&#xff0c;造成 stroe.codesys.com 网站无法访问。在线库无法下载。为了不影响广大CODESYS用户的正常使用&#xff0c;酷德网建立stroe.codesys.com的国内镜像站:主站&#xff1a; https://store.hicodesys.com:8421/CODESYSLibs/备用站&#xff1a; …

分布式事务的解决思路与方案

导航一、事务的种类与场景二、分布式事务解决方案2.1 全局事务2.2 可靠消息事务2.3 最大努力通知2.4 TCC 事务三、TCC 模式常见问题3.1 二阶段幂等3.2 空回滚3.3 资源悬挂一、事务的种类与场景 本地事务实际上就是指数据库的事务&#xff0c;参考《MySQL —— 事务与隔离级别总…

css3 下边框缓缓划过_干货来袭!web前端开发工程师必看之如何使用CSS3实现瀑布流效果?...

首先,我们来看一下什么是瀑布流布局效果,比如电商网站 蘑菇街原理图:在一个大盒子里&#xff0c;放置多个小盒子&#xff0c;小盒子的大小可以不一致&#xff0c;长短不一样&#xff0c;呈现一种瀑布流的效果。使用CSS3S实现只需要如下4步:1. 准备图片素材2. 书写相应HTML结构3…

Spring Cloud Alibaba —— Seata 分布式事务框架

导航一、Seata 介绍二、Seata 的工作原理2.1 三个角色2.2 工作流程三、Seata AT 工作机制3.1 一阶段3.2 二阶段四、案例演示&#xff08;待补充&#xff09;一、Seata 介绍 官网&#xff1a;Seata 官网 Seata 是2019 年阿里巴巴中间件团队发起的开源项目&#xff0c;其前身是…

云麦体脂秤华为体脂秤_华为、小米和有品体脂秤哪个品牌好?三款智能体脂秤横评结果排行...

如今生活水平的提高&#xff0c;也让更多人开始关注健康问题。由于大部分时间都忙于工作&#xff0c;本身就运动少、体重超标等等。如果长期得不到控制的话&#xff0c;会造成日后脂性肝炎、肝纤维化、肝癌&#xff0c;想想都可怕&#xff0c;在意识到这样的严重性&#xff0c;…

idea 调用c#接口_Dubbo 接口测试方法

一.直接通telnet然后用dubbo协议调用方法&#xff08;1&#xff09;在项目的配置文件中可以看到dubbo.protocol.port10022说明dubbo对外暴漏的端口为10022&#xff0c;直接用telnet访问此端口。telnet lcoalhost 10022然后就能看到说明连接成功。用ls查看服务查看服务下有那些方…

MySQL 面试问答

导航一、什么是回表查询&#xff1f;如何避免回表查询&#xff1f;二、为什么MySQL建议使用自增主键&#xff1f;什么是代理主键、业务主键&#xff1f;三、为什么MySQL建议单表不超过2000W数据&#xff1f;四、MySQL自增id用完了怎么办&#xff1f;五、MySQL自增主键是连续的吗…

tcs标准编写软件_【公益培训】知你所需 | 标准编写格式及TCS模板应用线上公益培训...

企业标准编写的水平及TCS工具使用的能力是实施企业标准化工作的基础。TCS标准编写软件是辅助标准编写的工具性软件&#xff0c;方便标准编写人员快捷准确的编写标准草案&#xff0c;有效提升标准供给质量。为贯彻落实疫情防控和助力企业复工复产工作&#xff0c;山东标准化协会…

Linux进阶之路——常用命令总结

一、帮助命令 help man type区分内建、外建命令 【扩展】关于内建命令与外建命令。 内建命令属于shell程序的一部分&#xff0c;包含一些比较简单的Linux命令。这些命令被写在/bin/bash 文件的 builtins 里面&#xff0c;由shell程序识别并在shell程序内部完成运行。通常在Li…

bios设置 联想m8000t_怎么进bios设置硬盘启动顺序

操作说明&#xff1a;1、不同电脑进BIOS按键不一样&#xff0c;常见的有del、F1、F2、Esc、enter、F8、F9等2、在电脑启动时&#xff0c;不停按Del、F2等按键会进入BIOS设置界面&#xff0c;开机按哪个键进BIOS设置BIOS类型一&#xff1a;CMOS Setup Utility1、启动时按Del进入…

MySQL 基础 ————事务与隔离级别总结

引言 在处理并发读或写时&#xff0c;可以通过实现一个由两种类型的锁组成的锁系统来解决问题&#xff1a; 共享锁&#xff08;shared lock&#xff09;和排它锁&#xff08;exclusive lock&#xff09;&#xff0c;也叫读锁&#xff08;read lock&#xff09;和写锁&#xff0…

32f407tim4时钟源频率_慎重选择时钟发生器,别让这俩指标影响你的ADC 「图片」...

系统设计师通常侧重于为应用选择最合适的数据转换器&#xff0c;在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而&#xff0c;如果不慎重考虑时钟发生器的相位噪声和抖动性能&#xff0c;数据转换器动态范围和线性度性能可能受到严重的影响。系统考虑因素采用…

Spring —— IoC 容器详解

引言 本篇博客总结自官网的《The IoC Container》&#xff0c;其中会结合王富强老师的《Spring揭秘》融入自己的语言和理解&#xff0c;争取通过这一篇文章彻底扫除spring IOC的盲区。 本文介绍什么是 IoC 容器&#xff0c;什么是 Bean&#xff0c;依赖&#xff0c;Bean Defi…

nvidia控制面板点了没反应win7_win7系统Nvidia控制面板怎么设置?

许多用户不知道Nvidia控制面板怎么设置?那么Nvidia控制面板如何设置呢?其实设置的方法很简单。接下来&#xff0c;小编就把Nvidia控制面板设置的方法告诉大家。1、首先在桌面右键点击选择NVIDIA控制面板。2、显卡的设置性能肯定是要高好了&#xff0c;所以在性能设置方面&…

切割 字符串_web前端如何使用字符串

一、字符串概述定义&#xff1a;字符串就是用单引号或者双引号包裹起来的&#xff0c;零个或多个排列在一起的字符。例如&#xff1a;’javascript‘, “”, “345” , ’9-11a$‘, “xiao_yuanLian”嵌套&#xff1a;字符串可以嵌套。在单引号包裹的字符串内部&#xff0c;应该…

Redis 缓存实战——缓存、数据库一致性问题分析与解决方案

引言 缓存与数据库一致性的问题自从出现了缓存概念后就一直被提及&#xff0c;它是一个缓存方案的先天缺陷&#xff0c;只要存在缓存&#xff0c;就势必会讨论缓存与数据库一致性的问题。 一致性问题还广泛存在于各种分布式存储场景中&#xff0c;如主从一致性等等。 本篇博…

Java 多线程 —— AQS 详解

引言 AQS 是AbstractQuenedSynchronizer 的缩写&#xff0c;抽象的队列式同步器&#xff0c;它是除了java自带的synchronized关键字之外的锁机制。是 JUC 下的重要组件。 相关产物有&#xff1a;ReentrantLock、CountDownLatch、Semaphore、ReadWriteLock等。 一、AQS的设计…

的主机名_如何在Mac 上更改电脑的名称或本地局域网主机名?

我们知道&#xff0c;一台电脑有其设定的具体名称&#xff0c;电脑的名称和本地主机名用于在本地网络上识别您的电脑。当我们需要自定义电脑名称或本地局域网主机名时&#xff0c;则需要对其进行更改。那我们该如何更改呢&#xff1f;有需要的小伙伴们快和小编一起来看看吧~更改…

dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单

前言这几天又拾起老本行&#xff0c;复习复习Android&#xff0c;才发现忘的差不多了&#xff0c;上午做了一个小Demo&#xff0c;配合Scroller做了一个轮播图&#xff0c;效果如下&#xff0c;但是不知为何&#xff0c;录制的GIF成这样&#xff0c;凑乎一下看看。原理是继承Vi…

JVM——CPU缓存架构与Java 内存模型

导航一、CPU缓存架构与一致性协议1.1 CPU缓存架构1.2 缓存行与伪共享问题1.3 MESI 缓存一致性协议1.4 伪共享的解决办法二、JMM Java 内存模型2.1 JMM 简介2.2 原子性、可见性、有序性2.3 八大内存交互操作2.4 happens-before 原则一、CPU缓存架构与一致性协议 1.1 CPU缓存架构…