查看原文
其他

API管理和服务网格——为什么说服务网格无法替代API管理

Joaquim Moreno 几米宋 2022-09-06

原文地址:https://itnext.io/api-management-and-service-mesh-e7f0e686090e 作者:Joaquim Moreno 译者:王全根

首先声明,我在RedHat工作,确切得说,是在3scale团队开发3scale API管理解决方案。最近,在跟我们的客户讨论时有个问题被越来越多的提及: 使用了Istio之后,为什么还需要API管理?

为了回答这个问题,我们首先要搞明白服务网格和API管理究竟是什么,剧透一下:3scale API Management和Istio可以共存。

让我们聚焦于3scale API Management和Istio Service Mesh(这两者是我比较了解的),我会尽量描述清楚这两个方案的目标是解决哪些问题。

API Management解决方案是什么?

我们先看一下Wikipedia的定义: API管理的过程包括创建和发布WebAPI、执行调用策略、访问控制、订阅管理、收集和分析调用统计以及报告性能。

这是一个清晰的定义。作为一家已经创建了一系列内部Service的公司,我现在希望通过向外部订阅者提供API的方式构建业务。当然,我会通过提供一些订阅计划来量化它,包括使用限制、范围,并且可以自动的给客户提供账单。

此外,外部开发者可以很容易地发现我提供的API,并使用他们的信用卡以自服务的方式注册订阅计划,而这一切,对我的API代码来说应该是透明的。

分析过这些需求之后,我们可以把它们归为以下几类:

  • 访问控制和安全:控制谁可以访问我的API,以及以何种方式访问。

  • API契约和流量限制:一位用户在一次订阅的情况下可以调用多少次请求。

  • 分析和报告:API运行情况怎么样?哪些方法被调用的最为频繁?有没有错误?API调用的趋势是什么?

  • 开发者门户,文档:让开发者发现你的API并注册订阅计划。

  • 账单:提供发票并向开发者收取费用。

API管理方案是如何做到这些的?这要得益于一个叫做API Gateway的组件。

这是一个位于调用流程中间环节的组件,所有客户端请求都会经过它,它能够保护你的API端点,并通过与其他API Management组件通信来决定是否让一个用户访问的你的API。

它一般是通过对用户请求进行身份识别和流量控制来实现的。考虑下面这个场景:

  • 用户A订阅了 BasicPlan

  • BasicPlan定义了一些API操作(HTTP Method + HTTP path)的限制,例如: Get/products和 POST/shipments

  • 这些限制可以被定义成每秒/分钟/月等等。

  • GET/Products可以被限制成每分钟请求10次。

在这种情况下,当用户A想在1分钟内调用10次以上时,超出的请求就会因为流量控制而收到429状态码。或者身份验证没有通过,用户就会收到403(Forbidden)状态码。身份识别可以通过Oauth、请求参数或者header来提供。

流量控制是API Management的关键部分。这也是API Gateway针对最终用户执行业务规则的部分,流量控制可以实现非常复杂的场景,比如基于多条规则或客户端IP。API Management之所以强大,在于它可以满足复杂流量控制场景(业务规则)的能力。

因此,我可以大声地说: APIManagement不(仅仅)是流量限制。

Service Mesh是什么?

前面我们讲了API,却没有提及Service、Application、Port、Connection、Retry等等,因为在API Management层,我们不需要关心这些。但是现在我们需要了。

API的背后是什么?多个互相通信的Service,它们之间的交互组成了一个完整的API,每个Service可能由不同的编程语言实现,并且由同一个庞大组织内的不同地区的不同团队进行维护和操作。这听起来耳熟吗?对,微服务!

一个完整的API,由多个Service共同完成,这听起来很棒,但是随着越来越多的团队为新特性或新需求发布新的Service,日渐增长的架构运维复杂度问题就会暴露出来:

  • 如果Service之间的内部调用失败了会发生什么?

  • 请求失败发生在哪里?

  • 为什么这个API端点这么慢?哪个Service有问题?

  • 这个Service真的容易出错,我们可以在出错的时候重试吗?

  • 某人总是在每天的同一时刻大量请求这个Service,我们需要通过流量限制避免它。

  • 这个Service不可以访问到另一个Service......

这些问题可以由Service Mesh解决,并归为以下类别:

  • 弹性:超时、重试、熔断、故障处理、负载均衡。

  • 流量限制:基于多个来源的基础设施流量限制。

  • 通信路由:根据path、host、header、cookie base、源Service......

  • 可观测性:指标、日志、分布式追踪。

  • 安全:mTLS、RBAC......

所有这些都是以对Application透明的方式执行的。

我们来看一下Istio是如何工作的:

Istio使用 sidecar容器模式,通过在同一个Pod中运行一个新增的容器实例来扩展核心容器的功能。这个核心容器就是我们的Application,而Sidecar容器,是Istio基于Envoy的代理。

如上图所示,注入之后,所有的出入Application容器的通信,都将被这个代理劫持(使用IPTables)。

通过这种方式,Istio就能控制通信,以及向控制平面报告发生了什么。确切来说,是报告给作为遥测和策略引擎的Mixer。

它们之间的共同点是什么?

我们已经明确了这两种技术,你发现了什么共同点?它们试图解决不同的问题,但是使用的是相同的技术......

这两个方案有一点共同之处:

但是记住这一点很重要,它们的流量限制分别用来处理不同的事务:业务规则和基础设施之间的限制。

因此,它们并不是互斥的,我们应该把它们当做基础设施的不同层面:

  1. API Management:处理对API的访问,基于开发者、订阅计划、Application、账单等等。

  2. Service Mesh:让你的API变得更安全,便于监控,以及弹性能力。

我们如何将3scale API Management和Istio Service Mesh结合起来?

3scale是如何将API Management的能力添加到Istio Service Mesh的?请继续关注我们更多的技术发布,你可以使用我们的API Gateway APIcast或者使用3scale Istio Adapter原生地扩展Istio。

点击【阅读原文】跳转到ServiceMesher网站上浏览可以查看文中的链接。

相关阅读

8款开源的Kubernetes Ingress Controller/API Gateway推荐

Kong 1.0发布,从网关转型为服务控制平台

论服务网格的控制平面和边缘代理的重要性

为什么你应该关心Istio gateway

容器、服务网格和 API 网关:从边缘开始

  • SOFAMesh - https://github.com/alipay/sofa-mesh 基于Istio的大规模服务网格解决方案

  • SOFAMosn - https://github.com/alipay/sofa-mosn 使用Go语言开发的高性能Sidecar代理

合作社区

参与社区

以下是参与ServiceMesher社区的方式,最简单的方式是联系我!

  • 加入微信交流群:关注本微信公众号后访问主页右下角有获取联系方式按钮,添加好友时请注明姓名-公司

  • 社区网址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀请才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文档进度追踪:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章线索与投稿:https://github.com/servicemesher/trans


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存