设计模式:Service Mesh

2023-11-11

原文链接: http://philcalcado.com/2017/08/03/pattern_service_mesh.html

自从数十年前,分布式系统的概念诞生以来,工程师们越来越明白,利用分布式系统可以完成许多意想不到的功能。但是,分布式系统同样带来了许多新的问题。

当分布式系统还未普及,相对比较简单的时候,工程师们通过最小化远程依赖来应对其带来的复杂度。解决分布式问题最简单的方式就是尽可能的避免它,即时会带来大量跨系统的重复逻辑和数据也在所不惜。

但是工业化的进程推动着我们不断进步:从前只是几个大型的中央服务器,到现在成百上千个小的服务。在这种新的场景下,我们必须改变之前的“鸵鸟心态”,开始逐步去解决分布式系统带来的问题和挑战。首先是针对性的去提出解决一个一个小问题,逐渐到深入到更复杂的场景。随着越来越了解分布式系统所存在的问题,并且设计出了较好的解决方案,我们开始将通用的需求总结成设计模式和依赖库,并最终形成了平台化的解决方案。

最初的计算机网络

在人们一开始想要在多个计算机之间进行通信的时候,他们预期的效果是这样的

一个服务和另一个服务进行通信,从而实现某一些功能。显然,这是一个极度简化了的模型,网络中各个层次对字节、帧以及电信号的发送和接收都省略了。但是,对于本篇文章来说,这个抽象模型已经足够了。下面,来添加一个表示网络堆栈的部分。

自从上世纪50年代以来,上图所示模型就已经开始广泛使用了。在刚开始的时候,计算机尚未普及并且十分昂贵,所以节点之间的连接经过了精心的设计和维护。随着计算机的普及并变得廉价,连接的数量以及连接中传递的数据量出现了爆炸式的增长。随着人们越来越依赖互联网,工程师们必须保证他们开发的软件能够为用户提供令人满意的服务质量。

要想达到这样的服务质量,许多的问题亟需被解决:服务器之间如何发现对方?同一个数据线上如何并行处理多个连接?没有直接相连的两个服务器如何相互通信?数据包如何在网络中路由?怎么加密数据?

在这些问题中,我们用流量控制来作一个例子。流量控制用来防止一个服务器向另一个服务器发送过多的数据包。流量控制之所以很重要,是因为在网络中,各个独立的服务器并不了解相互的情况。服务器A以一定的速率向服务器B发送数据,但是没办法保证服务器B能够持续的以足够快的速度接收并处理数据。比如,服务器B可能忙于运行其他的任务,或者数据包没有按顺序到来,服务器B需要阻塞并等待靠前的数据包。这就意味着,不仅服务器A无法从服务器B那得到可靠的服务,甚至可能使得服务器B负载过大,阻塞后续所有的数据包。

有一段时间,工程师们普遍认为需要在开发网络服务和应用的时候,在代码中处理这些问题。在流量控制这个例子中,这就意味着应用本身必须包含响应的逻辑,避免其不会使其他服务过载。这部分重度依赖网络的逻辑和业务逻辑放在了一起。在抽象模型中,表现如下:

幸运的是,技术迅速的进步,并出现了通用的标准来解决很多网络堆栈中存在的问题。比如,TCP/IP协议来解决流量控制的问题。这意味着这段代码依然存在,但是它们从你的应用代码中抽取了处理啊,并转移到了操作系统提供的网络堆栈中。

这个模型成功的普及了开来。很少有企业会出现使用TCP/IP协议无法满足在常见操作系统上运行的业务逻辑的情况,即时是业务对性能和可靠性有很高的要求。

最初的微服务

经过多年的发展,计算机变得越来越普及和廉价,而上面所描述的网络堆栈模型也成为可靠网络系统中的稳定存在的部分。随着越来越多的节点和连接被加入到网络及通中,企业开始利用网络系统的各种特性来进行开发,从精确划分分布式代理和对象到面向服务的架构。

