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

Nacos配置中心服务端源码解析

文章目录

  • 概述
  • 一、配置持久化到数据库
  • 二、发布事件
    • 2.1、事件发布者端
      • 2.1.1、DefaultPublisher#publish
      • 2.1.2、DefaultPublisher#run
      • 2.1.3、DefaultPublisher#receiveEvent
    • 2.2、事件订阅者端
      • 2.2.1、Subscriber#onEvent
      • 2.2.2、ConfigCacheService#dump
  • 总结:Nacos 配置中心服务端事件处理机制详解
    • 服务端事件发布流程
    • 服务端事件消费流程:
    • 事件发布与订阅关系表
    • 设计理念回顾


概述

  Nacos除了可以实现服务的注册与发现,还具有统一进行配置管理的作用,只需要额外引入依赖:

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

  可以将项目中的配置文件,转移到配置中心:
在这里插入图片描述
  同时需要在项目的resource目录下,加入bootstrap.ymlbootstrap.properties文件,目的是为了在Spring Boot启动的过程中先加载注册中心地址等基础配置项:

spring:application:name: spring-cloud-nacos-config-demo  #微服务名称#  profiles:
#    active: dev #加载开发环境的配置文件    mall-user-config-demo-dev.ymlcloud:nacos:config:  #配置nacos配置中心地址server-addr: 192.168.101.1:8848username: nacospassword: nacosfile-extension: yml   # 指定配置文件的扩展名为yml#namespace:# 自定义 Data Id 的配置shared-configs:  #不同工程的通用配置 支持共享的 DataId- data-id: common.ymlgroup: DEFAULT_GROUPrefresh: true
#          - data-id: openfeign.yml
#            group: GLOBALE_GROUP
#            refresh: true   #支持动态刷新
#
#        extension-configs:  # 支持一个应用多个 DataId 的配置
#          - data-id: actuator.yml
#          - data-id: common.yml
#            group: REFRESH_GROUP
#            refresh: true   #支持动态刷新

  在配置中心的页面上,新增或修改配置,实际调用的是/nacos/v1/cs/configs
在这里插入图片描述
  对应的是Nacos 服务端 源码中的ConfigControllerpublishConfig方法,在该方法中,主要完成了两件事:

  1. 将配置持久化到数据库。
  2. 发布ConfigDataChangeEvent事件,让客户端能感知配置更新。

在这里插入图片描述

一、配置持久化到数据库

  将配置持久化到数据库,实际调用的是ExternalStoragePersistServiceImpl#insertOrUpdate方法,整体的逻辑是,先执行新增 操作,如果抛出了DataIntegrityViolationException(数据完整性违规)异常,则会改为执行 更新 操作。

DataIntegrityViolationException 是 Spring 框架中定义的异常。这个异常表示违反了数据库的完整性约束。例如唯一性约束、非空约束、外键约束等。

在这里插入图片描述
  使用编程式事务执行数据库的新增或修改操作:
在这里插入图片描述
  底层使用的原生JDBC:
在这里插入图片描述

二、发布事件

  在将页面上的数据保存到数据库中后,就会发布一个ConfigDataChangeEvent事件。
在这里插入图片描述
  调用的是NotifyCentepublishEventNotifyCenter 是 Nacos 内置的异步事件总线,用于模块间解耦地传递和响应事件,是支撑配置推送、服务变更通知的关键机制,内部主要实现了:

  • 事件注册:订阅你感兴趣的事件类型
  • 事件发布:将事件投递出去
  • 事件处理:触发订阅者的回调处理逻辑

2.1、事件发布者端

  在NotifyCentepublishEvent方法中,主要完成了两件事:

  1. 根据eventType解析出topic,再根据topic从publisherMap属性中找到对应的发布器。
  2. 利用发布器将事件放入队列中。

List item
  选择DefaultPublisher的实现:
在这里插入图片描述


  DefaultPublisher继承了Thread,该类的对象就是一个可以运行的线程。同时实现了EventPublisher接口:
在这里插入图片描述
  EventPublisher作为Nacos事件总线发布器的顶级接口,制定了一套初始化、添加订阅者、移除订阅者、发布事件的规范。在这里插入图片描述
在这里插入图片描述


