SpringCloud核心组件(四)
文章目录
- Nacos
- Nacos 配置中心
- 1.起源
- 2.基本概念
- Profile
- Data ID
- Group
- 3.基础配置
- a. bootstrap.yml
- b. application.yml
- c. nacos 中的配置 DataID
- d.测试读取配置中心配置内容
- 4.配置隔离
- a.命名空间
- b.DataID
- c.bootstrap.yml
- d.service 隔离
- 5.配置拆分
- a.配置拆分策略
- b.DataID 配置
- c.配置文件 bootstrap.yml
Nacos
Nacos 配置中心
在 Spring Boot 项目中,默认会提供一个 application.properties 或者 application.yml 文件,
可以把一些全局性的配置或者需要动态维护的配置写入改文件,比如数据库连接,功能开关,限流阈值,服务地址等。
为了解决不同环境下服务连接配置等信息的差异,Spring Boot 还提供了基于 spring.profiles.active={profile}的机制来实现不同的环境的切换。
1.起源
随着单体架构向微服务架构的演进,各个应用自己独立维护本地配置文件的方式开始显露出它的不足之处。
主要有下面几点:
-
配置的动态更新:在实际应用会有动态更新位置的需求,比如修改服务连接地址、限流配置等。在传统模式下,需要手动修改配置文件并且重启应用才能生效,这种方式效率太低,重启也会导致服务暂时不可用。
-
配置集中式管理:在微服务架构中某些核心服务为了保证高性能会部署上百个节点,如果在每个节点中都维护一个配置文件,一旦配置文件中的某个属性需要修改,可想而知,工作量是巨大的。
-
不同部署环境下配置的管理:前面提到通过 profile 机制来管理不同环境下的配置,这种方式对于日常维护来说也比较繁琐。
统一配置管理,就是弥补上述不足的方法。
简单说,是把各个应用系统中的某些配置放在一个第三方中间件上进行统一维护。
然后,对于统一配置中心上的数据的变更需要推送到相应的服务节点实现动态跟新,所以微服务架构中,配置中心也是一个核心组件。
2.基本概念
Profile
Java 项目一般都会有多个 Profile 配置,用于区分开发环境,测试环境,准生产环境,生成环境等,
每个环境对应一个 properties 文件(或是 yml/yaml 文件),然后通过设置 spring.profiles.active 的值来决定使用哪个配置文件。
spring:application:name: order-serviceprofiles:active: dev
Nacos Config的作用就把这些文件的内容都移到一个统一的配置中心,即方便维护又支持实时修改后动态刷新应用。
Data ID
当使用 Nacos Config 后,Profile 的配置就存储到 Data ID 下,即一个 Profile 对应一个 Data ID
- Data ID 的拼接格式:
${prefix}-${spring.profiles.active}.${file-extension} - prefix 默认为
spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置 spring.profiles.active取spring.profiles.active的值,即为当前环境对应的profile,当spring.profiles.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。
Group
当配置项太多或者有重名时,可以通过分组来方便管理 , 这就是 Group
Group 默认为 DEFAULT_GROUP,
可以通过 spring.cloud.nacos.config.group 来配置
3.基础配置
nacos 可以作为配置中心使用,在 payment 工程中如下步骤,启动 nacos 配置中心
a. bootstrap.yml
注意:Sprnig Boot 2.4.X 版本后需要手动添加 spring-cloud-starter-bootstrap 组件后,才能加载 bootstrap.yml 配置文件
<!--nacos-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery<artifactId>
</dependency
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config<artifactId>
</dependency>
bootstrap.yml:
spring:application:name: payment-serviceprofiles:active: devcloud:nacos:discovery:server-addr: 192.168.146.128:8848config:file-extension: yamlserver-addr: 192.168.146.128:8848
注意:spring.cloud.nacos.config 配置必须放到 bootstrap.yml 配置文件中,保证在优先读取配置文件再启动,否则配置无效
b. application.yml
server:port: ${port:9001}spring:application:name: payment-servicecloud:nacos:discovery:server-addr: 192.168.146.128:8848 # Nacos注册中心地址
c. nacos 中的配置 DataID

spring:application:name: payment-serviceprofiles:active: devmain:allow-bean-definition-overriding: true #允许覆盖bean定义cloud:nacos:discovery:server-addr: 192.168.146.128:8848config:file-extension: yamlserver-addr: 192.168.146.128:8848prefix: payment-service-devshared-configs[0]:data-id: common.yamlgroup: DEFAULT_GROUPrefresh: true
d.测试读取配置中心配置内容
PaymentController
package com.nianxi.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author Jie.* @description: TODO* @date 2024/11/14* @version: 1.0*/
@RestController
@RequestMapping("/payment")
@RefreshScope // 支持Nacos的动态刷新功能
public class PaymentController {@Value("${server.port}")private String serverPort;@GetMapping("/{id}")public ResponseEntity<String> payment(@PathVariable("id") Long id) {return ResponseEntity.ok("订单号 = " + id + ",支付成功,server.port" + serverPort);}@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}
}
访问地址http://localhost:9001/payment/config/info

