Web应用在防火墙内部运行,它们通过高带宽、低延迟的局域网访问服务。其他客户端在防火墙之外运行,通过较低带宽、较高延迟的互联网或移动网路访问。
移动应用程序扮演API组合器的角色,调用多个服务并组合结果,存在如下问题:
web应用程序
web应用程序直接访问后端服务是可以的
基于浏览器的JavaScript应用程序
与移动应用程序具有相同的网络延迟问题,且可能需要组合更多的服务。
第三方应用程序
同样存在API组合低效的问题,但更大的问题是第三方开发人员需要一个稳定的API,API旧版本可能需要永远维护。
直接访问服务的API客户端会导致很多问题,更好的方法是API Gateway,即实现一个服务,该服务是外部API客户端进入基于微服务应用程序的入口点,
它负责:
API Gateway的架构
具有分层模块化架构,如API层和公共层,API层由一个或多个独立的API模块组成。每个API模块为特定客户端实现API。公共层实现共享功能,如边缘功能。
API Gateway的所有者模式
API Gateway若由一个单独团队维护,这种集中式的瓶颈与微服务架构理念背道而驰。
更好的方法或许是让客户端团队拥有他们的API模块,而API Gateway团队负责开发公共模块和API Gateway的运维。部署流水线必须完全自动化。
使用后端前置模式
API Gateway的职责不明确。后端前置模式为每个客户端定义一个单独的API Gateway。每个客户端团队都拥有自己的API Gateway。API Gateway团队拥有共享层。
好处
客户端不必调用特定服务,而是与API Gateway通信,减少往返次数,简化了代码。
弊端
存在成为开发瓶颈的风险。开发人员必须更新API Gateway才能对外公开服务的API。更新过程要尽可能轻量化,必要时使用后端前置模式。
性能和可扩展性
所有的外部请求必须首先通过API Gateway。影响性能和可扩展性的关键设计决策是API Gateway应用使用同步还是异步I/O
异步(非阻塞)I/O模型没有多个线程开销,更具扩展性,但编程模型复杂得多。
选择哪种取决于API Gateway的请求处理逻辑特性。如是I/O密集型还是CPU密集型。
使用响应式编程抽象
按顺序调用服务,服务响应时间过长,尽可能同时调用所有服务,但编写可维护的并发代码存在挑战。可使用响应式方法,如CompleteFutures、Monos、RxJava等。
处理局部故障
方法:
1、多实例,负载均衡
2、断路器模式
和其他服务一样,必须实现整个架构中选择的各种模式
可以选择AWS API Gateway,AWS Application Load Balancer等,这些产品实现了边缘功能和强大的路由功能,但不支持API组合。
开发API Gateway更好的起点时使用满足如下要求的框架:
Netflix Zuul
处理路由和边缘功能。可定义实现API组合的Spring MVC控制器扩展Zuul,但Zuul只能实现基于路径的路由(不支持请求方法)。
Spring Cloud Gateway
它属于响应式Web框架,构建在Project Reactor之上(基于NIO的JVM响应式框架)。支持以下操作:
包含以下包:
实现支持多种客户端的REST API的API Gateway非常耗时,你可能需要考虑使用基于图形的API框架,如GraphQL。
API由映射到服务的基于图形的模式组成,客户端发出检索多个图形节点的查询。基于查询的API框架通过从一个或多个服务检索数据来执行查询。
基于GraphQL(一种标准)的API Gateway可使用Node.js Express Web 框架和Apollo GraphQL服务器,用js编写。
它可以由三部分组成:
执行GraphQL
使用GraphQL的主要好处是它的查询语言为客户端提供了对返回数据的令人难以置信的控制。客户端通过向服务器发出包含查询文档的请求来执行查询。简单情况下,查询文档包含查询的名称,参数值及要返回结果的对象字段。
把模式连接到数据源
当GraphQL服务器执行查询时,必须从一个或多个数据存储中检索所请求的数据。通过将解析函数附加到模式定义的对象类型字段,可以将GraphQL模式与数据源相关联。GraphQL通过调用解析器函数检索数据,以此实现API组合模式。
GraphQL通过递归调用Query文档中指定的字段解析器函数来执行查询。首先,它执行查询解析器,然后递归调用结果对象层次结构中字段的解析器。
使用批处理和缓存优化负载
批处理将N个调用转换为服务,变成单个调用,该调用将检索一批N个对象。缓存会利用先前获取的同一对象结果,以避免不必要的重复调用。
为了让客户端调用GraphQL,你需要将它与Web框架集成,如Express Web