2.1.1、DefaultPublisher#publish

  在DefaultPublisherpublish方法中:

  1. 尝试将当前事件存放到阻塞队列中。offer方法,在队列中元素已满的情况下,不会抛出异常,而是会返回false。
  2. 当队列中元素已满,则让消费者去处理当前事件。

在这里插入图片描述

2.1.2、DefaultPublisher#run

  因为DefaultPublisher继承了Thread,所以在调用DefaultPublisherstart方法时,实际会执行run方法中的逻辑,在run方法中,完成了:

  1. 从队列中获取事件 (如果获取不到事件,则会在这一行陷入阻塞,不会导致cpu空转。和Nacos服务端处理客户端注册信息的设计是同样的道理)
  2. 通知消费者处理事件。

在这里插入图片描述

2.1.3、DefaultPublisher#receiveEvent

  无论是run方法,还是publish方法,最终都指向了receiveEvent,在该方法中,首先会去遍历所有的订阅者,然后调用notifySubscriber方法让每一个订阅者去处理事件。
在这里插入图片描述
  最终调用进notifySubscriber方法。会回调订阅者对象的onEvent方法去进行处理。如果订阅者配置了线程池,则还会使用线程池去处理(默认为null,没有配置)。
在这里插入图片描述


  run方法和publish方法,最终都调用了receiveEvent,两者调用的区别在于触发时机不同:

  • run方法触发receiveEvent的时机,是在DefaultPublisherstart方法被调用时:

在这里插入图片描述
  start方法又是init方法调用的。init方法的调用时机,是在NotifyCenter的静态代码块中的。伴随着NotifyCenter的加载而加载,换言之是在Nacos服务端的启动过程中,就已经调用。

  • publish方法则是在服务端接收到页面新增/修改配置的请求后,才会触发的。

  所以run方法是先于 publish方法触发的。


2.2、事件订阅者端

2.2.1、Subscriber#onEvent

  onEvent方法是在AsyncNotifyService中的逻辑,在AsyncNotifyService的构造中,首先会注册一个ConfigDataChangeEvent类型的事件,并且注册一个订阅者
在这里插入图片描述
  在2.3的notifySubscriber方法中,会回调onEvent方法,执行其中的逻辑:
在这里插入图片描述
  Nacos 2.x版本中,进入的是下图的分支:
在这里插入图片描述
  在AsyncRpcTaskrun方法中,如果是当前节点,就会直接存储一份配置
在这里插入图片描述
  实际上也是将其加入了TaskManager的队列中,异步处理:
在这里插入图片描述

2.2.2、ConfigCacheService#dump

  在ConfigCacheServicedump方法中,会将配置信息写入磁盘,并且配置信息发生变更时,更新文件的md5值:
在这里插入图片描述
  还会发布一个LocalDataChangeEvent事件。注意,在ConfigController中发布的,是ConfigDataChangeEvent事件。同样是利用NotifyCenter去发布。
在这里插入图片描述
  这个事件是被RpcConfigChangeNotifier订阅的。
在这里插入图片描述
在这里插入图片描述
  在configDataChanged中,会将配置信息推送到客户端
在这里插入图片描述
  并且支持重试机制:
在这里插入图片描述


总结:Nacos 配置中心服务端事件处理机制详解

  当 Nacos 作为配置中心使用时,页面端的新增或修改操作最终会通过 Controller 层发送请求到服务端。服务端接收到请求后,主要完成以下两项工作:

  1. 将配置信息持久化到数据库;
  2. 发布ConfigDataChangeEvent事件,驱动后续变更通知流程。

  其中,数据库写入过程采用编程式事务而非注解式事务,主要考虑到业务逻辑中可能存在较为复杂的数据库操作,编程式事务在控制粒度与异常处理方面更为灵活。
  事件发布机制则基于 Nacos 自研的异步事件总线实现,整体设计思路与 Nacos 服务端处理客户端注册信息的机制保持一致。

