学习笔记-架构的演进之初探云原生-3月day04

文章探讨了从微服务到云原生的演进,重点介绍了不可变基础设施的概念,以及虚拟化的不同类型,如容器、虚拟机和操作系统层虚拟化(容器化)。容器作为虚拟化的子集,提供了高效的部署方式,解决了软件的ABI和环境兼容性问题,而服务网格则帮助管理微服务间的通信复杂性。
摘要由CSDN通过智能技术生成

前言

前面主要学习了微服务中的关键技术问题与解决方案,接着我们继续学习,从微服务走向云原生。

主要围绕“不可变基础设施”的相关话题,以容器、编排系统和服务网格的发展为主线,介绍虚拟化容器与服务网格是如何模糊掉软件与硬件之间的界限,如何在基础设施与通讯层面上帮助微服务隐藏复杂性,以此解决原本只能由程序员通过软件编程来解决的分布式问题

不可变基础设施

云原生定义(Cloud Native Definition)
Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach. These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.
——CNCF,2018

虚拟化的目标与类型

容器是云计算、微服务等诸多软件业界核心技术的共同基石。容器的首要目标是让软件分发部署的过程,从传统的发布安装包、靠人工部署,转变为直接发布已经部署好的、包含整套运行环境的虚拟化镜像

在容器技术成熟之前,主流的软件部署过程是由系统管理员编译或下载好二进制安装包,根据软件的部署说明文档,准备好正确的操作系统、第三方库、配置文件、资源权限等各种前置依赖以后,才能将程序正确地运行起来。

一个计算机软件要能够正确运行,需要通过以下三方面的兼容性来共同保障:

  1. ISA 兼容:目标机器指令集兼容性,比如 ARM 架构的计算机无法直接运行面向 x86 架构编译的程序。
  2. ABI 兼容:目标系统或者依赖库的二进制兼容性,比如 Windows 系统环境中无法直接运行 Linux 的程序,又比如 DirectX 12 的游戏无法运行在 DirectX 9 之上。
  3. 环境兼容:目标环境的兼容性,比如没有正确设置的配置文件、环境变量、注册中心、数据库地址、文件系统的权限等等,当任何一个环境因素出现错误,都会让你的程序无法正常运行。

指令集架构(Instruction Set Architecture,ISA)是计算机体系结构中与程序设计有关的部分,包含了基本数据类型、指令集、寄存器、寻址模式、存储体系、中断、异常处理以及外部 I/O。指令集架构包含一系列的 Opcode 操作码(即通常所说的机器语言),以及由特定处理器执行的基本命令。

应用二进制接口(Application Binary Interface,ABI)是应用程序与操作系统之间或其他依赖库之间的低级接口。ABI 涵盖了各种底层细节,如数据类型的宽度大小、对象的布局、接口调用约定等等。ABI 不同于应用程序接口(Application Programming Interface,API),API 定义的是源代码和库之间的接口,因此同样的代码可以在支持这个 API 的任何系统中编译,而 ABI 允许编译好的目标代码在使用兼容 ABI 的系统中无需改动就能直接运行。

所谓虚拟化技术,就是使用仿真(Emulation)以及虚拟化(Virtualization)技术来解决以上三项兼容性问题的方法。根据抽象目标与兼容性高低的不同,虚拟化技术又分为了五类:

  1. 指令集虚拟化(ISA Level Virtualization)
    通过软件来模拟不同 ISA 架构的处理器工作过程,它会把虚拟机发出的指令转换为符合本机 ISA 的指令,代表为QEMU和Bochs。
    指令集虚拟化就是仿真,它提供了几乎完全不受局限的兼容性,甚至能做到直接在 Web 浏览器上运行完整操作系统这种令人惊讶的效果。但是,由于每条指令都要由软件来转换和模拟,它也是性能损失最大的虚拟化技术。
  2. 硬件抽象层虚拟化(Hardware Abstraction Level Virtualization)
    以软件或者直接通过硬件来模拟处理器、芯片组、内存、磁盘控制器、显卡等设备的工作过程。
    硬件抽象层虚拟化既可以使用纯软件的二进制翻译来模拟虚拟设备,也可以由硬件的Intel VT-d、AMD-Vi这类虚拟化技术,将某个物理设备直通(Passthrough)到虚拟机中使用,代表为VMware ESXi和Hyper-V。这里你可以知道的是,如果没有预设语境,一般人们所说的“虚拟机”就是指这一类虚拟化技术。
  3. 操作系统层虚拟化(OS Level Virtualization)
    无论是指令集虚拟化还是硬件抽象层虚拟化,都会运行一套完全真实的操作系统,来解决 ABI 兼容性和环境兼容性的问题,虽然 ISA 兼容性是虚拟出来的,但 ABI 兼容性和环境兼容性却是真实存在的。
    操作系统层虚拟化则不会提供真实的操作系统,而是会采用隔离手段,使得不同进程拥有独立的系统资源和资源配额,这样看起来它好像是独享了整个操作系统一般,但其实系统的内核仍然是被不同进程所共享的。
    该虚拟化又被称为“容器化”(Containerization)。由此可见,容器化仅仅是虚拟化的一个子集,它只能提供操作系统内核以上的部分 ABI 兼容性与完整的环境兼容性。
    容器化牺牲了一定的隔离性与兼容性,换来的是比前两种虚拟化更高的启动速度、运行性能和更低的执行负担。
  4. 运行库虚拟化(Library Level Virtualization)
    与操作系统虚拟化采用隔离手段来模拟系统不同,运行库虚拟化选择使用软件翻译的方法来模拟系统,它是以一个独立进程来代替操作系统内核,来提供目标软件运行所需的全部能力。那么,这种虚拟化方法获得的 ABI 兼容性高低,就取决于软件能不能足够准确和全面地完成翻译工作,它的代表为WINE(Wine Is Not an Emulator 的缩写,一款在 Linux 下运行 Windows 程序的软件)和WSL(特指 Windows Subsystem for Linux Version 1)。
  5. 语言层虚拟化(Programming Language Level Virtualization)
    由虚拟机将高级语言生成的中间代码,转换为目标机器可以直接执行的指令,代表为 Java 的 JVM 和.NET 的 CLR。不过,虽然各大厂商肯定都会提供在不同系统下接口都相同的标准库,但本质上,这种虚拟化技术并不是直接去解决任何 ABI 兼容性和环境兼容性的问题,而是将不同环境的差异抽象封装成统一的编程接口,供程序员使用。

总结

主要梳理软件运行的兼容性和相关虚拟化概念,为容器、编排、云原生打下基础。

此文章为3月Day04学习笔记,内容来源于极客时间《周志明的软件架构课

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值