云计算架构学习整理(二):API是如何控制云的

148 阅读19分钟

前言

云计算架构作为一种基础设施服务几乎已经成为了现代Web开发的标配,它显著地降低了 DevOps(Development and Operations)的门槛,通过云服务商提供的管理平台,Web应用开发人员可以轻松地在云上搭建自己的系统。作为一名云时代的全栈开发工程师,了解云计算架构背后的机制可以让我们更好地利用这个强大的基础设施,在设计、开发、部署和维护应用程序时做出更明智的决策。同时云计算是互联网技术的延伸,通过学习云计算架构,可以更深入地掌握互联网基础知识,这对于个人的技术水平也是一个很大的提升。

为了对云计算有一个全面的了解,最近在读 《图解云计算架构——基础设施和API》 一书,这本书主要以OpenStackAWS为例,通过API来重点讲解IaaS云服务的本质。下面是边读边整理的学习笔记,一方面可以随时回顾,另一方面希望通过输出来促进自己思考。

前面两章主要聚焦于云的全貌,讲解了云的分类和主要组件等内容。下面主要结合Web技术的基础知识介绍用于操作云的API。

正文

API操作包括“认证”、“对象”、“操作”三个要素,其中“对象”离不开DNS和URI,“操作”又跟HTTP紧密相连,所以本节将结合Web技术的基础知识介绍用于操作云的API。

云和API的关系

API的概念:API就是应用编程接口(Application Programming Interface)的简称,具体来说就是“用一个软件控制量一个软件的接口(协议)”。通过API与软件连接,就可以实现对其实现控制。

Web API:云计算环境中通常使用的是Web API,Web API指的是”使用HTTP(HTTPS)协议通过网络调用的API“。它的基本处理过程就是先向Web上某个唯一的URI发送HTTP请求,然后获取响应信息。各种服务都以API参考手册的形式约定了如何交换信息,用户只需遵守约定即可。

要详细了解Web API,先回顾下互联网服务的历程

  • 互联网是在1995年前后开始普及的,那时基于HTML文件的静态网站是主流。
  • 后来随着技术的发展,出现了能够在HTML内嵌入脚本的JavaScript、Java和.NET等Web解决方案,以及支持异步存取XML数据的Ajax等技术,由此从简单Web网站向Web应用程序转变。
  • 这种转变使人们能以Web的方式处理结构化数据,以Amazon为代表的互联网企业为了更有效地利用数据,扩大服务的影响力,开始支持用户通过Web API的方式获取信息。比如Amazon官网提供的Product Advertising API可以实现“直接访问Amazon的商品数据库”等功能,吸引了大量开发者,将他们的应用程序引导到Amazon EC,成功地扩大了运营,随后公司内部也大量使用Web API来均匀分配、回收服务器和存储等计算机资源,并且在2006年,Amazon对外开放了这套机制,包括EC2(Elastic Compute Cloud,弹性计算云)和S3(Simple Storage Service,简单存储服务),这一事件标志着云计算的诞生。

从这个发展历程可以看出,正是互联网服务中的Web技术发展到一定程度,Web API普及了,云计算才得以实现,用户才能通过Web API自由地控制计算机资源。

Web API的构成要素:认证、对象和操作。 简单来说,就是哪个活动主体要对哪个资源执行什么操作。

  • 对象:即资源,在Web API中用URI表示。在云计算环境中指的就是构成服务器、存储、网络等组件的各要素。为了定位资源,需要使用唯一主键,主键可以分成两种:UUID和名字。
  • 动作:即操作,通常是CRUD(Create、Read、Update、Delete),Web API实现动作有两种方式,一种是使用不同的HTTP方法来发送请求,另一种是通过URI查询参数来表示不同的动作。

构成资源的URI

下面讲解Web API中的资源——URI,以及相关的一些基础知识。

1. 域、域树、FQDN

域名就是网络上用的名称,从右往左用“.“来分隔,构成的树状结构就是域树,下一层的域称为上一层域的子域。表示具体资源的主机名放在域名的最后。域名和主机名合在一起就是FQDN(Fully Qualified Domain Name,完全限定域名),我们可以通过FQDN来定位网络上的主机。

云的结构也要由域名的层级结构来体现。比如可以用三级域名表示区域(地区),用四级域名表示服务(组件),按照这个规则就可以轻松地扩展区域和服务。

2. DNS、虚拟主机和域名注册管理机构

域名只是个名字,在TCP/IP通信过程中会被转换成IP地址。从域名到IP地址的转换称为“正向解析”,从IP地址转换成域名的过程称为“反向解析”。在云中,主要使用的是正向解析。DNS提供了域名解析的功能,在Web API过程中发挥着重要作用。

多个IP地址和虚拟主机