服务端事件发布流程

  服务端事件的发布大致可划分为两个阶段:

  1. 初始化阶段:服务端在启动过程中,会启动一个后台线程,进入死循环监听事件。该线程会尝试从一个阻塞队列中拉取事件:
    • 如果队列为空,线程将阻塞等待,不会造成 CPU 空转;
    • 一旦有事件被投递到队列中,线程会立即唤醒并执行对应的事件处理逻辑。这一机制有效地保证了资源的高效利用,也符合高并发下的异步处理模型设计。
  2. 运行阶段:在服务端启动完成后,当前端发起新增或修改配置的请求时,事件发布器会将ConfigDataChangeEvent投递至上述阻塞队列,并由初始化阶段的线程消费。该线程在获取到事件后,会根据配置类型及作用域通知对应的订阅者执行后续处理逻辑。

服务端事件消费流程:

  事件消费逻辑主要在订阅者侧完成,通常包括以下两步操作:

  1. 数据落盘:订阅者会将变更后的配置信息写入本地磁盘,同时更新其对应的 MD5 值,用于变更对比及客户端变更判断。
  2. 随后,订阅者会发布LocalDataChangeEvent事件,该事件的监听器会通过 RPC 向客户端发送变更通知,提示配置已发生变更。此通知机制内置了失败重试机制,确保高可用性

事件发布与订阅关系表

事件类型发布器监听器 / 订阅者功能描述
ConfigDataChangeEvent配置 Controller 层逻辑ConfigChangePublisher用于标记某条配置数据已变更,驱动本地磁盘写入与事件级联
LocalDataChangeEventConfigChangePublisherClientRpcNotifySubscriber通过 RPC 通知客户端配置已变更,支持失败重试,确保通知可靠性

设计理念回顾

  Nacos 配置中心的事件驱动模型体现了以下设计理念:

  • 异步解耦:通过阻塞队列事件总线,服务端变更操作与客户端通知完全解耦,提升系统吞吐能力;
  • 资源高效利用:利用阻塞机制避免线程空转,实现高效的资源调度;
  • 可靠传递机制:客户端通知具备重试机制,确保在网络抖动或客户端异常的情况下,变更信息能最终送达;
  • 一致性保障:通过 MD5 校验与本地磁盘备份,保障服务端与客户端配置信息的一致性。

相关文章:

Nacos配置中心服务端源码解析

文章目录 概述一、配置持久化到数据库二、发布事件2.1、事件发布者端2.1.1、DefaultPublisher#publish2.1.2、DefaultPublisher#run2.1.3、DefaultPublisher#receiveEvent 2.2、事件订阅者端2.2.1、Subscriber#onEvent2.2.2、ConfigCacheService#dump 总结&#xff1a;Nacos 配…...

SAP系统工艺路线的分配物料出现旧版包材

问题:工艺路线的物料错了 这是3月份技术部发现的问题,10000209这个成品有两个版本的BOM, 在创建新版的工艺路线里,发现分配的物料仍然是旧版的物料. 原因排查: 1 BOM中物料错误? 2 选错了生产版本,选了版本1? 3 生产版本设置中的可选BOM错误? 解决&#xff1a;把可选的BOM…...

JVM虚拟机--JVM的组成

(一)JVM的组成 一、JVM介绍 &#xff08;1&#xff09;JVM的作用 我们知道&#xff0c;Java代码要想在计算机中正常运行&#xff0c;就需要经过编译为class二进制字节码文件&#xff0c;而JVM就提供了class二进制字节码的运行环境。 一次编写&#xff0c;到处运行 因为JVM是…...

科学研究:怎么做

科研&#xff08;科学研究&#xff09;​​ 是指通过系统化的方法&#xff0c;探索自然、社会或人文领域的未知问题&#xff0c;以发现新知识、验证理论或解决实际问题的活动。它的核心是​​基于证据的探索与创新​​&#xff0c;旨在推动人类认知和技术的进步。 科研的核心要…...

PyTorch数据操作基础教程:从张量创建到高级运算

本文通过示例代码全面讲解PyTorch中张量的基本操作&#xff0c;包含创建、运算、广播机制、索引切片等核心功能&#xff0c;并提供完整的代码和输出结果。 1. 张量创建与基本属性 import torch# 创建连续数值张量 x torch.arange(12, dtypetorch.float32) print("原始张…...

微服务治理与可观测性

服务注册与发现 核心功能 服务实例动态变化&#xff1a;实例可能因扩缩容、故障或迁移导致IP变动。服务依赖解耦&#xff1a;调用方无需硬编码服务地址&#xff0c;降低耦合度。负载均衡&#xff1a;自动选择健康实例&#xff0c;提升系统可用性。 核心组件 服务注册中心&am…...