当修改配置值,会结果已经改变,Nacos 自带自动刷新功能。

4.配置隔离
通常,企业研发的流程是这样的:先在开发测试环境开发和测试功能,然后灰度,最后发布到生产环境。
并且,为了生产环境的稳定,需要将测试环境和生产环境进行隔离,Nacos 可以通过三种方式进行配置隔离:
- Nacos 的服务器
- namespace 命名空间
- group 分组,
在 bootstrap.yml 文件中可以通过配置 Nacos 的 server-addr、namespace 和 group 来区分不同的配置信息。
- Nacos 的服务器 spring.cloud.nacos.config.server-addr
- Nacos 的命名空间 spring.cloud.nacos.config.namespace,注意,这里使用命名空间的 ID 不是名称
- Nacos 的分组 spring.cloud.nacos.config.group
Nacos 配置隔离具体步骤如下:
a.命名空间
创建 dev,test,prod

b.DataID
在不同命名空间下创建如下 DataID(克隆即可)

注意稍微更改各自配置信息以作区别
c.bootstrap.yml
spring:application:name: payment-serviceprofiles:active: devmain:allow-bean-definition-overriding: true #允许覆盖bean定义cloud:nacos:discovery:server-addr: 192.168.146.128:8848config:prefix: payment-service-devserver-addr: 192.168.146.128:8848file-extension: yamlnamespace: f546a969-b313-46a4-b0e1-a1fc9ab716d3group: MY_GROUP
注意:如果不配置
namespace默认为public,不配置group默认为DEFAULT_GROUP
此时读取的配置为 namespace=dev,group=MY_GROUP 的配置页面显示 config info dev my group
d.service 隔离
同样注册 service 时可以指定 namespace 隔离注册到哪一个命名空间。application.yml 如下:
server:port: ${port:9001}spring:application:name: payment-servicecloud:nacos:discovery:server-addr: 192.168.146.128:8848 # Nacos注册中心地址namespace: f546a969-b313-46a4-b0e1-a1fc9ab716d3
5.配置拆分
a.配置拆分策略
项目中会有很多的微服务,必然会存在很多具体配置,和重复配置,可以采用如下方案管理配置

根据上面分析在 nacos 中配置

配置在 public 中
b.DataID 配置
payment-service-dev.yaml

common.yaml

c.配置文件 bootstrap.yml
spring:application:name: payment-serviceprofiles:active: devmain:allow-bean-definition-overriding: true #允许覆盖bean定义cloud:nacos:discovery:server-addr: 192.168.146.128:8848config:prefix: payment-service-devserver-addr: 192.168.146.128:8848file-extension: yamlnamespace: f546a969-b313-46a4-b0e1-a1fc9ab716d3group: MY_GROUPextension-configs[0]:data-id: common.ymlrefresh: true #自动刷新
- 注:
extension-configs配置属性和shared-configs配置属性功能一致,都是读取配置文件,这里我们把重复配置放到 common.yaml 中,这样在不同的工程中就可以重复使用[n]的值越大,优先级越高。 - 注:
spring.application.name和spring.profiles.active配置必须放到bootstrap.yml中,否则影响配置自动刷新功能。
按照上面方案,整合拆分订单微服务的配置文件