FQDN和IP地址既可以配置成一对多的关系,也可以配置成多对一的关系。

  • 一个FQDN对应多个IP:适用于大规模访问的场景。将多个FQDN录入到DNS中,这样DNS就会轮流从多个IP地址中返回一个IP地址,单台服务器上的负载就能缓解。这种机制称为DNS循环复用(round-robin DNS)。在云计算架构中,CDN和负载均衡器就利用DNS的循环复用机制确保了可扩展性,而且还可以巧妙地隐藏IP地址。
  • 多个FQDN对应一个IP地址:可以充分利用服务器资源。这种配置方法称为虚拟主机(virtual host)。搭建虚拟机的方法就是在DNS上为多个FQDN输入相同的IP地址。

域名解析的机制

  1. 位于发起API调用的客户端上的末梢解析器(Stub resolver)向DNS缓存服务器发出域名解析请求。
  2. 如果DNS缓存服务器上没有对应的IP地址,DNS缓存服务器就会尝试从根域开始自上而下询问各级权威DNS服务器。域树中的各级父子域间采取子域管理委派的方式关联,DNS缓存服务器在询问到接受委派的子域中的DNS服务器之后,就会将域名解析的工作交由子域中的DNS服务器完成,反复如此,直到找到存储着FQDN对应的IP地址的DNS服务器,从而得到IP地址信息。

在这个DNS查询过程中,客户端向DNS缓存服务器发起的询问是递归查询,由DNS缓存服务器自身进行的询问是非递归查询。DNS缓存起到了重要作用,减轻了各级DNS服务器的查询负担。

3. URI

Web中常用的URL和URN 都属于URI(Uniform Resource Identifier)。

  • URL(Uniform Resource Locator):URL大致可以分为网络和路径两个部分。网络部分包括Scheme(协议)、认证信息、FQDN和端口号。路径部分在网络部分的后面,是一个用“/”分隔的层级结构,表示资源的位置。路径后面还可以加上查询字符串和书签,分别表示查询参数和文档跳转位置。如果把URL看作云服务的资源,那么网络部分表示组件,路径以及后面的部分表示具体的资源,HTTP消息头和查询参数用于操作和筛选资源。比如https://user:pass@example.com:8080/path/to/resource?query=123#section-2
  • URN(Uniform Resource Name):采用BNF表示法,标识了不依赖于网络的、与资源位置无关的资源名称,各部分用“:”分隔。比如urn:isbn:0451450523

4. 端点

在企业本地部署的传统物理环境中,我们会直接按IP地址操作目标机器,而在云环境中,我们要向通用的端点发送命令来将基础设施中的各组件作为资源加以控制。我们将调用命令API时指定的网络地址定义为端点。具体来讲,端点就是由前面介绍的FQDN构成的,端点会以域名的形式呈现出各组件或功能的层级。

端点和域名

在使用Web API服务时,一般不会使用IP地址作为API的调用地址,而是通过域名来访问API。首先,域名比IP地址更便于理解,还可以按照一定的规则将区域和服务添加进子域名,形成可扩展的结构。另外,使用域名可以隐藏IP地址,充分利用FQDN和IP地址的一对多或者多对一的自由映射,在无需改变端点的情况下应对使用频率的变化。

5. 端点内的路径设计和版本管理

端点内定位资源的方法有REST API和查询API两种,组件采用哪种取决于云服务中的API设计方案。

  • REST API:通过用路径表示层级来指定资源,用URL的路径表示资源层级。比如对象存储资源的路径可以这样表示:(端点)/.../存储桶的名字/对象的名字
  • 查询API:通过查询参数指定资源。比如:(端点)/.../?Action=xxx&ID=***

版本

设计路径时还需要考虑版本。由于云的升级速度非常快,资源和属性会不断增加,使用版本可以在不影响现有部分的前提下增加扩展功能。

6. 资源名称和资源属性类型

除了使用URL,还可以使用URN访问资源。使用URN来表示资源的名称时,需要具备服务(组件)的命名空间,从而不依赖于网络使用,比如EC2、S3等。资源名称和资源属性类型就是两个典型的URN示例:

  • 资源名称语法:arn:aws:服务名:区域:账户ID:资源类型:资源ID
  • 资源属性类型的语法:"Type":"云名(AWS)::组件名:资源名::属性名"

HTTP协议

在指定了URL的Web应用程序中,我们是通过HTTP协议来插入和获取数据的。在云API中也是如此,下面就以云为例,深入了解相关的基础技术。

