当前位置: 首页 > news >正文

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

20241115182320

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
20241115183005

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

20241115183047

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
20241115183523

b.DataID

在不同命名空间下创建如下 DataID(克隆即可)
20241115183725
注意稍微更改各自配置信息以作区别

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.配置拆分策略

项目中会有很多的微服务,必然会存在很多具体配置,和重复配置,可以采用如下方案管理配置
20241115184716

根据上面分析在 nacos 中配置
20241115184958
配置在 public 中

b.DataID 配置

payment-service-dev.yaml
20241115185204
common.yaml
20241115185247

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.namespring.profiles.active配置必须放到bootstrap.yml中,否则影响配置自动刷新功能。

按照上面方案,整合拆分订单微服务的配置文件
20241115185813

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 系统上使用该镜像&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 拉取镜像 如果想将镜像从 Docker Hub 或其他镜像仓库下载到本地&#xff0c;可以使用 docker pull 命令。 如果使用的是本地构建的镜像&#xff08;如 isc:v1.0.0&…...

Godot的开发框架应当是什么样子的?

目录 前言 全局协程还是实例协程&#xff1f; 存档&#xff01; 全局管理类&#xff1f; UI框架&#xff1f; Godot中的异步&#xff08;多线程&#xff09;加载 Godot中的ScriptableObject 游戏流程思考 结语 前言 这是一篇杂谈&#xff0c;主要内容是对我…...

GitHub新手入门 - 从创建仓库到协作管理

GitHub新手入门 - 从创建仓库到协作管理 GitHub 是开发者的社交平台&#xff0c;同时也是代码托管的强大工具。无论是个人项目、开源协作&#xff0c;还是团队开发&#xff0c;GitHub 都能让你轻松管理代码、版本控制和团队协作。今天&#xff0c;我们将从基础开始&#xff0c…...

作业25 深度搜索3

作业&#xff1a; #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最新

很多教程都很落后了&#xff0c;需要下载压缩包解压编译的很麻烦 现在就只需要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 上篇]&#xff08;本文&#xff09; WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇 WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前…...

python os.path.basename(获取路径中的文件名部分) 详解

os.path.basename 是 Python 的 os 模块中的一个函数&#xff0c;用于获取路径中的文件名部分。它会去掉路径中的目录部分&#xff0c;只返回最后的文件名或目录名。 以下是 os.path.basename 的详细解释和使用示例&#xff1a; 语法 os.path.basename(path) 参数 path&…...

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务&#xff08;Task&#xff09;介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…...

036集——查询CAD图元属性字段信息:窗体显示(CAD—C#二次开发入门)

提取CAD图元所有属性字段&#xff0c;通过窗体显示&#xff0c;效果如下&#xff1a;&#xff08;curve改为entity&#xff09; 代码如下&#xff1a; public void 属性查询() {List<Curve> ents Z.db.SelectEntities<Curve>();if (ents is null ||ents.Cou…...

Swift从0开始学习 函数和闭包 day2

一、函数 1.1函数定义 使用 func 来声明一个函数&#xff0c;使用名字和参数来调用函数。使用 -> 来指定函数返回值的类型。 示例&#xff1a;拼接字符串 //有参数和返回值的函数 func append1(name : String, description : String) -> String {return "\(name)…...

内网、公网(外网)划分

内网、公网&#xff08;外网&#xff09;划分 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其…...

【linux】centos7 换阿里云源

相关文章 【linux】CentOS 的软件源&#xff08;Repository&#xff09;学习-CSDN博客 查看yum配置文件 yum的配置文件通常位于/etc/yum.repos.d/目录下。你可以使用以下命令查看这些文件&#xff1a; ls /etc/yum.repos.d/ # 或者 ll /etc/yum.repos.d/备份当前的yum配置文…...

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念 OceanBase迁移服务&#xff08;&#xff0c;简称OMS&#xff09;&#xff0c;可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互&#xff0c;支持数据的在线迁移&#xff0c;以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台&#xff…...

【因果分析方法】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 宏&#xff08;Swift Macro&#xff09;。为此&#xff0c;苹果特地用 2 段视频&#xff08;入门和进阶&#xff09;颇为隆重的介绍了它。 那么到底 Swift 宏是什么&#xff1f;有什么用&…...

vue elementui el-dropdown-item设置@click无效的解决方案

如图&#xff0c;直接在el-dropdown-item上面设置click&#xff0c;相应的method并没有被触发&#xff0c;查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…...

如何用re从第1排第2个位置中找到两个数字返回(0,1)

以下是使用 Python 的re模块从第1班第2个位置这样的字符串中提取出数字并返回类似(0, 1)这种形式的示例代码&#xff0c;假设数字都是一位数的情况&#xff08;如果是多位数可以按照后续介绍稍作调整&#xff09;&#xff1a; import redef extract_numbers(text):numbers re.…...

vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据

<keep-alive> 是 Vue.js 提供的一个内置组件&#xff0c;用于缓存动态组件&#xff0c;避免频繁的销毁和重建。这在某些场景下可以显著提升性能&#xff0c;特别是在组件频繁切换的情况下。以下是对 keep-alive 的详细讲解&#xff0c;包括它的定义、使用场景、原理分析、…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...