写点什么

API 已死,APIs 万岁

  • 2020-01-06
  • 本文字数:3417 字

    阅读完需:约 11 分钟

API已死,APIs万岁

在本文中,作者将重点介绍 REST API 的统治地位是如何衰退的,以及生态系统是如何走向民主的。API Is Dead – Long Live the APIs!

历史背景

正如我之前在博客中所描述的那样,在一个企业内部,随着时间的推移,技术会分层部署。许多较老的技术仍然能带来价值,使其远未过时。考虑到尽管许多企业正在经历数字化转型,但它们的旧层和深层中所包含的技术和相关数据仍然具有价值。不能简单地将它们移除,因为毕竟是在下面的层才能为放置新柱子奠定基础。这些层中的许多通常都具有遗留接口,如 CORBA、RMI、SOAP 等。


那么,为什么我们要在层上继续添加层呢?如果以古生物学家的身份来探讨这个问题,我们会采集一个核心样本,分析每一层;针对技术也可以来尝试这个方法,并深入到各个层次。每一层都代表一个历史视图,在最顶层 / 最外层,我们可以找到 REST,它是当今最普及的技术。就在 REST 之下,我们会遇到面向服务架构(Service Oriented Architecture,SOA)层。停下来思考下,为什么 REST 取代了 SOA ?虽然原因有很多,但可以说最主要的原因是 REST 极大地简化了客户端可访问性的问题,使用 REST,可以交换的是 JSON 而不是 XML,从而简化了在浏览器中的使用。


此外,REST 还有一个简化的方法,其动词 GET、PUT、POST 等允许使用简单的通用工具,比如 cURL 和 Postman。几乎用任何语言创建自己的客户端都非常简单。

另一方面

虽然该协议与平台无关,但是 SOAP 使用 XML,这使得在浏览器中使用它变得冗长而痛苦。此外,由 WS-* 标准增加的复杂性层意味着编写服务器端很容易,但编写客户端却很痛苦。客户端实现需要使用第三方工具以我们所选择的语言来生成客户端代码,这会产生繁重的依赖关系。


当我们深入研究技术层时,我们会发现类似的情况。SOAP 曾经也是王者,它取代了 CORBA 和 RPC 等技术。REST 从 SOAP 那里夺走了王位,而今天,REST 的王位正受到来自民主呼声的挑战。


谁是能从 REST 手中夺取王位的挑战者呢?有几个有追求的人在觊觎 REST 的王位。这些人可以分为三类:“服务器到客户端”、“基于事件”或“数据访问”家族。就像在《权力的游戏》中一样,挑战者可以按照他们的家族血统来划分(House Targaryen、House Lannister、House Stark 等)

“反向 API”家族:The House of “Reverse API”

这个家族的标志是电话,既是服务器调用客户端,而不能反过来调用。


Webhooks:Webhooks 有时被称为“反向 API”,因为调用的发起方是服务器而不是客户端;服务器将状态变更通知客户端。客户端应用程序注册一个回调 URL,当服务器上的资源发生状态变更时,就可以访问该 URL。客户端应用程序将收到状态变更的 HTTP 负载通知。Webhooks 是一种流行的基于事件的机制,该机制可以在网上找到(GitHub、Stripe、Twilio)。它们不是银弹,因为它们不提供有保证的交付,很少重试,可能会不同步,并且在事件量很大时(可能需要反压机制) 会给客户端带来很大的压力。


WebSocket:WebSocket 是一种传输协议,它通过一个 TCP 套接字连接在服务器和客户端之间建立一个持久的双向通信通道。当服务器到客户端或客户端到服务器需要近实时交换时,WebSocket 是一个不错的选择。这克服了 HTTP 请求 / 响应机制的限制(例如客户端轮询及相关的开销)。WebSocket 适用于需要实时更新的应用程序,因为服务器可以在连接上随时推送数据。所有现代浏览器都支持 WebSocket。


SSE: 服务器发送事件(Server-Sent Events,SSE)是一种服务器推送技术,它允许客户端通过带有内置自动重连机制的 HTTP 连接接收来自服务器的自动更新。服务器发送事件 EventSource API 作为 HTML5 的一部分被进行了标准化。SSE 是通过传统 HTTP 发送的,这意味着它不需要特殊的协议或服务器实现即可正常工作。另一方面,WebSockets 需要全双工连接和新的 Web Socket 服务来处理协议。SSE 适用于不需要从客户端发送数据,但需要通过某些服务器操作进行更新(例如股票行情、共享设施更新、好友状态更新等)的场景。