这种极度分布的架构带来了许多有意思的使用场景,但它也同样面临着一些挑战。这其中,有一些挑战是全新的,但是仍然有一些挑战和之前原始网络中讨论过的问题有高度的相似性。

在上世纪90年代,就职于太阳微系统公司(Sun Microsystems)的Peter Deutsch和它的同事们提出了“分布式计算中的8个谬论”(The 8 Fallacies of Distributed Computing)。他列出了人们在搭建分布式系统时候经常会提出的一些假设。Peter的观点是,也许在简单的网络架构或者理论模型中,这些假设是成立的,但是在现代系统中,这些假设不会依然成立:

  • 网络是可靠的(The network is reliable)
  • 延迟为0(Latency is zero)
  • 带宽无限(Bandwidth is infinite)
  • 网络是安全的(The network is secure)
  • 网络拓扑不会变化(Topology doesn’t change)
  • 只有一个管理员(There is one administrator)
  • 传输的开销为0(Transport cost is zero)
  • 网络是同构的(The network is homogeneous)

之所以要将这些假设称之为谬论,就是想告诫工程师们不能忽略这些问题,而是需要明确的解决它们。

在更加分布化的系统中(通常称之为微服务架构),这些问题得到了进一步的细化,许多可操作的需求被提出来了。在上面我们已经详细讨论了部分问题,下面是需要解决的问题列表:

  • 计算资源快速扩容
  • 基础监控
  • 快速调度
  • 存储资源扩容
  • 对外部进行访问
  • 认证/授权
  • 标准化的RPC

尽管TCP/IP协议栈和其他通用的网络模型已经运用了数十年并且仍然是服务器之间通信的可靠工具,但是现代高度复杂化的架构引入了更高层次的需求,并且需要工程师在开发这些架构的时候进行满足。

举个例子,服务发现和断路器,两个用来解决可靠性和一些分布式系统问题的技术。

历史往往具有重复性:第一个基于微服务设计的公司使用了初期网络系统采用的策略。这意味着开发服务的工程师必须同时担起解决上述需求的责任。

服务发现是指自动发现为某个特定请求提供实现方法的服务实例的过程。比如,一个Teams服务需要找到生产环境中存在的Players实例。你会发起一个服务发现的过程,并返回一个存活服务的列表。在相对集中的架构中,这个过程通过简单的通过DNS、负载均衡、约定端口等方式来完成。在相对分布的环境中,这个任务变得比较复杂,这个原本只需要简单的信任DNS发现的过程,变得需要考虑客户端负载均衡、多环境(线上/线下)、机房地理位置等。原来只需要一行代码去解析域名的问题,现在,需要大量的重复代码去解决高度分布所带来的各种边缘问题。

断路器是在Michael Nygard的Release it一书中引入的设计模式。我比较喜欢Martin Fowler对这个模式的概括

断路器的设计理念十分简单。封装出一个叫做断路器的对象,并对错误进行监控。一旦错误的次数达到了某个特定阈值,断路器被触发,后续所有的调用都不在继续原本的逻辑,直接返回错误。通常来说,当断路器被触发的时候,会产生一个报警。
The basic idea behind the circuit breaker is very simple. You wrap a protected function call in a circuit breaker object, which monitors for failures. Once the failures reach a certain threshold, the circuit breaker trips, and all further calls to the circuit breaker return with an error, without the protected call being made at all. Usually you’ll also want some kind of monitor alert if the circuit breaker trips.

断路器是一个简单而有效的设备,可以使服务之间的交互更加可靠。然而,和其他组件一样,随着分布式的程度增加,它会变得更加复杂。系统中某个服务出现错误的概率也随着分布式的程度指数增长,甚至简单的像“断路器触发的时候发出报警”也不再那么简单明了:一个组件的错误会雪崩式的在服务之间传递,同时触发上千次的断路报警。再一次的,原来只需要一行代码去解析域名的问题,现在,需要大量的重复代码去解决新的问题。

事实上,上面举例这两个技术很难被正确的实现。这也导致一些相对成熟的依赖库,比如Twitter的Finagle和Facebook的Proxygen变得非常得受欢迎。

