【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
- 1.弹性裸金属技术背景
- 1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失
- 1.2 传统 KVM 虚拟化系统导致资源争抢不可避免
- 1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈
- 2.弹性裸金属技术实现
- 2.1 VPC 和 EBS 云盘接入
- 2.2 实现大量弹性网卡(ENI)和 EBS 云盘设备接入
- 3.X-Dragon Hypervisor 基于神龙的软硬一体的虚拟化技术
- 3.1 自研虚拟 CPU 调度器 —— VOS
- 3.2 内存优化:内存分配器 VMEM 与用户态 QEMU 内存瘦身
- 3.3 虚拟化运行加速
- 3.4 极速启动
- 3.5 物理机 CPU 全供给虚拟机
1.弹性裸金属技术背景
2003 年,Xen 在 SOSP 发表 Xen and the Art of Virtualization,拉开了 x86 平台虚拟化技术的大幕。2006 年,AWS 发布 EC2(Elastic Compute Cloud
),同年发布 S3(Simple Storage Service
),拉开了公共云服务的大幕。EC2 的核心正是基于 Xen 虚拟化技术。虚拟化技术赋予了 EC2 核心产品价值 —— 弹性,同时虚拟化技术给网络虚拟化、存储虚拟化,和管控系统提供了业务部署点。
第一代虚拟化技术的特征是:Xen/KVM + 软件 network vSwitch + 软件 storage initiator + 管控等 All on Xeon。这代技术的痛点和思考,如下图所示。
1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失
众所周知,IaaS 公共云技术的核心是 Intel 至强处理器 VT 等 硬件辅助虚拟化技术(Hardware-assisted virtualization
),配合主流虚拟化系统软件(KVM / Xen / VMware ESXi 等),实现了 IaaS 弹性计算;客户则是通过 ECS(或者 AWS EC2)购买虚拟机(VM)形式的计算资源。
得益于高度成熟的虚拟化技术,VM 形式的计算资源 “几乎” 等价于客户线下的物理服务器资源,但是 “几乎” 并不是 “完全”。一个典型的案例就是 Intel 至强处理器的 VT 硬件辅助虚拟化能力会被公共云服务提供商的虚拟化系统 “消费掉”,客户无法在公共云 VM 实例中再次部署虚拟化系统,致使传统 OpenStack 和 VMware based workload 无法在公共云部署。
客户希望用一套 OpenStack / VMware 统一管理 公共云线上资源 和 专有云线下资源,同时在控制面和数据面打通线上线下资源,在兼顾专有云数据安全、法律合规的基础上,充分利用公共云计算资源的弹性能力,但是由于 Intel 至强处理器 VT 硬件辅助虚拟化能力 “被消费”,使得此种 混合云技术 很难在公共云实现。云原生安全容器创新依赖 Intel VT 硬件辅助虚拟化能力输出,这是传统虚拟化无法解决的问题。
1.2 传统 KVM 虚拟化系统导致资源争抢不可避免
以传统的 KVM 虚拟化系统为例,双路 Skylake(96 个 HT)计算资源的虚拟化典型部署情况是:有 8 个 HT 部署网络虚拟化 vSwitch 和存储虚拟化,对外售卖 88 个 HT 作为 vCPU 计算资源。我们需要注意到,对外售卖的 88HT vCPU 计算资源和 8 HT 网络 / 存储虚拟化是部署在同一组 Skylake CPU 上的,那么如下共享资源争抢是不可避免的。
- CPU DDR 带宽、LLC 等共享资源的争抢。在机头网络带宽迅速提升的当下,DDR 带宽、LLC 等资源争抢现象愈发突出。
- 半虚拟化(Para-virtualized)I/O 设备模型等资源争抢引入售卖 CPU 抖动和售卖 I/O 抖动。
- 存储和网络等 I/O 内部层级化 HQoS 难于实施。一般而言,层级化 HQoS 是解决资源争抢的有效手段,电信级网络设备一般会部署 HQoS 进行资源调度,而 HQoS 的典型部署方法需要通过芯片实现。
1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈
传统 KVM 虚拟化系统由(计算虚拟化)QEMU-KVM + (网络虚拟化)DPDK based vSwitch + (存储虚拟化)SPDK based I/O initiator 构成。
在 Intel 引入 VT 硬件虚拟化支持后,配合 KVM、Xen 等虚拟化系统软件,由 CPU 指令处理的数据面和 KVM 等虚拟化系统软件形成了控制面及异常处理路径,此种软硬件协同设计既实现了 CPU 和内存虚拟化的数据路径的最小开销,又保留了 KVM 控制路径和异常处理路径的高度灵活性。
同处于数据路径的存储虚拟化和网络虚拟化虽然通过 DPDK 和 SPDK 等技术接近了软件优化的技术极限,但是仍然无法和芯片的加速性能媲美。特别是在网络吞吐向 100GbE 演进的过程中,交换网络的带宽能力和 Intel 至强处理器的处理能力间的差距逐渐拉大,在传统 KVM 虚拟化系统下,通过 DPDK、SPDK 等纯软件进行 I/O 性能优化的瓶颈日渐凸显。
2.弹性裸金属技术实现
第一代虚拟化技术的业务痛点,催生了第二代虚拟化技术的产生,弹性裸金属产品也应运而生。那么第二代虚拟化技术具备哪些特征呢?
- 全部 I/O 设备通过 VT-d 设备直通模式进入 VM,以此减少 para-virtualization I/O 半虚拟化开销。
- 随着 VT-d 设备直通的引入,网络虚拟化和存储虚拟化需要一个新的业务部署点。
- VT-d 设备直通引入后,SR-IOV 等技术却无法达到和传统 QEMU PV 设备一样的灵活性,I/O 硬件虚拟化催生 Intel scalable IOV 的业务诉求。
- 随着存储虚拟化和网络虚拟化新的业务部署点的产生,这个业务部署点很显然需要针对计算、网络、存储、安全等 IaaS 核心业务部署定制化芯片加速。
- 同时支持传统 VM、弹性裸金属服务器、安全容器等 IaaS 最新业务诉求。
简而言之,Hypervisor 的主要组件全部下沉进入一个定制计算节点,该定制计算节点完成 I/O 设备虚拟化、网络虚拟化、存储虚拟化和管控部署,以及安全特性部署等。
而主机侧,针对公共云的需求,从计算和内存原来的 QUME + KVM 方式,经过高度定制和瘦身后,降低了主机资源占用并提升计算服务质量,演化到了裸金属架构。
第二代虚拟化技术使弹性裸金属的产品落地成为可能。阿里云在 2017 年 10 月举行的杭州云栖大会上正式发布弹性裸金属产品,同年 11 月,AWS reinvent 发布 EC 2 版本弹性裸金属产品。中美公共云服务提供商可以说在弹性裸金属的产品定义、产品适用场景和技术上殊途同归。弹性裸金属的核心产品技术逻辑:通过技术创新,使普通物理服务器具备虚拟机的弹性和使用体验。
正是有了这个逻辑,我们可以推演出技术创新的突破点:通过软硬一体化的技术手段,让普通物理服务器能够无缝接入云平台的管控系统、VPC 云网络和 EBS 云盘。
2.1 VPC 和 EBS 云盘接入
我们知道在虚拟化技术中,虚拟机是通过 Virtio 实现网络和存储 I/O 设备的;同时,我们注意到,Virtio 这个半虚拟化设备模型实际上是严格按照 “真实” PCIe 设备规范的定义而实现的 I/O 设备。也就是说,Virtio 半虚拟化设备完全可以通过芯片实现。
在通过芯片实现 Virtio 的时候,考虑到 VPC 和 EBS 云盘实现的复杂度,我们采用了新的模式:让芯片透传 PCIe TLP 包到可编程处理器,然后通过可编程处理器复用 QEMU 已有的成熟的 Virtio 后端代码。此种模式能够最大限度地保持既有的虚拟化架构,做到云平台管控系统、VPC 系统、EBS 云盘系统的 “零修改”。
2.2 实现大量弹性网卡(ENI)和 EBS 云盘设备接入
VT-x/KVM 虚拟化技术具有天然技术优势,支持大量网络和存储设备。而弹性裸金属产品的核心出发点就是要兼具虚拟机和传统物理机的优点。虚拟机对大量网络设备和存储设备的支持,必须在弹性裸金属产品中予以实现。
在多种规格的网卡和存储 PCIe I/O 设备接入时,根据 PCIe 规范有两个方法:
- 1️⃣ 通过多级 PCIe switch 扩展,实现大量 PCIe switch downstream port,然后每个 PCIe switch downstream port 挂载一个 PCIe I/O 设备;
- 2️⃣ 通过 PCIe SR-IOV 技术,支持大量 PCIe virtual function(VF)设备。
进一步对比虚拟机 I/O 设备,我们可以看到设备的热插拔、Guest OS 的零侵入是公共云 IaaS 产品的刚需。只有通过多级 PCIe switch 扩展模式,才能通过 PCIe native hotplug 技术标准,实现上述和虚拟机一致的设备热插拔和 Guest OS 零侵入。产品需求明确后,我们创新性地通过芯片 RTL 实现了全球第一个片上多级 PCIe switch 扩展,当前最多能够支持 63 个设备,以此实现大数量规格的网络 ENI 和存储 EBS 云盘PCIe I/O 设备接入;同时由于支持原生 PCIe 原生热插拔能力,保证了 Guest OS 的零侵入,以及客户在 Open API 和控制台等方面和虚拟机一致的使用体验。
3.X-Dragon Hypervisor 基于神龙的软硬一体的虚拟化技术
在阿里云神龙硬件平台下,虚拟化架构也做了相应的升级,使计算虚拟化部分的架构更加清晰简捷,让虚拟机能提供接近物理机的性能。如下图所示,神龙虚拟化架构的主要特点是:
- I/O 链路从传统的通过软件实现转变为通过硬件和直通设备实现;
- 存储虚拟化、网络虚拟化都在 MOC 卡上实现;
- 同时将管控系统、监控程序等都下沉到 MOC 卡上。
- 在提供计算服务的物理机上,只运行自己裁剪的 Linux 操作系统和轻量化的虚拟机监控器。
神龙虚拟化架构比起传统的 KVM 虚拟化的关键优化技术点简要描述如下。
3.1 自研虚拟 CPU 调度器 —— VOS
VOS
(VM-Oriented Scheduler
)是面向虚拟机的调度器,是阿里云在神龙平台上自研的调度器,减少了虚拟 CPU 调度开销,同时将其他控制面的作业调度给虚拟 CPU 带来的争抢下降一个数量级研发的更加稳定和高效的计算虚拟化产品。如下图所示,VOS 调度器实现的是非公平调度(与内核中的 CFS 调度器不同),让虚拟 CPU 线程具有更高执行优先级,保证客户购买的虚拟机的计算性能,而控制面的作业调度执行被安排在预先设定的一个较低优先级和预设时间片中投机执行,而且控制面的作业是可以被内核态抢占的。
通过 VOS 调度器,虚拟 CPU 的调度延迟低到毫秒级;通过 ping flood
来测试网络 ping
的延时抖动,抖动下降到了百万分之一左右(即 ping
一百万个报文只遇到 1 个报文延迟的比例比均值明显偏大),抖动比之前的架构下降了两个数量级。在物理机上执行的控制面的作业包括:虚拟机生命周期管理、QEMU 控制线程、写日志、监控执行、包括热升级 / 热迁移在内的运维操作,在 VOS 的管理下,正在运行的虚拟 CPU 的干扰被控制在一个非常低的水平,虚拟机的计算稳定性大幅提升。
3.2 内存优化:内存分配器 VMEM 与用户态 QEMU 内存瘦身
内存分配器 VMEM 是阿里云研发的用于虚拟机内存分配的分配器,可以大幅减少内核维护的内存页表等开销(开销从以前的 1.5 % 1.5\% 1.5% 左右下降到 0.1 % 0.1\% 0.1% 左右),支持 1GB 的大页进一步减少 EPT 开销,实现了通过 vMCE 对硬件错误的内存页进行隔离。
在内存方面,我们通过 QEMU 对其进行瘦身,将单个虚拟机的 QEMU 进程内存开销降低到 5MB 以内,通过全新设计的用户态内存分配器避免了内存碎片,同时对不常用的内存资源进行延迟分配。
通过这两种内存优化手段,神龙虚拟化的架构比传统 KVM 虚拟化节省了约 10%的内存。
3.3 虚拟化运行加速
通过硬件加速虚拟机中的 HLT 和 MWAIT 指令,使其唤醒延迟与物理机几乎一样。同时将定时器进行硬件虚拟化,在虚拟机中访问定时器不会再触发 VMEXIT,从而提升虚拟机性能。通过这些优化,进程调度性能得到了较大提高,下图的调度延迟实测数据展示的是在某次测试中,调度两百万个进程,并统计每次调度的延迟的结果。可以看到,延迟有 15 % 15\% 15% 的下降。图中的 g5.4xlarge
实例是之前的 KVM架构的 ECS 虚拟机实例规格,g6.4xlarge
是神龙硬件平台下经过优化的 ECS 虚拟机实例规格。
3.4 极速启动
为了让虚拟机加速启动,我们对神龙虚拟化架构也做了很多优化。首先是资源的快速分配,包括实现多线程的初始化、虚拟机内存页分配时的批处理化。同时对虚拟机依赖的固件进行裁剪、重构、优化,使虚拟机实现毫秒级加载。我们还对一些特殊的应用场景应用了内部称为 vmfork
的技术,让虚拟机能实现秒级的快速复制。
3.5 物理机 CPU 全供给虚拟机
在传统的 KVM 虚拟化架构下,宿主机的 CPU 资源是不可能全部供给虚拟机使用的,一般还要预留 CPU 核,用于网络虚拟化软件、存储虚拟化软件、管控系统、监控脚本等的计算资源开销。在神龙架构下,网络虚拟化和存储虚拟化都通过硬件虚拟化的方式下沉到一张 MOC 卡上,同时管控系统和绝大部分监控脚本都下沉到 MOC 卡上运行,这样物理机 CPU 资源就可以全部通过虚拟化的方式分配给虚拟机使用。经过评估,通过下沉这部分 CPU 开销到 MOC 卡上,物理机的 CPU 资源利用率能提高 10 % 10\% 10% 左右。
相关文章:

