你有没有听过这句名言:“计算机科学领域只有两个难题,缓存失效和命名”?据说这句话是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

别再管你的API叫微服务了相关推荐

  1. grpc入门到精通_gRPC[go语言]大师教程,构建现代化Api和微服务

    gRPC [Golang] Master Class Build Modern API & Microservices gRPC[go语言]大师教程,构建现代化Api和微服务 比REST AP ...

  2. java api gateway_微服务中的 API 网关(API Gateway)

    背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest ...

  3. .NET Core:通过Web API进行微服务交互

    目录 介绍 命名协议 MicroCommerce应用程序结构 MicroCommerce应用开发 1.接口项目,微服务接口和模型类 2. ProductCatalog项目 3. ShoppingCar ...

  4. Kubernetes原生api部署微服务5-监听Pod

    我们使用Client-go中的informer来监听用户微服务与文章微服务的Pod. Informer代替Controller去访问k8s-apiserver,而Controller的所有操作(如:查 ...

  5. 认证鉴权与API权限控制在微服务架构中的设计与实现

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现. 1. 背景 最近在做权限相关服务的开发, ...

  6. 认证鉴权与API权限控制在微服务架构中的设计与实现(一)

    作者: [Aoho's Blog] 引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现. 1. ...

  7. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...

  8. Spring Cloud与微服务学习总结(3)——认证鉴权与API权限控制在微服务架构中的设计与实现(一)

    本文转载自(http://blueskykong.com/2017/10/19/security1/) 1. 背景 最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安 ...

  9. api postmain 鉴权_认证鉴权与API权限控制在微服务架构中的设计与实现(一)

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现. 1. 背景 最近在做权限相关服务的开发, ...

最新文章

  1. Android动画曲线库AndroidEasingFunctions
  2. Java的一维数组和二维数组的关系
  3. 黄章谈魅族5G手机计划:明年推出 后年终端才算成熟
  4. MNIST机器学习入门(二)
  5. vscode extension
  6. RNN, Seq2Seq, Attention注意力机制完全解析
  7. 漫画 | 硬核技术预测你有没有女朋友
  8. 【图像隐写】基于matlab LDPC编码译码改进DCT水印嵌入提取【含Matlab源码 832期】
  9. visio 连接线样式设置 如箭头线
  10. oracle查看锁表语句、解锁方法
  11. 论文解读 | 百度 ERNIE: Enhanced Representation through Knowledge Integration
  12. 基于三点说构成的夹角提取特征点
  13. 路由器、交换机设备管理
  14. 国庆假期都干了些啥?
  15. 在线教育平台、网校搭建、远程教育平台搭建技术选型(268教育)
  16. 大数据和java就业前景_Java大数据应用领域及就业方向
  17. 敲代码时如何快速移动光标_HTML网页代码大全
  18. oracle系统资源,oracle占用系统资源很高sqlplus无响应
  19. 普华永道:2018年全球信息安全状况调查分析报告
  20. 港科夜闻|香港科大陈家强教授:经济体竞争非零和游戏

热门文章

  1. python自动发邮件运行正常就是收不到邮件是为什么_python stmp module 163邮箱发送邮件不成功...
  2. oracle存储过程 ppt,oracle_存储过程培训(动画版本)详解.ppt
  3. hello.cpp 第一个C++程序(本博客没有特指都是以QT测试)
  4. 通过ProGet搭建一个内部的Nuget服务器
  5. android是32-bit系统还是64-bit系统
  6. 批处理系统和分时系统各具有什么特点?为什么分时系统的响应比较快?
  7. 海文考研名师做客新浪解析2007心理学考试大纲
  8. dayjs也可回显AntD DatePicker的值
  9. vue调用百度地图API
  10. 递归函数实现二分查找法