写点什么

别再管你的 API 叫微服务了

  • 2018-12-22
  • 本文字数:2469 字

    阅读完需:约 8 分钟

别再管你的API叫微服务了

你有没有听过这句名言:“计算机科学领域只有两个难题,缓存失效和命名”?据说这句话是 Phil Karlton 在 1996 年或 1997 年左右说的。围绕这句格言确实出现了很多带有喜剧色彩的说法,它们也提到了其他的一些问题,但最近我对 API 世界的观察似乎证明了“命名”确实是个大难题:人们对“API”和“微服务”这两个术语存在混淆,有些人似乎已经把它们混为一谈了。


计算世界在不断发生变化。开发人员使用各种概念和技术,并以不同的方式将它们连接在一起。因此,我们使用不一致的术语,用多个术语来描述大致相同的概念,或者用同一个术语表示不同的事物,这些情况并不罕见。


关于 API 和微服务:是的,它们是相关的概念,它们之间存在相互作用,但它们并不是同一种东西。所以,我想直截了当地说出我的看法!

什么是 API?

API 是应用程序编程接口(Application Programming Interface)的缩写。维基百科指出,“总的来说,它是各种组件之间的一组明确定义的通信方法”。它可以是软件框架或库的接口,也可以是操作系统为原生系统软件(如 POSIX)开发人员公开的底层接口。


这也是 API 能够如此令人感到兴奋的一个方面,因为各种开发人员可以利用其他人构建和公开的基础设施来增强其应用程序的附加功能。


现如今,当人们谈论 API 时,他们通常指的是通过 HTTP 端点公开的远程接口。为了区分这些远程 API 和上面提到的本地系统 API,我将用术语“Web API”指代远程 API。(虽然有些人将这个术语用来指代浏览器的本地 API——有点令人困惑,对吧?)


我们通过底层设计范式(如查询、RPC 或 RESTful)或协议(如 SOAP、gRPC 或 GraphQL)进一步对远程 API(或 Web API)进行分类。除此之外,我们还通过目标受众来区分 API,将它们分为公共、合作伙伴或私有/内部 API。

API 的两面性

严格来说,API 仅用来描述接口,也就是客户端和服务器、API 消费者和 API 提供者之间用于交换信息的语言。对于 API 消费者来说,API 只不过是对接口和端点 URL 或 URL 集的描述。URL 是 Web 的基本构建块之一,客户端可以在不知道服务器性质或位置的情况下访问信息或服务。只要客户能够收到响应,它根本不管 URL 是指向隐藏在某个地下室的 Raspberry Pi 还是位于某个大陆数据中心的全球交付网络。这也是 API 能够如此令人感到兴奋的一个方面,因为各种开发人员可以利用其他人构建和公开的基础设施来增强其应用程序的附加功能。


但是,API 提供者不仅要设计、实现和文档化 API,还要考虑它背后的基础设施。在云计算时代,可能不需要购买硬件和租用数据中心。相反,API 提供者可以选择各种“XX 即服务”产品——从虚拟机或容器的托管集群到完全无服务器的代码托管环境。无论选择了什么样的基础设施,他们都需要部署 API。


我这里说的部署 API 是指部署暴露 API 所必需的代码和基础设施。从提供者的角度来看,API 并不是一个神奇的大门,而是需要在某个地方运行的有形资产。而且,随着公司转向微服务架构,这种资产就会变成微服务或一组微服务。

什么是微服务?

微服务是系统或应用程序中的自包含独立组件。每个微服务都应该有明确的作用域和责任,理想情况下,一个微服务只做一件事。它应该是无状态的或有状态的,如果它是有状态的,它应该带有自己的持久层(即数据库),不与其他服务共享。软件开发团队基于微服务架构以更分散的方式开发可重用的独立组件。他们可以为每个微服务使用自定义框架、依赖关系集,甚至是完全不同的编程语言。微服务也有助于实现可扩展性,因为它们本质上是分布式的,并且每个微服务都可以独立增长或复制。

容器和微服务

容器是在操作系统中建立隔离上下文的一种方法。实际上,这意味着它们中的每一个都有一个单独的包含了一组已安装的软件和相关配置的虚拟文件系统。由于它们是相互隔离的,因此任何容器都不能直接访问或影响其他容器或底层宿主操作系统。


创建容器的能力已经成为 Linux 操作系统的一部分,这种能力已经存在了很长一段时间,但直到 2013 年 Docker 的推出,容器才成为一种流行的技术。


当我们在谈论定义时,需要注意的是微服务和容器其实是不一样的东西,但这两个概念经常被放在一起谈论,就像 API 和微服务一样。如果没有容器,要么把服务器配置成可以运行多个微服务,让这些微服务不可避免地相互产生负面干扰,要么每个微服务都需要一个单独的服务器或自己的虚拟机,导致不必要的开销。因此,微服务通常被部署在一组由容器集群软件(如 Kubernetes)管理的一组容器中。可以肯定地说,容器和微服务的崛起其实是相互影响、相互促进的结果。

微服务之间的通信

基于微服务架构构建的应用程序或 API 不仅要把自己完全暴露出来,还需要在内部组件(微服务)之间建立连接。由于每个微服务都可以使用不同的编程语言实现,我们需要依赖标准协议(如 HTTP)来建立微服务之间的连接。这个时候我们就回到了 API 上。


