《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 01 为什么需要一个新的网络架构

关于专栏
本专栏是工作之后阅读 Cloud Native Data Center Networking ( O’Reilly, 2019)的读书笔记。这本书是我在数据中心从事云网络工作的启蒙、扫盲读物。可惜,其中文版翻译并非尽善尽美,必须结合英文原版才能理解原作者要表达的观点。

部分表达参考了博客:ARTHURCHIAO’S BLOG


本章回答以下问题:

  • 新型应用程序的特征是什么?

  • 什么是“接入-汇聚-核心”(access-aggregation-core)架构的网络?

  • 为什么“接入-汇聚-核心”网络架构不能满足新一代应用的需求?

应用网络程序的洗牌

在这里插入图片描述

应用架构演进:

  1. 单体应用

    • 通常部署在大型机上。
    • 特定的厂商提供网络方案,协议是私有的(不是 TCP/IP 协议)。
    • 以今天的眼光看,应用所需的带宽极小。
  2. 客户端-服务器应用

    • 工作站和 PC 时代。

    • LAN 开始兴起。

      充斥着各种 L2、L3 和更上层协议。

      • 以太网、Token Ring、FDDI 等是比较流行的互连方式。带宽上限 100Mbps。
      • TCP/IP 体系开始发展,但还没用成为主流。
  3. Web 应用

    • 以太网和 TCP/IP 一统互联网,其他绝大部分协议成为历史。
    • 计算和网络虚拟化:虚拟机时代
  4. 微服务(分布式应用)

    • 大规模的数据处理(例如 MapReduce),数据中心网络的带宽瓶颈从南北向变成东西向,这是一个历史性的转变。
    • 容器时代

世纪之交的网络设计

image-20240616190924646