上图所描述的这个模型,被微服务的先驱者们广泛的使用,比如Netflix、Twitter和SoundCloud。随着系统中服务的数量越来越多,他们逐渐被困在了这个方案的缺陷中。

也许最麻烦的挑战在于,即时使用了想Finagle这样的依赖库,企业仍然需要让其工程师们花费许多精力来将业务逻辑和依赖库组合起来。根据我在SoundCloud和DigitalOcean的经历,一个有100-250个工程师的企业,需要花费1/10的员工去搭建基础的组件。有的时候,这个工作会被明确的分配到团队中的某些工程师手上,但更多的时候,这个工作会被忽略,从而无形中增加了产品开发的总体花费。

第二个问题是,上述的依赖库对工具、环境以及开发语言有严格的要求。微服务依赖库通常会给予某一个特点的平台来实现,可能是一个语言也可能是类似JVM的环境。如果一个企业的使用了依赖库不支持的平台,那么通常需要自己将代码转移到新的平台。这会花费昂贵的开发时间。工程师需要再一次的花费时间来搭建工具和基础架构,而不是将精力放在核心业务和产品上面。这也是为什么中型企业会让他们的内部服务统一只使用一种特定的平台。

关于这个模型最后一个值得讨论的问题是治理。依赖库的模型的确将微服务部分问题的解决方案给封装了起来,但它本身仍然是一个需要维护的组件。要确保上千个服务的实例使用了相同或者兼容版本的依赖库并不是一件简单的事情,而每一次的升级意味着整合、测试、重新部署所有的服务,即时服务本身并没有作任何更改。

一次模型升级

和网络堆栈一样,我们会希望将分布式系统通常会需要的特性抽取到底层平台。

人们使用高层的协议(如HTTP)开发复杂的应用和服务的时候,并不需要去考虑TCP协议是如何处理网络中的数据包的。这种场景也是微服务所希望看到的:工程师们专注于他们的业务逻辑,避免自己去些服务基础架构的代码或者是自己去管理整体的依赖库和框架。

把这些需求整合起来,我们就可以得到下图所示的模型:

然而,通过修改网络堆栈来增加这一个层次的功能是不可行的。所以很多实践者会选择通过一系列的代理来实现。这个设计原理是:服务本身不直接连接到其他的服务,而是将所有的流量到送到一个小的代理,由代理来实现需要的特性。

第一个对这个方案进行说明的文档用了sidecar(边车,摩托车旁边的那个座位)这样一个概念。sidecar是一个附加进程,和应用一同启动,并提供而外的特性。在2013年,Airbnb开源了它们的sidecar实现Synapse和Nerve。一年后,Netflix开发了Prana,能够使得非JVM应用也能在NetflixOSS生态中使用到sidecard的功能。在SoundCloud,我们开发一个允许Ruby合法调用JVM微服务的sidecar。

尽管已经有了许多开源的代理实现,但这些代理通常是被设计用来工作在某个特性的基础架构上。举个例子,在进行服务发现的时候,Airbnb的Nerve和Synapse默认服务在Zookeeper进行了注册,而Prana则需要服务在Netflix自己的Eureka服务进行注册。

随着微服务架构越来越流行,能够灵活适配到不同基础设施的代理掀起了一波新的潮流。这其中,第一个被广泛认知的系统是Linkerd,由Buoyant基于其在Twitter微服务平台的经验开发出来的。没过多久,Lyft的工程师团队开源了Envoy,实现了相似的功能。

Service Mesh

在这个模型中,每一个微服务都会伴随一个sidecar代理。所有的服务都通过sidecar代理来进行交互,可以得到下图所示的结构:

Buoyant的CEO William Morgan发现了代理之间的交互形成了网格状的网络。在2017年初,William给出了一个该平台的定义,并命名为Service Mesh