“事件驱动”家族:The House of “Event-Driven”

这个家族的标志是 Kafka 图标,因为它是“事件驱动”的主导者。


这个家主要由三个字符组成,即两个基于提交日志 Apache Kafka 和 NATS 的消息传递系统,以及 RabbitMQ 的消息队列。这些技术已经成为基于异步事件的微服务架构的实际支柱。基于事件消息传递的架构会导致服务之间的极度松散耦合,这对于事件驱动系统非常有用。在这些架构中,诸如 CQRS(命令查询职责分离)和事件源等不同的设计模式非常流行。因为 JSON 太冗长,发送到队列的消息使用 Proto Buf、Avro 或 Thrift 定义,事件将被内部微服务消费。


由于基于事件的系统是异步的,因此系统本身将具有最终一致性。这导致开发人员不得不处理服务之间的不一致数据。根据所使用的消息传递主干,可能必须考虑接收重复事件、无序事件或丢失事件(保证交付)的处理。与传统的 REST API 相比,可用于基于事件的开发(设计、调试、测试、监控)工具更加不成熟。


有两个新兴项目值得跟踪和投入:


  • 由云原生基金会(Cloud Native Foundation,CNCF)孵化的 CloudEvents 项目正在尝试定义与供应商无关的事件格式,以便在不同的云系统之间进行转换。

  • AsyncAPI 的目标是使事件驱动的架构更简单,并且像 REST API 一样为开发人员所熟悉,它将包括文档、代码生成、发现和事件管理。

gRPC 家族:The House of gRPC

gRPC 的名称中包含了一些线索;“g” 来自 Google 和 RPC,因为它是为远程过程调用(RPC)而设计的。这是 CNCF 的一个顶级项目。gRPC 通常在组织内部使用(即在微服务架构中),这样我们可以控制消费者和提供者。因为它使用了 HTTP 2.0,gRPC 相较于传统的 HTTP 1.1 REST 调用有较高的性能。服务定义是使用了 Proto Buf ,由此,可以用多种语言生成客户端和服务端存根。gRPC 支持双向流和可插拔的身份验证机制。

“GraphQL”家族:The House of “GraphQL”

GraphQL:GraphQL API 适用于移动应用程序,并且有助于避免使用 REST API 时出现的闲聊问题。借助 GraphQL,客户端可以确定它们所需的数据、所需怎样的数据以及所需的数据格式,而无需遍历多个 REST 请求 / 响应来查找应用程序所需的资源。这将减少调用客户端所需建立的网络连接次数,并确保它们只检索所需的数据。如果客户端是移动应用程序或单页应用程序(single-page application,SPA),则可以提供更好的用户体验。2015 年,Facebook 公开发布了 GraphQL 规范和参考实现。但今天,GraphQL 的管理工作由 GraphQL 基金会负责。


为什么说GraphQL是API的未来?

“OData”家族:The house of “OData”

OData:OData(开放数据协议)是一个 OASIS 标准,它定义了构建和使用 RESTful API 的最佳实践。它最初是由微软在 2007 年开发的。OData 是 HTTP、REST 和 JSON 之上的一组通用约定。如果采用这些约定,则意味着 API 提供者最终将以一种标准且一致的方式来处理诸如查询、分页、排序和过滤 API 之类的问题。正是由于这些约定,如果我们看到了一个 OData 服务,那么我们也就看到了所有服务,并且实现消费应用程序变得更加容易。OData API 经常出现在运行 Microsoft 和 SAP 服务的生态系统中。

“IoT”家族:The House of “IoT”

鉴于物联网设备的爆炸性增长,这个家族牢牢地坐落在亿万富翁俱乐部里。


MQTT(消息队列遥测传输): 是一种基于发布 - 订阅的 ISO 标准消息传递协议。它在 TCP/IP 协议之上工作。设计它是用于与需要“小代码占用”的远程位置的连接或我们需要限制网络带宽的情况。因此,对于带宽昂贵且所需开销最小的嵌入式系统等客户端来说,它是一种完美的协议。