如何对docker镜像存在的gosu安全漏洞进行修复——筑梦之路

这里以mysql的官方镜像为例进行说明&#xff0c;主要流程为&#xff1a; 1. 分析镜像存在的安全漏洞具体是什么 2. 根据分析结果有针对性地进行修复处理 3. 基于当前镜像进行修复安全漏洞并复核验证 # 镜像地址mysql:8.0.42 安全漏洞现状分析 dockerhub网站上获取该镜像的…...

OpenCV 04.19 练习

1. 创建一个 PyQt 应用程序&#xff0c;该应用程序能够&#xff1a; 1.使用 OpenCV 加载一张图像。 2.在 PyQt 的窗口中显示这张图像。 3.提供四个按钮&#xff08;QPushButton&#xff09;&#xff1a; - 一个用于将图像转换为灰度图 - 一个用于将图像恢复为原始彩色图 - 一个…...

uv:重新定义Python开发效率的下一代工具链

在Python生态系统中,包管理和项目工具链的复杂性一直是开发者面临的一大挑战。从依赖管理、虚拟环境创建到多版本Python切换,传统的工具链(如pip、virtualenv、poetry等)虽然功能强大,但操作繁琐、性能不足的问题长期存在。而uv的出现,以颠覆性的速度和功能集成,为Pytho…...

【Easylive】​​Gateway模块 bootstrap.yml 解析

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 Gateway模块 bootstrap.yml 常规解析 该配置文件定义了 Spring Cloud Gateway 的核心配置&#xff0c;包括 环境配置、服务注册、动态路由规则 等。以下是逐项解析&#xff1a; 1. 基础配…...

Warcraft Logs [Classic] [WCL] Usage Wizard <HTOC>

‌HTOC&#xff08;十字军的试炼&#xff09;副本中各个BOSS的ID如下‌&#xff1a; ‌629 - 诺森德野兽‌ ‌633 - 加拉克苏斯大王‌ ‌637 - 派系冠军‌ ‌641 - 瓦格里双子‌ ‌645 - 阿努巴拉克‌ encounterID!637 and encounterID!641 encounterID NOT IN (637,641) 伤害 …...

多模态大语言模型arxiv论文略读(二十八)

MM-SAP: A Comprehensive Benchmark for Assessing Self-Awareness of Multimodal Large Language Models in Perception ➡️ 论文标题&#xff1a;MM-SAP: A Comprehensive Benchmark for Assessing Self-Awareness of Multimodal Large Language Models in Perception ➡️…...

JavaScript数据类型简介

在JavaScript中&#xff0c;理解不同的数据类型是掌握这门语言的基础。数据类型决定了变量可以存储什么样的值以及这些值能够执行的操作。JavaScript支持多种数据类型&#xff0c;每种都有其特定的用途和特点。本文将详细介绍JavaScript中的主要数据类型&#xff0c;并提供一些…...

CasualLanguage Model和Seq2Seq模型的区别

**问题1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的区别是什么&#xff1f; 因果语言模型(Causal Language Model)&#xff1a; 预测给定文本序列中的下一个字符&#xff0c;一般用于文本生成、补全句子等&#xff0c;模型…...

在Qt和OSG中动态改变部分3D模型数据

要在Qt和OSG环境中导入3D模型并只对部分数据进行动态改变,你可以采用以下方法: 基本实现步骤 加载模型:使用OSG的读取器加载3D模型文件 访问特定部分:识别并获取模型中需要修改的部分 动态修改:在Qt界面或逻辑中设置修改这些部分的机制 更新显示:确保修改后的模型能够实…...

命令update-alternatives

❯ which pip /home/ying/anaconda3/bin/pipying192 ~ [2]> which pip /usr/bin/pip使用update-alternatives对他们进行管理和切换 快捷方式 和 实际路径不可以相同 所以我这边选择了/usr/local/bin目录作为介质存储快捷方式&#xff0c;另外该快捷方式会自己创建我们只需选…...

10.thinkphp的响应

响应输出 响应操作 1. 响应输出&#xff0c;有好几种&#xff1a;包括return、json()和view()等等&#xff1b; 2. 默认输出方式是以html格式输出&#xff0c;如果你发起json请求&#xff0c;则输出json&#xff1b; 3. 而背后是response对象&#xff0c;可以用response()输…...