最基本的形式是每个微服务都公开一个 API,让其他服务可以向这个 API 发出请求并获取数据。也可以使用其他不同的方法,比如消息队列。微服务 API 是私有 API,仅限用在单个应用程序中。它通常不提供公共 URL,而是使用组织内部专用网络的私有 IP 或主机名,甚至是单个服务器集群内的 IP 或主机名。不过,这些 API 可以遵循类似公共 API 那样的设计范式或协议。而且,尽管它们的消费者数量有限,也应该遵循开发者体验的基本规则。也就是说,它们应该拥有相关的、一致的、可演化的 API 设计和文档,让其他团队(甚至是你自己)知道如何使用这些微服务。因此,你可以而且应该使用类似的工具来创建你的微服务 API。


当然,与更面向外部的 API 相比,在设计微服务 API 时有不同的侧重点。



微服务和 API 是不同的东西,就像微服务和容器也不是同一种东西一样。不过,这两个概念以两种不同的方式协同工作:首先,微服务可以作为部署内部、合作伙伴或公共 API 后端的一种方法。其次,微服务通常依赖 API 作为与语言无关的通信手段,以便在内部网络中相互通信。开发团队可以使用相似的方法和工具来创建公开 API 和微服务 API。


英文原文:https://blog.stoplight.io/stop-calling-your-apis-microservices-e165a80eba9d


2018-12-22 13:408520
用户头像

发布了 731 篇内容, 共 455.1 次阅读, 收获喜欢 2003 次。

关注

评论 3 条评论

发布
用户头像
有没有一些更好的处理方案?
2019-01-13 11:52
回复
用户头像
大神 我想问一下,微服务拆分的话 实体类如何拆分,根据领域模型各个微服务负责的业务实体放到相应的微服务中,然后服务之间调用传输数据则创建相应的DTO,然后吧这个DTO创建为一个公共的module所有微服务都依赖这个module么?
2019-01-13 11:51
回复
没有更多了
发现更多内容

如何在 WordPress 中创建联系表格?

海拥(haiyong.site)

WordPress 6月月更

Apache DolphinScheduler&TiDB联合Meetup | 聚焦开源生态发展下的应用开发能力

白鲸开源

Apache 大数据 开源 DolphinScheduler workflow

选择广州软件定制开发的10个理由

低代码小观

软件开发 管理软件 企业管理软件 项目管理软件 软件定制

5 年前他的一个设计思路,让 TDengine 时间压缩提升近 50 倍

TDengine

数据库 tdengine 时序数据库

2022年5月国产数据库大事记

墨天轮

数据库 opengauss TiDB 国产数据库 polarDB

【私有云】多云管理平台和私有云是什么关系?能通俗解释一下吗?

行云管家

云计算 私有云 云管平台

程序员自我修炼:《匠艺整洁之道》读书总结

博文视点Broadview

InfoQ 极客传媒 15 周年庆征文|业务中台与B-PaaS的前世今生

小诚信驿站

架构 如何落地业务建模 领域建模 热门活动 InfoQ极客传媒15周年庆

7张图详解域名系统DNS

wljslmz

DNS 域名解析 网络技术 6月月更

EMQ&思岚科技:物联网+AI支援抗疫,“无接触”机器人保障上海方舱稳定运转

EMQ映云科技

物联网 IoT mqtt emq 6月月更

微前端在得物客服域的实践/那么多微前端框架,为啥我们选Qiankun + MF

得物技术

架构 前端 客服 iframe 一站式平台

Windows 系统如何修改 hosts?

甜甜的白桃

windows hosts 6月月更

大数据培训26 个 Spark 高频面试考点

@零度

大数据 spark

本周二晚19:00战码先锋直播丨轻松入门,成为媒体子系统贡献者

OpenHarmony开发者

Open Harmony

C#入门系列(六) -- 分支语句

陈言必行

C# 6月月更

常见滑动窗口实现(Java语言实现)

工程师日月

6月月更

大型物联网平台如何来保障亿级设备安全连接上云?

华为云开发者联盟

物联网 华为云 iotda 大型物联网平台

双重调研测试后,OPPO IoT 类产品开始接入 TDengine

TDengine

数据库 tdengine 时序数据库

本周三晚19:00Hello HarmonyOS进阶课程第6课—短视频应用开发

HarmonyOS开发者

HarmonyOS

四家正规新疆等保测评公司名称、地址详细公布

行云管家

网络安全 等保 新疆 等保测评

【云主机】2022年云主机管理软件排行榜

行云管家

云主机 云服务器 云管

当运行npm install 命令的时候带上ignore-scripts,会发生什么?

华为云开发者联盟

前段

用Golang重写rsync(1):缘起MAC

百家饭隐私计算平台创业者

c golang

【Spring 学习笔记(五)】Spring Bean 作用域和生命周期

倔强的牛角

spring Java EE 6月月更

mass幸运哈希彩竞猜游戏娱乐平台开发技术详解

开发微hkkf5566

故障定位与用户行为分析双向驱动,互联网保险的IT 运维“双保险”

博睿数据

博睿数据 IT运维

使用 Nocalhost 开发 Rainbond 上的微服务应用

北京好雨科技有限公司

Hive参数与性能企业级调优

五分钟学大数据

6月月更

安势信息技术市场总监王峰,OpenChain线上研讨会首秀!

安势信息

Linux 开源 DevSecOps SCA SCA工具

一键部署Java构件到Nexus,同事见了都说好

Jianmu

后端 持续集成 私服 自动化运维 Java构件

NFT+DeFi链游系统开发技术

薇電13242772558

NFT

别再管你的API叫微服务了_架构_Lukas Rosenstock_InfoQ精选文章