写点什么

别再管你的 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:408700
用户头像

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

关注

评论 3 条评论

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

一个cpp协程库的前世今生(二十三)env自动回收

SkyFire

c++ cocpp

Redis:我是如何与客户端进行通信的

华为云开发者联盟

redis 通信 协议 指令 客户端

RavenDB起步--使用 RavenDB Studio

喵叔

TDSQL-C PostgreSQL版的高可用特性

腾讯云数据库

tdsql 国产数据库

TDSQL-A技术架构演进及创新实践

腾讯云数据库

tdsql 国产数据库

为数据库性能调优插上 AI 的翅膀 | 调优测试框架 Matrix 团队访谈

PingCAP

ReactNative进阶(三十一): IoC 框架 InversifyJS 解读

No Silver Bullet

​React Native 1月月更 InversifyJS

鸿蒙轻内核M核源码分析:LibC实现之Musl LibC

华为云开发者联盟

鸿蒙 内存分配 LibC Musl LibC Musl

Netty核心概念之ChannelHandler&Pipeline&ChannelHandlerContext

CRMEB

基于Flink CDC打通数据实时入湖

五分钟学大数据

flink 1月月更

Go 语言快速入门指南:Go 读取文本文件

宇宙之一粟

Go 数据读取 Go 语言 1月月更

架构训练营 毕业设计

dog_brother

「架构实战营」

RavenDB起步--安装以及示例数据库

喵叔

华青融天加入,龙蜥社区再添科技风险监测领域新伙伴

OpenAnolis小助手

Linux 开源 合作伙伴

RavenDB起步--客户端API(一)

喵叔

为什么ConcurrentHashMap是线程安全的?

王磊

20000字详解大厂实时数仓建设 | 社区征文

五分钟学大数据

数据仓库 实时数仓 1月月更 新春征文

智联生活行业加速器热门FAQ:物联网企业该如何与华为云合作?

华为云开发者联盟

物联网 华为云 智联生活 智联生活行业加速器 云市场

MySQL 如何解决幻读(MVCC原理分析)

Ayue、

MySQL InnoDB 1月月更

1月月更|推荐学java——Spring事务

逆锋起笔

spring事务管理 spring ioc java 编程 Spring Java Spring事务

TDSQL PostgreSQL执行计划详解

腾讯云数据库

tdsql 国产数据库

看过来!腾讯文档上架优麒麟软件商店啦

优麒麟

Linux 开源 腾讯 操作系统 麒麟操作系统

架构实战营模块六作业

Jude

架构实战营

模块1作业

卡西毛豆静爸

架构实战营

事件驱动架构在 vivo 内容平台的实践

vivo互联网技术

微服务 云原生 事件驱动架构

分享四款H5怀旧小游戏魔塔+伏魔记+三国霸业+寻仙纪

echeverra

前端 游戏

中科柏诚:积极践行为中小企业服务宗旨,同乡村振兴有效衔接

联营汇聚

第四节:SpringBoot中web模版数据渲染展示

入门小站

springboot

在线XML转JSON工具

入门小站

工具

一、数据结构

喵叔

RavenDB起步--第一个 RavenDB 程序

喵叔

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