【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现

在技术派社区中&#xff0c;为了保证文章的质量和社区的良性发展&#xff0c;所有发布的文章都需要经过审核。然而&#xff0c;并非所有作者的文章都需要审核&#xff0c;我们通过白名单机制来优化这一流程。本文将详细介绍技术派中白名单的实现方式&#xff0c;以及如何利用Re…...

Keil A51汇编伪指令

以下是 Keil A51 汇编器支持的常用伪指令 及其详细说明&#xff0c;涵盖代码结构、数据定义、条件编译等关键功能&#xff0c;结合实际应用场景进行分类和示例&#xff1a; 一、程序结构与地址控制 伪指令功能语法示例说明ORG设置代码/数据起始地址ORG 0000H后续代码从指定地址…...

Windows上安装FFmpeg的详细指南

1.下载FFmpeg 访问FFmpeg官方下载页面&#xff1a;https://ffmpeg.org/download.html 点击"Windows builds from gyan.dev"或"Windows builds by BtbN" gyan.dev版本&#xff1a;https://www.gyan.dev/ffmpeg/builds/ BtbN版本&#xff1a;https://githu…...

jmeter利用csv进行参数化和自动断言

1.测试数据 csv测试数据如下&#xff08;以注册接口为例&#xff09; 2.jemer参数化csv设置 打开 jmeter&#xff0c;添加好线程组、HTTP信息头管理器、CSV 数据文件设置、注册请求、响应断言、查看结果树 1&#xff09; CSV 数据文件设置 若 CSV 中数据包含中文&#xff0c;…...

《Android 应用开发基础教程》——第二章:Activity 与生命周期详解

目录 第二章&#xff1a;Activity 与生命周期详解 2.1 什么是 Activity&#xff1f; 作用&#xff1a; 2.2 创建一个 Activity 示例代码 Manifest 注册&#xff1a; 2.3 Activity 生命周期&#xff08;Life Cycle&#xff09; 生命周期图解&#xff1a; 2.4 生命周期代…...

[Java]反射、String类补充

目录 1、反射定义 2、用途(了解) 3、反射相关的类 4、Class类(反射机制的起源) 4.1、相关方法 5、反射示例 5.1、获取Class对象 5.2、反射的使用 6、反射优点和缺点 7、String类补充 7.1、创建对象的思考 8、字符串常量池 9、再谈String对象创建 10、intern方法 …...

word表格批量操作——宏

word中所有表格代码 这个是表格的模板代码 Sub 表格通用代码() For i ActiveDocument.Tables.Count To 1 Step -1ActiveDocument.Tables (i) Next End Sub1、根据内容自动调整表格 Sub 表格适用内容() For i ActiveDocument.Tables.Count To 1 Step -1ActiveDocument.Tabl…...

eSTK.me

eSTK.me 调用 USIM 卡的 Applet 实现在 iOS 内自助切换 Profile。写卡仍然需要借助硬件读卡器或者兼容 eSIM 的 Android 手机。支持国行 iPhone。 eSTK.me&#xff08;固件 v2.x 及以后的版本&#xff09;基于 ETSI 的 Bearer Independent Protocol (BIP) 协议&#xff0c;使…...

四级英语备考指南

一、引言 大学英语四级考试是对大学生英语综合能力的一次重要检验。无论是为了学业要求&#xff0c;还是提升自身竞争力&#xff0c;顺利通过四级考试都有着重要意义。本文将为大家详细介绍四级英语的备考策略&#xff0c;帮助大家高效备考&#xff0c;取得理想成绩。 二、了…...

Java Web 之 互联网协议 100问

HTTP是什么&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最广泛的协议之一&#xff0c;用于在客户端&#xff08;如浏览器&#xff09;和服务器之间传输数据。它是 Web 通信的基础&#xff0c;支持浏览器访…...

【单倍型理解及计算系列之二】单倍型基本概念以及其与遗传定位中Bin的定义区别

问题&#xff1a;如何理解单倍型&#xff0c;与遗传定位中Bin的定义区别&#xff1a; 简而言之&#xff1a;就是单倍型是基于LD&#xff0c;通常为连锁不平衡&#xff08;LD&#xff09;较高的区域形成。但bin是人为划分的&#xff0c;如以固定SNP数量/固定长度设置&#xff0…...

