手记

微服务架构之API Gateway

微服务架构中, 这样情况是常见的,那就是某个页面需要使用到很多的微服务, 例如,一个电子商务网站上产品详情页,应该就可能用到的微服务如下:

  1. 购物车微服务
  2. 订单微服务
  3. 目录微服务
  4. 库存微服务
  5. 物流微服务
  6. 推荐系统微服务
    那么,我们移动的客户端怎么访问这些微服务呢? 下面细细讲来.
  1. 直接调用和通信

理论上来说,这样做是可行的.因为,每个微服务都有对应的API.
不幸的是,这个选项存在挑战和限制。一个问题是客户端的需求与每个微服务公开的细粒度api之间的不匹配。本例中的客户端必须发出6个单独的请求。在更复杂的应用程序中,可能需要做更多。例如,Amazon描述了在呈现产品页面时如何涉及到数百个服务。虽然客户端可以通过LAN发出那么多请求,但它在公共Internet上的效率可能太低,在移动网络上肯定是不切实际的。这种方法还使客户端代码更加复杂.

客户端直接调用微服务的另一个问题是,有些服务可能使用不适合web的协议。一个服务可能使用Thrift二进制RPC,而另一个服务可能使用AMQP消息传递协议。这两种协议对浏览器和防火墙都不是特别友好,最好在内部使用。应用程序应该在防火墙之外使用HTTP和WebSocket等协议。

这种方法的另一个缺点是,它使重构微服务变得困难。随着时间的推移,我们可能希望更改将系统划分为服务的方式。例如,我们可以合并两个服务或将一个服务拆分为两个或多个服务。但是,如果客户端直接与服务通信,那么执行这种重构就会非常困难。

  1. 使用API Gateway

通常,更好的方法是使用所谓的API Gateway。API Gateway是一个服务器,它是系统的单一入口点。它类似于面向对象设计中的立面模式。API Gateway封装了内部系统体系结构,并提供了适合每个客户端的API。它可能具有其他职责,如身份验证、监视、负载平衡、缓存、请求形成和管理以及静态响应处理。
下图显示了API Gateway通常是如何适应体系结构的:


API Gateway负责请求路由、组合和协议转换。所有来自客户端的请求首先通过API Gateway。然后它将请求路由到适当的微服务。API Gateway通常通过调用多个微服务并聚合结果来处理请求。它可以在内部使用的web协议(如HTTP和WebSocket)和web不友好协议之间进行转换

API Gateway还可以为每个客户端提供自定义API。它通常为移动客户端公开粗粒度API。例如,考虑产品详细信息场景。API Gateway可以提供一个端点(/productdetails?productid=xxx),使移动客户端能够通过一个请求检索所有产品细节。API Gateway通过调用各种服务(产品信息、建议、评论等)并结合结果来处理请求。

Netflix 是使用API Gateway的一个成功案例, Netflix流媒体服务可以在数百种不同的设备上使用,包括电视、机顶盒、智能手机、游戏系统、平板电脑等。最初,Netflix试图为其流媒体服务提供一种一刀切的API。然而,他们发现,由于设备的多样性和他们独特的需求,它并不能很好地工作。今天,他们使用一个API Gateway,通过运行特定于设备的适配器代码为每个设备量身定制API。适配器通常通过平均调用6到7个后端服务来处理每个请求。Netflix API Gateway每天处理数十亿个请求。

  1. API Gateway的优缺点

使用API Gateway的一个主要好处是它封装了应用程序的内部结构。客户端不需要调用特定的服务,只需与网关通信即可。API Gateway为每种客户端提供特定的API。这减少了客户端和应用程序之间的往返次数。它还简化了客户端代码。
API Gateway也有一些缺点。它是另一个必须开发、部署和管理的高可用性组件。API Gateway也有成为开发瓶颈的风险。开发人员必须更新API Gateway,以便公开每个微服务的端点。重要的是,更新API Gateway的过程要尽可能轻量级。否则,开发人员将被迫排队等待更新网关。尽管有这些缺点,但是对于大多数实际应用程序来说,使用API Gateway是有意义的。

  1. API Gateway, 开源的借鉴

目前社区的关于 API Gataway 的项目有以下这些:
Tyk:Tyk是一个开放源码的API网关,它是快速、可扩展和现代的。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。Try 是一个基于Go实现的网关服务。
Kong:Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。
Orange:和Kong类似也是基于OpenResty的一个API网关程序.
Netflix zuul:Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
apiaxle: Nodejs 实现的一个 API 网关。
api-umbrella: Ruby 实现的一个 API 网关。

目前来看Kong和Netflix zuul表现比较抢眼.

4人推荐
随时随地看视频
慕课网APP