AMQP(高级消息队列协议) 是异步通信中最流行的协议之一。RabbitMQ 和 ActiveMQ 是一些流行实现,或者有像 AWS MQ 这样的托管解决方案。AMQP 是面向消息中间件的开放标准应用层协议。AMQP 的主要特点是消息定向、排队、路由、可靠性和安全性。与 MQTT 相比,AMQP 具有更多特性,因此,它更适合在需要更高处理和内存要求的客户端系统上运行。因此,它被视为一个相当繁重的协议,在物联网的传感器 / 嵌入式世界中不能很好地发挥作用。

结论

正如本文所示,REST API /Services 的君主统治已经过去了。所需的 API 技术生态系统将专用于消费客户端应用程序的需求。生态系统中不会只有一个赢家,而是有许多赢家,这取决于客户所需的经验。没有一项技术会永远坐上王位上,这是一种民主,客户决定将由谁来代表他们!


API 已死了——API 万岁!


API is dead,long live the APIs


2020-01-06 12:0012475
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 399.1 次阅读, 收获喜欢 1985 次。

关注

评论 1 条评论

发布
用户头像
垃圾文章,MQTT跟API完全是两码事,东拉西扯凑拼的文章。另外,通常喊万岁的,都死得比较早。与译者无关。
2020-01-17 09:10
回复
没有更多了
发现更多内容

本来无一物,何处惹尘埃|靠谱点评

无量靠谱

Boss直聘转发超90W次,Java面试突击手册 火遍全网,却遭封杀

Java架构师迁哥

教学相长,物联网赋能教育数字化!

IoT云工坊

人工智能 物联网 智慧校园 智慧教室 智慧操场

5分钟速读之Rust权威指南(二十一)闭包

wzx

rust

公安合成作战指挥系统解决方案,警务实战指挥系统

员工提出离职就消极怠工怎么办?

石云升

员工离职 职场经验 管理经验 6月日更

阿里大佬离职带出内网专属“高并发系统设计”学习笔记

Java架构师迁哥

亮相智源大会,字节跳动自研同传系统的技术实现

字节跳动技术团队

【案例】星环科技助力华夏基金大数据平台建设

星环科技

高并发场景创建JedisPool有哪些注意事项?

BUG侦探

并发 Jedis commons-pool

字节跳动Java岗6月9号一面经验分享

北游学Java

Java 字节跳动 面试

极狐(GitLab)开课了!实践进阶五步走,助你成为DevOps专家

极狐GitLab

DevOps

【FlinkSQL】Flink SQL Query(三)- Join

Alex🐒

flink 翻译 FlinkSQL flink1.13

Linux系统日常定位常用指令

正向成长

linux命令

书山有路,学海无涯|靠谱点评

无量靠谱

花了60天的时间肝出了这些spring,jvm,并发编程等学习笔记,春暖花开再战大厂!

Java架构师迁哥

从零开始学习3D可视化之场景层级(2)

ThingJS数字孪生引擎

大前端 可视化 数字孪生

并发编程-AQS介绍和原理分析(上)

追风少年

并发编程 AQS

股价预测的基本思路(1)

Qien Z.

6月日更 量化投资 股价预测

百分点数据科学实验室:烟草行业市场信息采集数据质量评估体系研究探索

百分点大数据团队

【得物技术】浅尝UI自动化之Airtest实践

得物技术

自动化 测试 UI 自动化测试 测试落地

Webpack 简介

编程三昧

JavaScript 大前端 Node webpack 构建工具

周小川:一些加密货币已经不太可能再回到支付领域

CECBC

又到一年“粽子节”,快来测测你包的粽子颜值几分

华为云开发者联盟

端午节 华为云 modelarts 粽子

百分点科技助力中国环境监测总站“生态环境质量会商平台”上线

百分点大数据团队

洞察 | 企业数字化转型费用高昂?低代码“骨折”给你!

优秀

低代码

干货|一款实用iOS云真机的技术架构是如何搭建的?

ios

网络攻防学习笔记 Day41

穿过生命散发芬芳

网络攻防 6月日更

WWDC21: Swift 5.5 新特性解读

阿里巴巴大淘宝技术

swift WWDC21

C++内存访问错误检测

正向成长

内存泄露 内存溢出 Asan

《原则》(十一)

Changing Lin

6月日更

API已死,APIs万岁_架构_David Mckenna_InfoQ精选文章