【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...

【MySQL】(2) 库的操作
SQL 关键字,大小写不敏感。 一、查询数据库 show databases; 注意加分号,才算一句结束。 二、创建数据库 {} 表示必选项,[] 表示可选项,| 表示任选其一。 示例:建议加上 if not exists 选项。 三、字符集编码和排序…...

Hyper-V -docker-vmware 三者的关系
1. Docker 正常运行,需要启动Hyper-V ,打开 hypervisorlaunchtype 2.VMware 正常时,需要关闭Hyper-V ,关闭 hypervisorlaunchtype 2.1资源管理器->CPU 里要开启虚拟化 2.2 服务-停掉HV服务 2.3 控制面板 不勾选 2.4 …...

IP-----双重发布
目录 6.双重发布 1.重发布的作用 2.部署条件 1.必须存在ASBR 2.种子度量值 3.重发布的规则 4.重发布的数量 5.重发布的场景 1.场景和规则 2.直连和静态 3.动态RIP 4.动态OSPF 5.更改开销值 6.重发布的问题1 7.重发布的问题2 1.流量 2.前缀列表 3.偏移列表 4…...

【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!
在全球化的今天,语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备,正在通过实时翻译与语音识别功能,打破语言壁垒,为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用,为实时翻译与语音识别功能的…...
LeetCode 热题 100_寻找两个正序数组的中位数(68_4_困难_C++)(二分查找)(先合并再挑选中位数;划分数组(二分查找))
LeetCode 热题 100_寻找两个正序数组的中位数(68_4) 题目描述:输入输出样例:题解:解题思路:思路一(先合并再挑选中位数):思路二(划分数组(二分查找…...
Java多线程与高并发专题——深入ReentrantReadWriteLock
深入ReentrantReadWriteLock 读写锁出现原因 synchronized和ReentrantLock都是互斥锁。如果说有一个操作是读多写少的,还要保证线程安全的话。如果采用上述的两种互斥锁,效率方面很定是很低的。在这种情况下,咱们就可以使用ReentrantReadWr…...

【Python 语法】算法合集
查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之(divide and conquer,D&C)贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时, 如果不确定该如何 高效…...

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解
一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…...

C++ ++++++++++
初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 sizeof关键字 浮点型(实型) 有效位数保留七位,带小数点。 这个是保…...
C# 牵手DeepSeek:打造本地AI超能力
一、引言 在人工智能飞速发展的当下,大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署 DeepSeek 成为众多开发者和…...

phpstudy安装教程dvwa靶场搭建教程
GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) Dvwa下载地址 Windows版phpstudy下载 - 小皮面板(phpstudy) 小皮下载地址 1选择windows 版本,点击立即下载 下载完成,进行解压,注意不要有中文路径 点击.exe文件进行安装…...

最新版本SpringAI接入DeepSeek大模型,并集成Mybatis
当时集成这个环境依赖冲突,搞了好久,分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...
FastAPI 学习笔记
简介: FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 并基于标准的 Python 类型提示。 关键特性: 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic&…...

Elasticsearch:过滤 HNSW 搜索,快速模式
作者:来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现,探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来,Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索,允许用户检索符合指定元数据…...

华为hcia——Datacom实验指南——STP工作基本原理及STP/RSTP基本功能配置
什么时候需要用到STP 在二层交换网络中,为了避免环路产生。 什么是STP STP生成树协议,是用来在冗余链路上消除二层环路。在众多交换机中,需要设置出一个根桥,其余的交换机称为非根桥,根桥是整个交换网络的核心&…...

Vue核心知识:动态路由实现完整方案
在Vue中实现动态路由,并结合后端接口和数据库表设计,是一个复杂的项目,需要多个技术栈和步骤的配合。以下将详细描述整个实现过程,包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…...

【Maui】系统找不到指定的文件Xamarin.Android.Aapt2.targets
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 And…...

通过返回的key值匹配字典中的value值
需求 页面中上面搜索项有获取字典枚举接口,table表格中也有根据key匹配字典中的value 方案一 需要做到的要求 这里上面下拉列表是一个组件获取的字典,下面也是通过字典匹配,所以尽量统一封装一个函数,每个组件保证最少变动tabl…...

【Linux第一弹】Linux基础指令(上)
目录 1.ls指令 1.1 ls使用实例 2.pwd指令 3.cd指令 3.1 cd使用实例 4.touch指令 4.1touch使用实例 5.mkdir指令 5.1mkdir使用实例 6.rmdir指令和rm指令 6.1 rmdir指令使用实例->: 6.2 rm指令使用实例 7.man指令 8.cp指令 8.1 cp 使用实例 9.mv指令 9.1mv使用…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...