order微服务bootstrap.yml
spring:application:name: order-serviceprofiles:active: devcloud:nacos:discovery:server-addr: 192.168.146.128:8848config:prefix: order-service-devserver-addr: 192.168.146.128:8848file-extension: yamlnamespace: f546a969-b313-46a4-b0e1-a1fc9ab716d3group: MY_GROUPextension-configs[0]:data-id: common.ymlrefresh: true #自动刷新
注意:这里两个工程使用重用的配置文件common.yaml
相关文章:
SpringCloud核心组件(四)
文章目录 NacosNacos 配置中心1.起源2.基本概念ProfileData IDGroup 3.基础配置a. bootstrap.ymlb. application.ymlc. nacos 中的配置 DataIDd.测试读取配置中心配置内容 4.配置隔离a.命名空间b.DataIDc.bootstrap.ymld.service 隔离 5.配置拆分a.配置拆分策略b.DataID 配置c.…...
如何把本地docker 镜像下载用到centos系统中呢?
如果需要将镜像下载到本地或在 CentOS 系统上使用该镜像,你可以按照以下步骤操作: 1. 拉取镜像 如果想将镜像从 Docker Hub 或其他镜像仓库下载到本地,可以使用 docker pull 命令。 如果使用的是本地构建的镜像(如 isc:v1.0.0&…...
Godot的开发框架应当是什么样子的?
目录 前言 全局协程还是实例协程? 存档! 全局管理类? UI框架? Godot中的异步(多线程)加载 Godot中的ScriptableObject 游戏流程思考 结语 前言 这是一篇杂谈,主要内容是对我…...
GitHub新手入门 - 从创建仓库到协作管理
GitHub新手入门 - 从创建仓库到协作管理 GitHub 是开发者的社交平台,同时也是代码托管的强大工具。无论是个人项目、开源协作,还是团队开发,GitHub 都能让你轻松管理代码、版本控制和团队协作。今天,我们将从基础开始,…...
作业25 深度搜索3
作业: #include <iostream> using namespace std; bool b[100][100]{0}; char map[100][100]{0}; int dx[4]{0,1,0,-1}; int dy[4]{1,0,-1,0}; int n,m; int sx,sy,ex,ey; int mink2147483647; void dfs(int,int,int); int main(){cin>>n>>m;for(…...
ubuntu20.04 colmap 安装2024.11最新
很多教程都很落后了,需要下载压缩包解压编译的很麻烦 现在就只需要apt install就可以了 apt更新 sudo apt update && sudo apt-get upgrade安装依赖 #安装依赖 sudo apt-get install git cmake ninja-build build-essential libboost-program-options-de…...
WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇
WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule [WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇](本文) WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇 WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前…...
python os.path.basename(获取路径中的文件名部分) 详解
os.path.basename 是 Python 的 os 模块中的一个函数,用于获取路径中的文件名部分。它会去掉路径中的目录部分,只返回最后的文件名或目录名。 以下是 os.path.basename 的详细解释和使用示例: 语法 os.path.basename(path) 参数 path&…...
《FreeRTOS任务基础知识以及任务创建相关函数》
目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务(Task)介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…...
036集——查询CAD图元属性字段信息:窗体显示(CAD—C#二次开发入门)
提取CAD图元所有属性字段,通过窗体显示,效果如下:(curve改为entity) 代码如下: public void 属性查询() {List<Curve> ents Z.db.SelectEntities<Curve>();if (ents is null ||ents.Cou…...
Swift从0开始学习 函数和闭包 day2
一、函数 1.1函数定义 使用 func 来声明一个函数,使用名字和参数来调用函数。使用 -> 来指定函数返回值的类型。 示例:拼接字符串 //有参数和返回值的函数 func append1(name : String, description : String) -> String {return "\(name)…...
内网、公网(外网)划分
内网、公网(外网)划分 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其…...
【linux】centos7 换阿里云源
相关文章 【linux】CentOS 的软件源(Repository)学习-CSDN博客 查看yum配置文件 yum的配置文件通常位于/etc/yum.repos.d/目录下。你可以使用以下命令查看这些文件: ls /etc/yum.repos.d/ # 或者 ll /etc/yum.repos.d/备份当前的yum配置文…...
用OMS进行 OceanBase 租户间数据迁移的测评
基本概念 OceanBase迁移服务(,简称OMS),可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互,支持数据的在线迁移,以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台ÿ…...
【因果分析方法】MATLAB计算Liang-Kleeman信息流
【因果分析方法】MATLAB计算Liang-Kleeman信息流 1 Liang-Kleeman信息流2 MATLAB代码2.1 函数代码2.2 案例参考Liang-Kleeman 信息流(Liang-Kleeman Information Flow)是由 Liang 和 Kleeman 提出的基于信息论的因果分析方法。该方法用于量化变量之间的因果关系,通过计算信息…...
【Java基础知识系列】之Java类的初始化顺序
前言 类的初始化顺序 简单场景 代码示例 public class Person {private String name initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVa…...
Swift 宏(Macro)入门趣谈(二)
概述 苹果在去年 WWDC 23 中就为 Swift 语言新增了“其利断金”的重要小伙伴 Swift 宏(Swift Macro)。为此,苹果特地用 2 段视频(入门和进阶)颇为隆重的介绍了它。 那么到底 Swift 宏是什么?有什么用&…...
vue elementui el-dropdown-item设置@click无效的解决方案
如图,直接在el-dropdown-item上面设置click,相应的method并没有被触发,查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…...
如何用re从第1排第2个位置中找到两个数字返回(0,1)
以下是使用 Python 的re模块从第1班第2个位置这样的字符串中提取出数字并返回类似(0, 1)这种形式的示例代码,假设数字都是一位数的情况(如果是多位数可以按照后续介绍稍作调整): import redef extract_numbers(text):numbers re.…...
vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据
<keep-alive> 是 Vue.js 提供的一个内置组件,用于缓存动态组件,避免频繁的销毁和重建。这在某些场景下可以显著提升性能,特别是在组件频繁切换的情况下。以下是对 keep-alive 的详细讲解,包括它的定义、使用场景、原理分析、…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
Pandas 可视化集成:数据科学家的高效绘图指南
为什么选择 Pandas 进行数据可视化? 在数据科学和分析领域,可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具,如 Matplotlib、Seaborn、Plotly 等,但 Pandas 内置的可视化功能因其与数据结…...