ArcPy Mapping 模块基础

在地理信息系统&#xff08;GIS&#xff09;的应用中&#xff0c;地图制作是一个非常重要的环节。无论是生成用于展示的静态地图&#xff0c;还是动态更新的地图服务&#xff0c;都需要高效且灵活的工具来实现。ArcPy 提供了强大的mapping模块&#xff0c;可以帮助用户自动化地…...

AcWing 11:背包问题求方案数 ← 0-1背包

【题目来源】 https://www.acwing.com/problem/content/11/ 【题目描述】 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总…...

Redis增删改查

### 进入redis控制台 redis-cli --raw #加上raw,防止中文乱码### 增 127.0.0.1:6379> LPUSH list0 "hello" #增加一个list 1 127.0.0.1:6379> LRANGE list0 0 -1 #查看list hello### 删 127.0.0.1:6379> DEL list0 #删除list 1 127.0.0.1:6379> LRANG…...

多道程序和多任务操作系统区别

多道程序 vs. 多道任务&#xff1a;对比分析 ✅ 共同点 方面共同特征核心机制都依赖于进程/任务切换执行需求实现多个程序或任务"并发"执行系统支持都需要操作系统的支持&#xff08;如调度算法、内存管理&#xff09;本质目标提高资源利用率&#xff08;CPU不空转…...

【MySQL】MySQL建立索引不知道注意什么?

基本原则&#xff1a; 1.选择性原则&#xff1a; 选择高选择性的列建立索引(该列有大量不同的值) 2.适度原则&#xff1a;不是越多越好&#xff0c;每个索引都会增加写入开销 列选择注意事项&#xff1a; 1.常用查询条件列&#xff1a;WHERE字句中频繁使用的列 2.连接操作列…...

区块链木材业务服务平台:商贸物流新变革

区块链木材业务服务平台&#xff1a;商贸物流新变革 在全球商贸物流行业不断发展的当下&#xff0c;木材贸易作为其中重要的一环&#xff0c;面临着诸多挑战。区块链木材业务服务平台的出现&#xff0c;为木材商贸物流领域带来了全新的解决方案&#xff0c;正逐步引领行业走向…...

【AI提示词】经济学家

提示说明 经济学家致力于提供深入的经济分析和预测&#xff0c;帮助用户理解经济趋势、政策影响以及市场动态。他们通过专业的经济模型和数据分析&#xff0c;为用户在投资、决策等方面提供指导。 提示词 # 角色 经济学家## 注意 1. 经济学家专家需要具备深入分析经济现象的…...

C++用于保留浮点数的两位小数,使用宏定义方法(可兼容低版本Visual Studio)

文章目录 一、 描述二、 样例二、 结果输出 一、 描述 这个宏定义&#xff08;可放入.h头文件里&#xff09;使用基本的数学运算&#xff0c;几乎兼容所有版本的VS&#xff0c;以下可对正数做四舍五入&#xff1a; #define ROUND_TO_TWO(x) ( (floor((x) * 100 0.5) / 100) …...

kimi+deepseek制作PPT

文章目录 KIMI简介一、基本信息二、核心特点三、服务理念 Deepseek简介PPT关键词提示 KIMI简介 KIMI官网&#xff1a;Kimi - 会推理解析&#xff0c;能深度思考的AI助手 一、基本信息 名称 &#xff1a;KIMI开发团队 &#xff1a;月之暗面科技有限公司上线时间 &#xff1a;…...

Linux-进度条小程序

1. 回车和换行的差异 在输出文本时&#xff0c;回车和换行符的作用是非常不同的。了解它们的行为有助于我们控制输出的方式。 回车&#xff08;\r&#xff09;&#xff1a;回车符将光标移到当前行的开头&#xff0c;但并不会自动换行。它的作用是覆盖当前行的内容。 换行&…...

Day2—3:前端项目uniapp壁纸实战

接下来我们做一个专题精选 <view class"theme"><common-title><template #name>专题精选</template><template #custom><navigator url"" class"more">More</navigator></template></common…...

什么是超类实体和派生属性