图1-2 展示了 20 世纪末流行的网络设计 ——“接入 - 汇聚 - 核心”架构。(access-aggregation-core

在图 1-2 的最低层,终端(或称为计算节点) 连接到接入交换机。汇聚交换机 (也称为分发交换机) 又依次连接到核心网络,从而将接入网络连接到世界其他地方。在不同的网络中,汇聚交换机和核心交换机之间的连接方案会有所不同,但这并且不影响下面的讨论,因此在上图中没有画出这些链路。

如果只有一台汇聚交换机,该汇聚交换机发生故障时就会导致本地网络断开和外部网络的连接,因此上图中使用了两台汇聚交换机来避免单点故障。当时认为如果仅有两台汇聚交换机还不够,应该在汇聚层加入多台交换机,这样既有利于提高网络吞吐量,又具有冗余性。

汇聚交换机之间的流量通过桥接进行二层转发。在汇聚层之上则使用路由三层转发数据包。因此,汇聚层同时提供两种能力,南向 (向下层的接口) 提供桥接,而北向(向上层的接口)则提供路由。在图 1-2 中,通过在汇聚层同时标 L2和L3表明这一点,这里的L2和L3分别指的是2层网络 (桥接)和3层网络 (路由)

网络图阅读指南

网络工程师在绘制网络图时,会把网络设备绘制在顶部,把计算节点绘制在底部。在此图中,诸如“北”和“南”之类的基本方向具有特定含义。

  • 北向流量指从企业内部网路流向 Internet 的流量,首先从计算节点进入网络,然后离开企业内部网络,流向 Internet的。
  • 南向流量是指从Internet返回本地计算节点的流量。

可以看到,这是经典的客户端-服务器通信模式。东西流量则指的是在同一网络中的各个服务器之间的通信流量。在客户端-服务器时代,只有很少量的东西向流量。在现代数据中心中,有很多高度集群化,分布式的应用程序,这些应用程序内部有大量的网络通信,因此东西向的流量成为现代数据中心的主要流量。

桥接(Bridging)的魅力

即使在Internet 已经迅速流行起来的时候,“接入 -汇聚 -核心”类型的网络仍然严重依赖于桥接技术。如果 IP 路由是推动Internet 发展的动力,那么企业内部的联网为什么还要使用桥接而不是路由呢?

主要有以下三个原因:

  1. 硬件交换分组转发的发展

    交换芯片的出现(silicon switched packet forwarding)

    • 做数据转发的芯片原先主要用在网卡,现在用于功能更强大的交换设备
    • 这种设备显然要求芯片具备更高密度的接口,而这样的芯片在当时只支持交换(bridging),不支持路由(routing)。
  2. 企业专用网络软件栈的兴起

    • “客户端-服务器”模型所处的时代,TCP/IP 只是众多协议种的一种,并没有今天所处的统治地位。
    • 但各家的协议只是在桥接层之上有所不同,而在桥接层面都是相同的。因此汇聚层以下走交换就是顺理成章也是唯一的选择。
    • 接入 - 汇聚 - 核心成为了一种通用的网络架构,允许网络工程师为所有这些不同的网络协议构建一个相同网络
      • 汇聚以下走交换(bridging),不区分厂商
      • 汇聚以上走各家的三层协议
  3. 桥接技术零配置的优势

    • 路由网络很难配置,甚至对某些厂商的设备来说,直到今天仍然如此。需要很多显式配置。
    • 相比交换,路由的延迟更大,更消耗 CPU 资源。
    • 交换网络是自学习的(self-learning),也是所谓的“零配置”(zero configurations)。

ROUTERS, BRIDGES, AND SWITCHES—相互重叠的术语

在转发芯片也开始支持路由之后,交换机的功能就不再只限制为桥接了,有些人将术语“L2 交换机”用于仅提供桥接功能的交换机,而用“L3 交换机“来指可以进行路由的交换机。现在许多供应商仍然使用这种区别来为设备的桥接端口和路由端口实行不同的定价和许可证策略。

在本书中,作者使用术语“交换”(switch)来表示路由器(router)或桥接(bridge),或者在适当的时候直接显式地指出其实现的功能

作者遵循通用的行业术语,在桥接 (链路层) 和路由层都使用数据包( packet)来代指交换的数据(因为没人使用“交换”这个词)。需要注意的是,在OSI七层标准模型中,链路层交换的是数据 (frame)而不是数据包 (package)。

自学习透明桥接是如何工作的?

一个网桥中包含多个网络接口,网桥可以将数据包从它的一个接口转发到另一个接口。 网桥的每个网卡接口都由一个制造商内置的 MAC 地址 (也称以太网地址) 标识。网桥在各个接口之间进行数据转发时,会通过侦听数据提交自动构建地址查找表,而无需任何用户配置。

在转发网络中,每个数据包都携带两个MAC地址: 源地址和目标地址。**网桥会在自身的 MAC地址表中查找目标 MAC地址,以查看其是否知道系统位于哪个接口上。**如果不知道,它将数据包发送到除接收数据包的接口以外的所有其他接口。通过这种方式,只要目标 MAC 地址存在于网络中,则数据包最终将会被传递给它。

**当网桥在自身的MAC地址表中找不到待转发数据包的目的 MAC 地址,而向所有端口发送该数据包的行为称为泛洪 (flooding)。**泛洪时网桥会进行自转发检查,防止网桥将数据包从其来源的接口发送出去。

在网桥的 MAC 地址表中查不到其目标 MAC 地址的数据包被称为未知单播数据包。除未知单播数据包之外,网桥也会对广播数据包和未知的多播数据包进行泛洪,因为这些类型的数据包必须被发送给网络上的每一个工作站端点。

当一个具有 MAC地址的节点发出数据包后,网桥可以从接收到该数据包的接口上得知该 MAC地址对应的接口,这就是网桥的学习方式。下次收到目标地址为该MAC地址的数据包,网桥就只会将数据包转发到该接口。通过这种方式随着时间的推移,网桥可以构建出整个网络的转发表。这就是自学习网桥名称的由来。自学习网桥也称为透明网桥,因为数据包不需要显式地寻址到网桥就可以把数据包发送到其目的地。而在进行路由转发时,数据包的目标 MAC 地址则必须设置为路由器的接口地址。

构建可扩展的桥接网络

桥接可以为各种不同的上层协议提供一个单一的底层网络,提供更快的数据转发速度,并且只需要很少的手动配置。但在现实中,由于其学习模型和生成树协议的影响桥接还存在一些限制。

1.广播风暴和STP的影响:这是自学习的机制决定的

如果一个数据包的目的地址不在网络中,或者该数据包的目的节点不能正常工作,网桥永远无法得知这个数据包应被发向哪里。在这种情况下,即使在一个简单的三角形拓扑网络中,在网桥已经做了自转发检测的前提下,该数据包也会在网络中循环转圈。因为MAC头并不像IP头一样有一个用于防止数据包转发环路的存活时间(TTL)字段。在这种情况下,即使只有一个进入环路转发的广播数据包也会导致一个小型网络的所有可用带宽被耗尽。这种灾难被称为广播风暴,只要在网络中发送足够多目的地址不存在的数据包,就可以瘫痪整个网络。

STP 协议可以将任何一种网络拓扑转换为无环树,从而打破网络的环路,以防止广播风暴。

在“接入 - 汇聚”架构的网络中,STP 会带来问题。在这种网络中,通常选用多个汇聚交换机中的一个作为生成树的根节点。从图 1-2 可以明显看出,两个汇聚交换机和一个接入交换机构成了一个三角形的环路。STP 通过切断接入交换机和非根汇聚交换机的链路来打破循环。不幸的是,这也将导致可用的网络带宽减半,因为接入交换机只能使用其中一条到汇聚交换机的链路。如果当前的活动汇聚交换机发生故障,或接人交换机与活动汇聚交换机之间的链路发生故障,STP 将自动打开接入交换机与另一个汇聚交换机的链接,以保证网络可以正常工作。

2.泛洪带来的负担

泛洪通常是由未知的单播数据包造成的。网络一端的主机会同时接收到所有未知的单播数据包以及广播数据包和未知的多播数据包。MAC 转发表条目一般都关联了一个时长 5 分钟的计时器。如果一个 MAC 地址的主机在 5 分钟内没有和对端通信,则这个 MAC 地址所关联的转发表条目就会被从 MAC 地址转发表中删除。就会使得下一个发到此 MAC 地址的数据包泛洪转发。ARP 是一种用于解析IP 地址对应的 MAC 地址的IPV4 协议,通常使用广播进行 ARP 查询。因此,在一个有 100 个主机的网络中,每个主机至少会额外接收到 100 次 ARP 查询(来自其他99 台主机以及缺省网关查询) 。

ARP 是目前已知的一种很高效的协议,所以每秒几百个提交的处理并不会有明显的影响,但有时也并非这样。
大多数的应用程序并非像 ARP 协议那样考虑周全。这些应用会滥用广播和多播数据包,这就造成一个桥接网络上经常会传输各种数据包。

虚拟局城网 (VLAN)的发明解决了泛洪过多的问题。单一的物理网络在逻辑上划分成为多个小规模的网络,每一个逻辑网络由多个节点组成,而且这些节点在大多数况仅与本逻辑网络内的其他节点互相通信。每一个数据包都属于特定 VLAN,与泛洪数据包所属的同 VLAN 网络的交换机端口上。就可以允许一个企业内部的群组共享同一个物理网络,同时不会影响仍处于同一个物理网络的其他类的群组。从IP 角度看,广播包被限制在一个子网内部。因此一个 VLAN 是与一个IP子网相关联的。

什么是子网

IP 地址可以被划分成若干组连续的地址,并用形如“共同的起始位一掩码一掩码长度”这样的形式来表示。比如,在IPV4 地址中,1.1.1.0/24 代表着一个由1.1.1.0到 1.1.1.255 共 256 个地址的子网。

image-20240616203434923

用每 VLAN 生成树来增加带宽
之前提到,接入交换机被连接到两个汇聚交换机,采用了 STP 来阻止环路的产生同时导致网络可用带宽减半。为了使两个链路同时工作,思科引入了每 VLAN 生成树 (per-VLAN spanning tree, PSTV) ,也就是说,PSTV 为每个 VLAN 构建了一个单独的生成树。例如,通过将偶数 VLAN 接入其中一个汇聚交换机,将奇数 VLAN 接入另一个汇聚交换机,PSTV 允许使用两条链路:一条用于偶数 VLAN 那一组,另一条用于奇数 VLAN 那一组。对于接入交换机的某一个 VLAN,实际生成树拓扑如图 1-3 所示。

3.IP层的冗余设计

网关配置在汇聚交换机。由于汇聚交换机代表了网络的边界,那些通过接入交换机接入并挂接在汇聚交换机之下的主机会用这些汇聚交换机作为第一跳路由器。当给一台主机分配IP地址时,第一跳路由器的 IP 地址通常也会被设置为这台主机的缺省网关。这使子网内的主机可以通过第一跳路由器与子网以外的设备通信。

为保证高可用,一组汇聚配置同一个网关。当一台主机获取到缺省网关的 IP 地址后,如果其中一台汇聚交换机发生故障,那么另一台汇聚交换机需要代替已故障的汇聚交换机,继续使用原先的默认网关 IP 地址提供服务。否则,子网内的主机就不能在汇聚交换机发生故障时与子网以外的主机进行通信。这就会让引入第二台冗余汇聚交换机的目的无法达成。因此必须设计一个解决方案,使得两台路由器支持同一个 IP 地址,但同一时间只能有一台路由器持有这个 IP 地址且处于工作状态。

考虑到图 1-3 所示的拓扑结构,每一个广播包(比如 ARP 包)都会被发送到两台汇聚交换机。除了只允许其中一台汇聚交换机在给定时间点上对广播包做出响应以外,还必须确保在汇聚交换机发生切换前后,汇聚交换机回应的 ARP 中的网关 MAC 地址保持不变。

需要协议支持,这种协议称为第一跳路由协议(First Hop Routing Protocol, FHRP)。

FHRP 原理:FHRP 允许两台路由器同时监控对方的运行状态,以确保任意时间只有一台路由器来响应查询网关IP的ARP包。

FHRP 协议举例:

  • HSRP(Hot Standby Routing Protocol):FHRP 的第一个实现,思科的热备路由协议
  • VRRP(Virtual Router Rundundency Protocol):目前用的最多的协议。

​ 又如不中断业务升级 (ISSU)功能极其复杂,虽然能解决一些问题,但引入了更多问题。

接入 - 汇聚 - 核心网络架构存在的问题

  • 面对广播风暴的脆弱性 —— 即便已经开启了 STP。
  • 应用(applications)变了 —— 服务器之间的东西向流量开始成为瓶颈,而这种网络架构主要面向的是“客 户端-服务器”模式的南北向流量时代。
  • 应用的规模显著变大,在故障、复杂性和敏捷度方面对网络提出了完全不同于以往的新需求。

现有网络架构无法解决以上问题。

不可扩展性(Unscalability)

尽管接入 - 汇聚 - 核心网络被设计成可扩展的,但是这种架构很快就达到了可伸缩的极限。这种架构的各个层级上都遇到了问题。

  • 泛洪

    不管架构上如何分层,自学习型网桥的这种“泛洪和学习”模型并没有可伸缩性。MAC 转发表仅仅是一个针对 VLAN 和目的MAC地址的60个比特查找表。当网络规模非常大时 (例如大规模虚拟机场景),定期地会有上百万的泛洪包,终端计算节点不堪重负。

  • VLAN 限制

    传统上,1个 VLAN标识符有 12 比特,因此一个网络中最多有 4096 的VLAN。云计算来临后,4096 个 VLAN 显然是不够用的。,无法满足云计算时代的多租户需求。就算采用24 比特 VLAN标识符,但由于每个 VLAN 都会有一个 STP 实例,运行1600万个 STP实例简直是不可能的。

  • 汇聚应答 ARP 的负担

    汇聚负责应答 ARP。ARP 数量可能非常多,导致汇聚交换机 CPU 飙升。

  • 交换机水平扩展性和 STP 限制

    理论上,增加汇聚交换机数量似乎就能增加东西向带宽。但是, STP 不支持两个以上的交换机场景,否则后果无法预测。 因此汇聚交换机就固定在了两个,无法扩展。

复杂性(Complexity)

桥接网络需要很多网络协议的支持。这就包括 STP 协议及其变种协议,FHRP,链路失效侦测,以及供应商的私有
协议[例如 VLAN 中继协议 (VTP) ]。所有这些协议显著增加了桥接网络解决方案的复杂性。实际上这里的复杂性意味着当网络失效时,必须检查多个运行时组件以便来定位问题的根因。

除非接入-汇聚 -核心网络是精心设计的,否则这类网络中很容易出现拥塞。

为了说明这种情况,请再看一次图 1-3。两台汇聚交换机 Agg1和 Agg2 对于连接到接入交换机 acc1 的子网是可达的。这个子网并不局限于 acc1,而且有可能包含多个接入交换机。如果 Agg1 和 acc1 之间的链路失效,当 Agg1接收到来自于核心交换机且目的节点下挂在acc1 上的数据包时,Agg1需要通过 Agg1和 Agg2 之间的链路将此数据包发送给 Agg2,进而让 Agg2 把这个数据包转发给 acc1。这意味着 Aggl和Agg2 之间的链路带宽必须精心设计,否则如果链路上的流量由于链路失效而超出预设会造成意想不到的应用性能问题。

即使在正常情况下,也会有一半的流量会转发至备份汇聚交换机上,这台汇聚交换机与接入交换机的互联链路被阻塞,最终流量通过主备汇聚交换机互联的对等链路转发至主用汇聚交换机。

STP 使得网络只能用到一半的链路带宽

故障域(Failure Domain)

数据中心的先驱们引入一个名词叫爆炸半径(blast radius),来度量单一失效造成的影响的范围有多大。当失效越靠近失效点,则说明失效域的粒度越细,即爆炸半径越小。

接入 - 汇聚 - 核心模型容易发生粗粒度的失效。

  • 单个链路的失效造成带宽减半。
  • 单个汇聚交换机失效,整个网络的流量带宽减半;而且此时所有流量都会打到同组的另一台汇聚,这也会造成剩下的这台交换机失效。
  • 广播风暴会使整个网络瘫痪。

不可预测性(Unpredictability)

某些普通的故障会导致整个 STP 瘫痪

欠灵活性(Inflexibility)

在图 1-4 中,VLAN 在汇聚交换机终结,即在交换(bridging)和路由(routing)的边界终结。

同一个 VLAN不会跨越两台成对出现的汇聚路由器,受到物理架构的限制,网络工程师无法灵活地将任意可用接口分配给用户的VLAN(需要端到端的链路都有可用接口才行)。例如,如果某个VLAN的用户分布在不同楼层或建筑物中,传统设计无法轻松地将这些用户的端口划分到同一个VLAN。

In other words, the access-agg-core design is not flexible enough to allow a network engineer to assign any available free port to a VLAN based on customer need.

image-20240616210319593

欠敏捷性(Lack of Agility)

在云计算领域,不停地有租户租用云计算资源或者到期不再续租。因此快速的提供虚拟网络变得极其重要。

VLAN 需要网络中的每一个节点都被正确的配置了 VLAN 信息以便能正常工作。但是增加 VLAN 也会造成控制面的负担,这是因为根据 PVST 协议,控制面所发送的 STP 握手包的数量等于端口数乘以 VLAN 的数量。之前讨论过,单一的负载过重的控制面很容易使整个网络瘫痪因此添加或者移除 VLAN 是一个费时费力的过程,通常要持续数天。

桥接问题的解决尝试

跨设备链路汇聚(MLAG)在当代企业数据中心中有少量的使用,用于处理双归属服务器。

小结

本章中,我们看到应用程序架构的演进是如何对网络架构产生影响的。单体应用是相对(与当今的应用相比而言)简单的一类的应用,它们运行在复杂的定制硬件上,只要求网络提供简单的连接并运行专有协议即可。下一代应用是复杂的基于客户-服务器架构的应用,这些应用运行在相对简单,但需要复杂互联支撑的计算基础设施之上。当前的应用类型是复杂的大规模分布式应用,这类应用要求与以往不同的网络架构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

期末算法复习

0-1背包问题(动态规划) 例题 算法思想: 动态规划的核心思想是将原问题拆分成若干个子问题,并利用已解决的子问题的解来求解更大规模的问题。 主要是状态转移方程和状态 算法描述: 初始化一个二维数组dp&#xff0…

通过命令行启动MySQL

通过命令行启动MySQL 右击,选择管理员运行 停止MySQL net stop你的服务名称 net stop MySQL启动MySQL net start你的服务名称 net start MySQL

绿色版DirectoryOpus功能强大且高度可定制的Windows文件管理器

Directory Opus(通常简称为DOpus)是一款功能强大且高度可定制的Windows文件管理器。它提供了许多超越Windows默认文件资源管理器(Explorer)的功能,使得文件和文件夹的管理变得更加高效和直观。以下是对Directory Opus的…

破解动态网页:如何用JavaScript获取自动消失的联想词

前几天在做数据分析时,我尝试获取某网站上输入搜索词后的联想词,输入搜索词后会弹出一个显示联想词的框。有趣的是,当我尝试通过按F12定位这个弹框在HTML中的位置时,输入框失去焦点后,联想词弹框就自动消失了。我观察到…

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作…

华为od-C卷200分题目2 - 找城市

华为od-C卷200分题目2 - 找城市 题目描述 一个城市规划问题,一个地图有很多城市,两个城市之间只有一种路径,切断通往一 个城市i的所有路径之后,其他的城市形成了独立的城市群,这些城市群里最大的城 市数量&#xff0…

【Python】深入了解 AdaBoost:自适应提升算法

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 🎵 薛凯琪《找到天使了》 在机器学习的领域中&#x…

[C++ STL] vector 详解

标题:[C STL] vector 详解 水墨不写bug 目录 一、背景 二、vector简介 三、vector的接口介绍 (1)默认成员函数接口 i,构造函数(constructor) ii,析构函数(destructor&#xff0…

微信小程序地图

小程序中的 Map 地图功能详解 一&#xff0c;使用&#xff1a; 要在小程序中使用地图&#xff0c;首先需要在 WXML 文件中引入 Map 组件&#xff1a; <view class"container"><map id"myMap" longitude"{{longitude}}" latitude&quo…

开源语音合成模型ChatTTS本地部署结合内网穿透实现远程访问

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章就教大家如何快速地在Windows中本地部署ChatTTS&#xff0c;并且我们还可以结合Cpolar内网穿透实现公网随时随地访问ChatTTS AI语言模型。 最像人声的AI来了&a…

超拟人大模型:AI心理健康服务的未来

摘要&#xff1a; 周末听了一场聆心智能关于情感LLM的分享&#xff0c;总结了相关内容如下。在人工智能技术的浪潮中&#xff0c;超拟人大模型技术为心理健康服务领域带来了革命性的变化。本文将分析超拟人大模型的进展、CharacterGLM模型的特点、Emohaa模型的应用以及心理健康…

42 mysql “+“ 操作符的实现

前言 问题来自于 chinaunix, mysql select 子句的小白问题 mysql 的一些基础的 算术运算符 的计算的实现 这里 整理如下 case, 执行之前 设置如下变量 set a 2; set b 3;select a b; select a b; select 1 3; select 1 3; select a b; select a b; select a b; …

实战项目: 负载均衡

0. 前言 这个项目使用了前后端,实现一个丐版的LeetCode刷题网站,并根据每台主机的实际情况,选择对应的主机,负载均衡的调度 0.1 所用技术与开发环境 所用技术: C STL 标准库 Boost 准标准库 ( 字符串切割 ) cpp- httplib 第三方开源网络库 ctemplate 第三方开源前端网…

EarMaster7.5.74官方版安装激活使用教程

EarMaster就是你音乐路上的良师益友。这是一款来自丹麦皇家音乐学院的多媒体音乐教育软件&#xff0c;针对视唱练耳为音乐学生&#xff0c;音乐爱好者以及音乐专业人员都带来了很多的帮助&#xff0c;让你们可以获得音乐家般的耳朵&#xff0c;通过专业视唱练耳培训考试&#x…

使用 PNPM 从零搭建 Monorepo,测试组件并发布

1 目标 通过 PNPM 创建一个 monorepo&#xff08;多个项目在一个代码仓库&#xff09;项目&#xff0c;形成一个通用的仓库模板。 这里以在该 monorepo 项目中搭建 web components 类型的组件库为例&#xff0c;介绍从仓库搭建、组件测试到组件发布的整个流程。 这个仓库既可…

10 C++11

10 C11 1、类型推导1.1 auto关键字1.2 auto类型推断本质 2、类型计算2.1 类型计算分类2.2 类型计算的四种规则2.3 返回值类型计算 3、列表初始化4、Lambda表达式4.1 前置知识4.2 Lambda表达式4.3 捕获表 5、右值引用5.1 概念5.2 左值引用和右值引用 6、移动语义 1、类型推导 1…

el-tree回显复选框时半选中和全选中的树

项目需求如下&#xff1a;当我点击“编辑”后&#xff0c;需要在tree树上全勾中和半勾中选项&#xff0c;由于后端接口返回的tree树是含了父级节点id的数组集合&#xff0c;所以我们回显时需要处理好这个全勾中和半勾中的问题。 主要思路如下&#xff0c;我们通过setData方法获…

【Java】已解决:java.lang.OutOfMemoryError: Java heap space

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决Java&#xff1a;java.lang.OutOfMemoryError: Java heap space 一、问题分析背景 在Java开发过程中&#xff0c;有时我们会遇到java.lang.OutOfMemoryError: Java heap spa…

在typora中利用正则表达式,批量处理图片

一&#xff0c;png格式 在 Typora 中批量将 HTML 图片标签转换为简化的 Markdown 图片链接&#xff0c;且忽略 alt 和 style 属性&#xff0c;可以按照以下步骤操作&#xff1a; 打开 Typora 并加载你的文档。按下 Ctrl H&#xff08;在 Windows/Linux 上&#xff09;或 Cmd…

【Python】理解『下采样』:原理与应用

是你多么温馨的目光 教我坚毅望着前路 叮嘱我跌倒不应放弃 没法解释怎可报尽亲恩 爱意宽大是无限 请准我说声真的爱你 &#x1f3b5; Beyond《真的爱你》 在数字信号处理、图像处理和机器学习中&#xff0c;下采样&#xff08;Downsampling&#xff09;是…
最新文章