Service Mesh是一个专门用来处理服务和服务之间通信的基础设施。它复杂确保在一个由复杂服务构成的拓扑的现代云应用中,请求能够被稳定的传递。在实践中,Service Mesh通常通过一系列轻量级的代理来进行实现。这些代理和应用并行存在,而应用不需要感知到代理的存在。
A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.

也许在这个定义中最犀利的观点在于:不再将代理当成一个独立的组件,而是认识到代理本身形成一个极具价值的网络。

这里写图片描述

随着企业逐步将它们的微服务部署到更加复杂的运行环境(比如Kubernetes和Mesos)中,企业开始使用这些平台中自带的工具来实现网格网络的概念。他们逐渐抛弃了原来相互独立各自工作的代理,而转向中心化的控制台。

让我们从整体来看一下这个结构,可以发现,实际的数据流仍然是在代理和代理之间进行流动,但是控制台知道每一个代理实例的状态。通过控制台,可以实现访问控制和日志收集等需要协同的功能:

最近开源的Istio是目前最突出的一个实现方案。(译者:最近google开源Conduit应该是分庭抗礼的架势)

目前,Service Mesh给大规模系统带来的影响还无法完全的评估。但是有两个好处已经得到了证明。首先,不需要再去自己实现微服务架构所需的基础设施,使得很多小企业能够享受到之前大公司才有的分布式特性。其次,这个架构可以让我们使用最好的工具和语言去实现业务功能,而不需要担心某些依赖库或者模式是不是存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式:Service Mesh 的相关文章

  • 项目实战之RabbitMQ死信队列应用

    作者名称 DaenCode gt https blog csdn net 2302 79094329 作者简介 啥技术都喜欢捣鼓捣鼓 喜欢分享技术 经验 生活 人生感悟 尝尽人生百味 方知世间冷暖 文章目录 架构图 application
  • 项目实战之RabbitMQ冗余双写架构

    作者名称 DaenCode gt https blog csdn net 2302 79094329 作者简介 啥技术都喜欢捣鼓捣鼓 喜欢分享技术 经验 生活 人生感悟 尝尽人生百味 方知世间冷暖 所属专栏 项目所感所想 gt https
  • 分布式数字身份DID简介(五)DID的应用

    在上一篇文章中 我们给出了一种零知识证明的方法 解决用户身份属性的隐私问题 下面我们再来谈谈基于DID技术 我们都能在什么场景去应用 01 无密码安全登录 这个使用场景大家应该都很熟悉了 就类似于微信扫码登录 当我们要注册或者登录一个网站时
  • 在异构系统中学习应用的流迭代分布式编码计算研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • GoLong的学习之路,进阶,微服务之使用,RPC包(包括源码分析)

    今天这篇是接上上篇RPC原理之后这篇是讲如何使用go本身自带的标准库RPC 这篇篇幅会比较短 重点在于上一章对的补充 文章目录 RPC包的概念 使用RPC包 服务器代码分析 如何实现的 总结 Server还提供了两个注册服务的方法
  • 双非本科进不了大厂?阿里技术四面+交叉面+HR面,成功拿到offer

    前言 前两天 我收到了阿里巴巴的实习offer 从学长内推开始面试到拿到最后offer经历了4面技术 一面交叉面和一面HR面 经过了漫长的等待和几次几乎折磨的面试之后 终于拿到了实习offer 自我介绍 本人来自西南某双非本科学校 该校学的
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 在AI技术的无情侵袭下,学学Java的23种设计模式还是非常有必要的

    目前国内80 程序员的主要工作是调用组合api实现各种业务需求 在顶层架构师设定好的框架下 做着重复且无聊的编码工作 如果未来ai被广泛应用 那么被替代的风险是很高的 比较扎心的是 其实目前用ai生成片段代码已经是各个公司比较普遍的做法了
  • Docker与微服务:构建和部署微服务架构的完整指南

    微服务架构已经成为现代应用开发的主要范式之一 而Docker容器技术则为微服务的构建 部署和管理提供了理想的解决方案 本文将深入探讨如何使用Docker构建和部署微服务架构 提供更多示例代码和细致的指南 以帮助大家更全面地理解和运用这些关键
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • Zookeeper 和 Dubbo 的关系?

    Zookeeper的作用 zookeeper用来注册服务和进行负载均衡 哪一个服务由哪一个机器来提供必需让调用者知道 简单来说就是ip地址和服务名称的对应关系 当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现 但是如果提供服务
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 微服务常见的配置中心简介

    微服务架构中 常见的配置中心包括以下几种 Spring Cloud Config Spring Cloud Config是官方推荐的配置中心解决方案 它支持将配置文件存储在Git SVN等版本控制系统中 通过提供RESTful API 各个
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 使用 Helm Chart 部署分布式 GreptimeDB

    GreptimeDB 作为云时代基础设施的时序数据库 从第一天开始就积极拥抱云原生技术 将数据库部署在 Kubernetes 上可以提供可伸缩性 自愈能力和简化的部署和管理 从而为应用程序提供了强大的弹性和可靠性 Helm 是一个用于管理
  • 网站被攻击了怎么恢复?如何在被攻击后第一时间接入高防恢复正常访问?

    网站受到攻击的原因是多种多样的 包括技术漏洞 人为疏忽 社会工程学等各种因素 保护网站的安全需要综合运用技术手段 当网站遭到攻击时 以下几个步骤可以帮助恢复网站的正常运行 1 分析攻击 首先要确认网站被攻击的类型和程度 以确定所需的恢复步骤
  • 【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则

    文章目录 一 如何判断类的职责是否足够单一 二 类的职责是否设计得越单一越好 开始学习一些经典的设计原则 其中包括 SOLID KISS YAGNI DRY LOD 等 本文主要学习单一职责原则的相关内容 单一职责原则的定义 一个类只负责完
  • DockerCompose - 微服务项目部署全过程(最佳实践)

    目录 一 微服务项目部署 1 1 项目介绍 1 2 准备 MySQL 初始化文件 1 3 pom xml 插件 1 4 测试工作 1 5 编写 Dockerflie 文件 1 6 编写 DockerCompose yml 文件 1 7 修改
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D