在数据库设计&#xff08;尤其是实体-关系模型&#xff08;ER模型&#xff09;&#xff09;和面向对象建模中&#xff0c;超类实体和派生属性是两个重要的概念&#xff0c;分别用于描述实体间的继承关系和属性的动态计算特性。以下是它们的详细解释和对比&#xff1a; 一、超类…...

性能比拼: Elixir vs Go(第二轮)

本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance Benchmark (Round 2) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 这是第二轮关于 Elixir 和 Go 的对比测试。我收到了一份来自 Elixir 创作者的 Pull Request &#xff0c;并且我认为…...

微信、抖音、小红书emoji符号大全

1、Emoji 日常符号 &#x1f463;&#x1f440;&#x1f441;️&#x1f444;&#x1f48b;&#x1f442;&#x1f9bb;&#x1f443;&#x1f445;&#x1f9e0;&#x1fac0;&#x1fac1;&#x1f9b7;&#x1f9b4;&#x1f4aa;&#x1f9be;&#x1f9bf;&#x1f9b5;&a…...

【大模型】 LangChain框架 -LangChain实现问答系统

LangChain 介绍与使用方法 1. 什么是 LangChain&#xff1f;2. LangChain 的主要功能3. 如何使用 LangChain&#xff1f;3.1 环境准备3.2 基本使用示例3.2.1 简单的问答系统3.2.2 结合外部工具 3.3 高级用法 4. 常见问题及解决方法4.1 安装问题4.2 运行问题4.3 性能问题 5. 实战…...

k8s安装kubeadm

使用kubeadm安装部署k8s集群 目前生产部署Kubernetes 集群主要有两种方式&#xff1a; kubeadm Kubeadm 是一个K8s 部署工具&#xff0c;提供kubeadm init 和kubeadm join&#xff0c;用于快速部署Kubernetes 集群。 官方地址&#xff1a;https://kubernetes.io/docs/refer…...

五、小白如何用Pygame制作一款跑酷类游戏(主角跳跃和滑行动作的实现)

五、小白如何用Pygame制作一款跑酷类游戏&#xff08;主角跳跃和滑行动作的实现&#xff09; 文章目录 五、小白如何用Pygame制作一款跑酷类游戏&#xff08;主角跳跃和滑行动作的实现&#xff09;前言一、添加主角的跳跃和滑行图片素材二、代码部分1.在走路状态时按下按键发生…...

LLM MCP模型上下文协议快速入门(for Java)

什么是MCP Model Control Protocol&#xff08;MCP&#xff09;是由AI研究机构Anthropic在2023年第二季度首次提出的新型协议规范&#xff0c;旨在解决大语言模型LLM应用中的上下文管理难题。作为LLM交互领域的创新标准&#xff0c;MCP协议在发布后短短一年内已进行了多次更新…...

CTF--秋名山车神

一、原网页&#xff1a; 二、步骤&#xff1a; 1.尝试用计算器计算&#xff1a; 计算器溢出&#xff0c;无法正常计算 2.使用python计算&#xff1a; 得出计算结果为&#xff1a;1864710043732437134701060769 3.多次刷新页面&#xff1a; 发现变量为value&#xff0c;要用pos…...

Windows桌面图标变白的解决方案

一、问题原因 桌面图标变白通常是由于系统图标缓存文件&#xff08;IconCache.db&#xff09;损坏或系统图表示现异常导致。图标缓存是Windows用于存储应用程序和文件夹图标图像的临时文件&#xff0c;当该文件损坏或系统未正确更新缓存时&#xff0c;图标会因无法加载原始图像…...

Linux学习——信号量

1.头文件-semaphore.h 2.信号量类型 sem_t sem; 加强版的互斥锁&#xff0c;是并行的 3.主要函数 初始化信号量 sem_init(sem_t *sem,int pshared,unsigned int value); 第一个参数 信号量类型 第二个参数 0-线程同步 1-进程同步 …...

蓝桥杯 蜗牛 动态规划

16.蜗牛 - 蓝桥云课https://www.lanqiao.cn/problems/4985/learning/?page1&first_category_id1&second_category_id3&sortdifficulty&asc1&tags%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E9%80%92%E6%8E%A8,01%E8%83%8C%E5%8C%85,%E5%8C%BA%E9%97%B4DP,%E6…...