1. HTTP、Cookie、HTTP持久连接

  • 无状态是HTTP的特征之一,基于HTTP的Web API因此不支持保存状态。
  • Cookie:服务端通过Set-Cookie消息头向客户端发送Cookie值,客户端在后续HTTP请求中带上Cookie消息头,这样就就可以在服务端识别状态。
  • 借助Cookie持久性,可以固定负载均衡器的流量分发,让同一客户端的前后请求分发到同一台服务器上
  • HTTP持久连接:通过HTTP持久连接,可以避免每次HTTP请求都要重新建立TCP连接带来的额外开销。在HTTP 1.1版本默认开启。
    • 客户端首次请求时:建立TCP连接,启用HTTP持久连接
    • HTTP服务器处理请求:通过Set-Cookie消息头向客户端返回Cookie值
    • 客户端后续HTTP请求:接收到的Cookie值放在消息头中,并继续使用已建立的TCP连接
    • 请求到达DNS和负载均衡器:如果启用了Cookie持久性,请求会被发送到同一台HTTP服务器上
    • 服务器:根据Cookie值可以确认前后两次处理是否相同

2. HTTP请求

HTTP请求由请求行、请求消息头和消息体三部分组成。

  • 请求行:包括请求方法、目标URL和HTTP版本
  • 请求消息头:包含Cookie等重要的控制信息和元数据
  • 消息体:即数据区,存放了真正要发送的数据

3. HTTP响应

当我们向HTTP服务器发送HTTP请求,HTTP服务器就会以HTTP响应的形式返回结果。HTTP响应包含状态行、响应消息头和消息体三部分。

  • 状态行:包含三位数的状态码,用于表示HTTP请求的结果状态
  • 响应消息头:用于从HTTP服务器向客户端传递附加信息
  • 消息体:传递与HTTP请求的内容相对应的数据

4. HTTP方法

CRUD操作对应的常用的HTTP方法:

  • POST:创建资源。新建资源意味着创建新的URI,所以POST方法与其他方法指定的URI不同,它不需要指定主键,指向的是比具体资源更高一级的路径。当资源创建成功后,资源路径的下一级就会生成主键。
  • GET:查询和获取数据,指定某个具体资源时要在URI中指定其主键。GET方法是读操作,不会更新资源,所以可以在云的内部轻松实现负载均衡,能够比其他请求方法拥有更多的API并发数。
  • PUT:更新资源。它与POST的区别就是可以通过指定URI的主键覆盖原来的资源。
  • DELETE:删除资源。
  • HEAD:云中的组件和资源往往包含大量的元数据(管理信息),如果我们只想获取这些元数据,可以使用HEAD方法。

5. HTTP消息头

HTTP消息头在HTTP通信中附加信息来实现高级控制,比如Cookie和HTTP持久连接。以HTTP 1.1为例可以分为三类:

  • 通用消息头:比如Cache-Control、Connection等
  • 扩展的消息头:比如Cookie、Set-Cookie等
  • 云服务特有的扩展消息头:比如x-amz-前缀的自定义消息头

在云API中比较有用的消息头:

  • Host:用于表示目标主机的必不可少的消息头
  • Accept:用于在API中定义响应的媒体类型。
  • Last-Modified:用于查看最新的资源变更信息
  • If-系列的消息头:用于构成条件请求
  • Authorization:用于认证
  • Range:指定所需的部分响应消息体(实体)的长度
  • E-Tag:实体标签(Entity Tag)的简称,可以将实体的数据变更作为元数据管理。
  • Cache:用于控制缓存

6. HTTP状态码

一些典型的状态码:

  • 1XX(通知)

  • 2XX(成功):

    • 200 OK:URI请求成功处理。主要用于GET请求。
    • 201 Created:新建URI的请求成功。主要用于POST请求。
    • 202 Accepted:服务器已接受创建资源的请求,但尚未处理结束。
    • 204 No Contents:服务器已接受请求,但没有返回消息体。
  • 3XX(重定向):

    • 300 Multiple Choices:对于给定的URI,存在多个资源
    • 301 Move Permanently:永久重定向,同时在Location响应消息头中给出新的URI
    • 304 Not Modified:用于协商缓存,URI对应的资源没有更新
  • 4XX(客户端异常):

    • 400 Bad Request:错误请求,出现在请求未定义的API时
    • 401 Unauthorized:认证信息错误
    • 403 Forbidden:访问被拒绝。出现在没有权限访问资源时
    • 404 Not Found:URI对应的资源不存在
    • 405 Method Not Allowed:HTTP方法错误。出现在使用了API不支持的HTTP方法时
    • 406 Not Acceptable:服务器无法满足客户端的要求。出现在Accept系列的请求消息头包含了服务器无法满足的要求时
    • 408 Request Timeout:请求超时
    • 409 Conflict:冲突。出现在更新资源导致处于不一致状态时
    • 429 Too Many Requests:请求次数过多
  • 5XX(服务端异常):

    • 500 Internal Server Error:服务器(云)的内部错误。云端的逻辑问题
    • 502 Bad Gateway:错误的网关。出现在代理服务器的配置有问题时
    • 503 Service Unavailable:服务不可用。出现在云端负载过高时
    • 504 Gateway Timeout:网关超时。通过代理服务器进行处理时请求超时

