一、移动客户端如何访谒这些处事
1.1、客户端与微处事直接通信【很少使用】
从理论上讲,客户端可以直接向每个微处事发送请求。每个微处事都有一个果然的端点(https ://.api.company.name)。该 URL 映射到微处事的负载均衡器,由后者卖力在可用实例之间分发请求。为了获取产品详情,移动客户端将逐一向上文列出的 N 个处事发送请求。
遗憾的是,这种要领存在挑战和局限。问题之一是客户端需求和每个微处事袒露的细粒度 API 不匹配。在这个例子中,客户端需要发送 7 个独立请求。在更庞大的应用措施中,可能要发送更多的请求;凭据 Amazon 的说法,他们在显示他们的产品页面时就挪用了数百个处事。然而,客户端通过 LAN 发送许多请求,这在公网上可能会很低效,在移动网络上就根柢不成行。这种要领还使得客户端代码非常庞大。
客户端直接挪用微处事的另一个问题是,部分处事使用的协议对 web 并不友好。一个处事可能使用 Thrift 二进制 RPC,而另一个处事可能使用 AMQP 动静通报协议。不管哪种协议对付浏览器或防火墙都不够友好,最好是内部使用。在防火墙之外,应用措施应该使用诸如 HTTP 和 WebSocket 之类的协议。
这种要领的另一个错误谬误是,它会使得微处事难以重构。跟着时间推移,我们可能想要变动系统拆分成处事的方法。例如,我们可能合并两个处事,或者将一个处事拆分成两个或更多处事。然而,如果客户端与微处事直接通信,那么执行这类重构就非常困难了。
由于上述三种问题的原因,客户端直接与处事器端通信的方法很少在实际中使用。
1.2、使用 API 网关构建微处事【保举】
凡是来说,使用 API 网关是更好的解决方法。API 网关是一个处事器,也可以说是进入系统的独一节点。这与面向东西设计模式中的 Facade 模式很像。API 网关封装内部系统的架构,并且供给 API 给各个客户端。它还可能还具备授权、监控、负载均衡、缓存、请求分片和打点、静态响应措置惩罚惩罚等成果。下图展示了一个适该当前架构的 API 网关。
Richardson-microservices-part2-3_api-gateway
API 网关卖力处事请求路由、组合及协议转换。客户真个所有请求都首先颠末 API 网关,然后由它将请求路由到合适的微处事。API 网关经常会通过挪用多个微处事并合并功效来措置惩罚惩罚一个请求。它可以在 web 协议(如 HTTP 与 WebSocket)与内部使用的非 web 友好协议之间转换。
API 网关还能为每个客户端供给一个定制的 API。凡是,它会向移动客户端袒露一个粗粒度的 API。以产品详情的场景为例,API 网关可以供给一个端点(/productdetails?productid=xxx),使移动客户端可以通过一个请求获取所有的产品详情。API 网关通过挪用各个处事(产品信息、保举、评论等等)并合并功效来措置惩罚惩罚请求。
Netflix API 网关是一个很好的 API 网关实例。Netflix 流媒体处事供给给成百上千种类型的设备使用,包孕电视、机顶盒、智能手机、游戏系统、平板电脑等等。
最初,Netflix 试图为他们的流媒体处事供给一个通用的 API。然而他们发明,由于各类百般的设备都有本身奇特的需求,这种方法并不能很好地事情。如今,他们使用一个 API 网关,通过运行与针对特定设备的适配器代码,来为每种设备供给定制的 API。凡是,一个适配器通过挪用平均 6 到 7 个后端处事来措置惩罚惩罚每个请求。Netflix API 网关每天措置惩罚惩罚数十亿请求。
二、API 网关
2.1、长处和错误谬误
长处是,它封装了应用措施的内部布局。客户端只需要同网关交互,而不必挪用特定的处事。API 网关为每一类客户端供给了特定的 API,这减少了客户端与应用措施间的交互次数,还简化了客户端代码。
API 网关不敷:需开发、部署和维护的高可用组件。API 网关酿成了开发瓶颈。为了袒露每个微处事的端点,开发人员必需更新 API 网关。API网关的更新过程要尽可能地简单,否则,为了更新网关,开发人员将不得不排队期待。
2.2、实现 API 网关
1》性能和可扩展性
只有少数公司拥有 Netflix 这样的规模,需要每天措置惩罚惩罚每天需要措置惩罚惩罚数十亿请求。不管怎样,对付大大都应用措施而言,API 网关的性能和可扩展性都非常重要。因此,将 API 网关构建在一个撑持异步、I/O 非梗阻的平台上是合理的。有多种差此外技术可以实现一个可扩展的 API 网关。在 JVM 上,可以使用一种基于 NIO 的框架,好比 Netty、Vertx、Spring Reactor 或 JBoss Undertow 中的一种。一个非常风行的非 JVM 选项是 Node.js,它是一个基于 Chrome JavaScript 引擎构建的平台。