随机推荐

  • 拉普拉斯的原理

    拉普拉斯是一种二阶导数算子 是一个与方向无关的各向同性 旋转轴对称 边缘检测算子 若只关心边缘点的位置而不顾其周围的实际灰度差时 一般选择该算子进行检测 拉普拉斯算子为二阶差分 其方向信息丢失 常产生双像素 对噪声有双倍加强作用 因此它很少
  • ng-model指令

    ng model指令作用是绑定HTML表单元素到AngularJS应用程序数据中 即 scope变量中 语法
  • Ispci命令详解

    说明 lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具 参数 v 使得 lspci 以冗余模式显示所有设备的详细信息 vv 使得 lspci 以过冗余模式显示更详细的信息 事实上是 PCI 设备能给出的所有
  • 二进制数组的操作

    ES6之前是不能通过代码直接操作二进制数据的 为了方便开发者可以直接操作二进制数据 ES6提出了三个操作二进制数据的接口 ArrayBuffer TypedArray和DataView ArrayBuffer ArrayBuffer代表储存
  • mysql设置了utf8mb4还是报错_详解JDBC对Mysql utf8mb4字符集的处理

    写在前面 在开发微信小程序的时候 评论服务模块希望添加上emoji表情 但是emoji表情是4个字节长度的 所以需要进行设置 当前项目是JAVA编写 使用JDBC连接操作数据库 如下针对的JDBC操作的解决方案 一 JDBC的URL的正常操
  • springboot_使用servlet的两种方式

    虽然在springboot中我们使用Controller可以应付大部分的需求 但servlet等也是必不可少的 在springboot中使用servlet有两种方式 第一种 用注解方式创建一个servlet 并在注解中声明其url 在App
  • git stash 暂存命令

    一个分支切换另一个分支的时候 当时分支并没有完成任务 我们就可以把他暂存下来 暂存代码 git stash m 暂存信息 也可以git stash 查看所有的存储列表 git stash list 释放最新的存储 工作区是这次存储对应的代码
  • dns配置

    dns配置文件详解 dns配置文件默认在 etc named conf中 vim etc named conf options 影响zone设置 listen on port 53 127 0 0 1 监听端口和ip 若监听所有 则 any
  • 知识梳理:链接形式

    驱动开发 链接 PowerPC介绍
  • 计算机专业建议买苹果笔记本吗,笔记本买win还是买Mac?也许可以参考这些建议...

    原标题 笔记本买win还是买Mac 也许可以参考这些建议 笔记本买win还是买Mac 相信各位在买笔记本的时候 都曾经在 Windows 和 Mac 之间犹豫过 其实 这个问题并没有标准答案 毕竟适合自己的才是最好的 那么 最后您选择了哪个
  • 皮卡堂显示服务器超时,皮卡堂服务生职业

    皮卡堂服务生职业赶快点击皮卡堂 开始玩游戏吧 服务生1级 职业经验 lt 500 吆喝 1 学习了服务生后 可以在聊天输入框处设置3句快捷语言 2 右键单击自己 可以选择举三个固定的礼仪牌 分别显示 请您点菜 欢迎光临 谢谢惠顾 请您用餐
  • C++11中std::bind的使用

    std bind函数是用来绑定函数调用的某些参数的 std bind它可以预先把指定可调用实体的某些参数绑定到已有的变量 产生一个新的可调用实体 它绑定的参数的个数不受限制 绑定的具体哪些参数也不受限制 由用户指定 std bind 1 将
  • oracle数据库还原,如何将dmp文件还原到oralce库

    oracle数据库还原 如何将dmp文件还原到oralce库2008 09 08 20 42 oracle数据库还原 如何将dmp文件还原到oralce库 xuehongliang by 12 八月 2007 16 27 最近用到从orac
  • [自主学习-嵌入式]IIC通信介绍

    文章目录 1 IIC Inter Integrated Circuit 内部集成电路 1 1 概述 1 2 通信过程 1 2 1 主模式 1 2 2 从模式 1 2 3 传输特点 1 2 4 三种信号产生 1 2 5 数据传输 1 3 II
  • 用python来爬取某鱼的商品信息(1/2)

    目录 前言 第一大难题 找到网站入口 曲线救国 模拟搜索 第二大难题 登录 提一嘴 登录cookie获取 第一种 第二种 第四大难题 无法使用导出的cookie 原因 解决办法 最后 出现小问题 总结 下一篇博客 大部分代码实现 前言 本章
  • 王爽著的《汇编语言》第3版笔记

    王爽著的 汇编语言 第3版 于2013年出版 虽然是2013年出版的 但书中部分内容感觉已过时 1 基于intel 8086 CPU介绍 intel 8086是英特尔公司上个世纪生产的芯片 是16位的 早已停产 2 现在PC机上的intel
  • Harbor-registry 使用 NFS 做后端存储实现高可用

    目录 需求分析 方案实施 安装 NFS 配置 harbor registry 配置后端存储为 NFS 配置 harbor registry 副本数为 2 配置 K8S Registry 配置 k8s registry 配置文件 配置 reg
  • 华为OD机试真题 Java 实现【打印文件】【2023Q1 100分】

    一 题目描述 有 5 台打印机打印文件 每台打印机有自己的待打印队列 因为打印的文件内容有轻重缓急之分 所以队列中的文件有1 10不同的优先级 其中数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印 如果存在两个优先
  • 具有柔性结构的孤岛直流微电网的分级控制(Malab代码实现)

    欢迎来到本博客 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智能学习 支持 如果觉得博主的文章还不错或者您用得到的话 可以关注一下博主 如果三连收藏支持就更好啦 这就是给予我最大的支持 本文目录如下 目录 1 概述 2 数学模
  • 设计模式:Service Mesh

    原文链接 http philcalcado com 2017 08 03 pattern service mesh html 自从数十年前 分布式系统的概念诞生以来 工程师们越来越明白 利用分布式系统可以完成许多意想不到的功能 但是 分布式