7. Web API的架构风格

Web API大致可以分为SOAP和REST两种,它们的差异在于消息格式和控制方式的不同。

  • SOAP:SOAP (Simple Object Access Protocol) 是一种基于XML的协议。它使用XML格式来定义消息的结构和内容,因此可以在不同的操作系统和编程语言之间进行通信。然而,SOAP 协议的消息格式比较冗长,可能会导致传输效率低下,同时需要使用额外的协议层来传递消息,增加了系统的复杂性。
  • REST:REST(Representational State Transfer)架构的核心思想是,将Web应用程序的功能作为资源来表示,使用统一的标识符(URI)来对这些资源进行操作,并通过HTTP方法(GET、POST、PUT、DELETE等)来定义对这些资源的操作。这是一种轻量级的Web服务设计模式,它不依赖于XML、SOAP等协议和标准,而是使用简单的HTTP请求和响应来实现资源之间的交互,这使得REST服务在跨平台和跨语言的Web服务中广泛使用。

除此之外,还有一些常见的架构风格:

  • RPC:RPC(Remote Procedure Call)是一种基于请求/响应模式的协议,用于在不同计算机之间进行通信。它将远程方法调用封装成本地方法调用,使得远程调用看起来像本地方法调用。
  • GraphQL:GraphQL是由Facebook开发的一种查询语言,它提供了一种更有效和强大的方式来获取数据。客户端可以精确地请求所需的数据,从而减少了过量数据传输。
  • gRPC,gRPC(Google Remote Procedure Call)是一种高性能、跨平台的RPC框架,支持多种编程语言。它使用Google开源的Protocol Buffers作为数据序列化格式,可以实现快速、可扩展的分布式系统。

8. XML、JSON

Web API中的数据一般采用XML或JSON两种结构化数据格式。

  • XML:用标签来标记数据的标记语言。在云API中,可用的标签需要在云端使用XML Scheme定义。SOAP一般会采用XML作为数据格式。它的特点是标签可以定义得很细致,缺点是语法臃肿,代码量大,现在用得比较少。
  • JSON:JSON是一种基于JavaScript的数据定义格式,它得到了很多编程语言的支持模式一种广泛使用的数据格式。JSON的数据格式也可以通过JSON Scheme在云端定义。

9. cURL、REST Client

  • cURL是一款开源软件,可以通过命令的方式从操作系统发送HTTP请求
  • 还有各种统称为REST Client的浏览器插件,以GUI的方式发送HTTP请求,执行REST操作

ROA

ROA(Resource-Oriented Architecture,资源导向架构)是一种基于REST API的概念并按照以资源为中心的思路使用API的架构。ROA的核心理念是将应用程序中的所有元素视为资源,并通过统一的接口进行访问。

REST的四条原则

REST不是一种协议,而是一种“思路”,它由Roy Fielding的一篇博士论文提出,确定了以下四条REST的原则,结合以资源为中心的API操作场景来看:

  • 用HTTP实现无状态性:可以让服务端重新处理请求,不会在服务端存储正在处理的数据
  • 用URI实现地址的可见性:通过URI可以唯一定位资源
  • 用HTTP方法实现统一的接口:可以控制最终一致性(eventual consistency)
  • 用XML、JSON实现资源间的连通性:可以处理由响应数据触发的事件

基于上述的REST API特性,用户在操作云时需要留意三个概念:

  • 异步:API调用基于HTTP通信过程,在处理时首先要意识到异步
  • 幂等性、重试:由于无状态,只要资源没有发生变化,无论调用多少次,API返回的都是相同的结果。所以即使是跨网络的不稳定处理,也可以通过HTTP错误码加入重试处理并保持元数据的最终一致性。

用户接口:CLI、SDK、Console

云中有四种用户接口,分别是API、CLI、SDK和Console。从本质上来讲,CLI、SDK、Console还是在内部通过API来控制云,只不过对用于隐藏了调用API的过程。

  • CLI:CLI(Command Line Interface,命令行接口)是用于提供命令行的接口。在传统的操作系统环境中,大多数操作要通过命令行完成,在使用Shell或批处理实现自动化的时候也会用到命令行。因此,各个云服务也都提供了CLI。
  • SDK:SDK(Software Development Kit,软件开发工具包)是用各种编程语言控制云的开发工具套件,用于开发用来控制云的应用程序。
  • Console:云服务商的控制台组件,一般都是以Web应用的形式提供给用户。在Console中,我们可以通过GUI控制云。

小结

本章主要是基于DNS和HTTP等互联网技术介绍了构成云的API的机制,了解云API的特性。