内容总结自《微服务架构设计模式》
1、移动客户端的API设计难题
在此设计中,移动应用程序扮演着API组合器的角色。它调用多个服务并组合结果。尽管这种方法看似合理,但它有几个严重的问题。(虽然书中说这合理,不会真的有微服务架构是这样设计的吧?好呆呀)
2、Web 应用程序的API设计难题
传统的服务器端Web应用程序处理来自浏览器的HTTP请求并返回HTML页面,在防火墙内运行并通过局域网访问服务。网络带宽和延迟不是在Web应用程序中实现API组合的障碍。此外,Web应用程序可以使用非 Web友好的协议来访问服务。开发Web应用程序的团队是同一组织的一部分,并且经常与编写后端服务的团队密切合作,因此无论何时更改后端服务,都可以轻松更新Web应用程序。因此,Web应用程序直接访问后端服务是可行的。
3、基于浏览器的JavaScript应用程序的API设计难题
现代浏览器应用程序使用一些JavaScript。即使HTML 主要由服务器端Web应用程序生成,但在浏览器中运行的JavaScript通常会调用服务。
一方面,当服务API发生变化时,基于浏览器的JavaScript应用程序很容易更新。另一方面,通过互联网访问服务的JavaScript应用程序与移动应用程序具有相同的网络延迟问题。更糟糕的是,基于浏览器的用户界面,尤其是桌面用户界面,通常比移动应用程序更复杂,需要组合更多服务。
4、为第三方应用程序设计API
第三方应用程序通过互联网访问API,因此API组合可能效率低下。但是,与设计第三方应用程序使用的API面临的更大问题相比,API组合的低效率是一个相对较小的问题。因为第三方开发人员需要一个稳定的API。
很少有组织可以强制第三方开发人员升级到新的API。具有不稳定API的组织可能会使开发人员加入竞争对手阵营。因此,你必须仔细管理第三方开发人员使用的API的演变。通常你必须长时间维护旧版本(可能永远)。
这个要求对组织来说是一个巨大的负担。让后端服务的开发人员负责维护长期的后向兼容性是不切实际的。组织应该拥有一个由独立团队开发的独立公共API,而不是直接向第三方开发人员公开服务的API。
其实就是抽一层,将前端的组合逻辑抽到统一的一层,这一层就是API Gateway层
API Gateway负责请求路由、API组合和协议转换。来自外部客户端的所有API请求首先转到APl Gateway,后者将一些请求路由到相应的服务。API Gateway使用API组合模式处理其他请求,调用多个服务并聚合结果。它还可以在客户端友好的协议(如HTTP和WebSockets)与客户端不友好的协议之间进行转换。
特点:
谁负责API Gateway的开发及运维?
这个问题有几种不同的答案。
1、由一个单独的团队负责API Gateway。弊端是它与SOA类似,SOA中企业服务总线(ESB)团队负责所有ESB开发。如果从事移动应用程序的开发人员需要访问特定服务,他们必须向API Gateway团队提交请求并等待他们公开API。组织中的这种集中式的瓶颈与微服务架构的理念背道而驰,微服务架构下我们更提倡松散耦合的自治团队。
2、Netflix推出的方法为,让客户端团队(包括移动、Web和公共API团队)拥有与他们有关的API模块并公开API。API Gateway团队负责开发公共模块和API Gateway的运维
3、后端前置模式:为每种类型的客户端实现单独的API Gateway
即前端有移动端、PC端、第三方,这三端在前端团队的工作划分
好处
使用API Gateway的一个主要好处是它封装了应用程序的内部结构。客户端不必调用特定服务,而是与API Gateway通信。APl Gateway为每个客户端提供特定于客户端的API,从而减少客户端和应用程序之间的往返次数。它还简化了客户端代码。
弊端
API Gateway模式也有一些弊端。它是另一个必须开发、部署和管理的高可用组件,但存在成为开发瓶颈的风险。开发人员必须更新API Gateway才能对外公开服务的API。更新API Gateway 的过程尽可能轻量化是非常重要的。否则,开发人员将被迫排队等待更新API Gateway。尽管存在这些弊端,但对于大多数实际应用来说,使用APIGateway是有意义的。如有必要,你可以使用后端前置模式使团队能够独立开发和部署其API。
1、性能和可扩展性
API Gateway是应用程序的入口。所有外部请求必须首先通过API Gateway。虽然大多数公司的运营规模没有每天处理数十亿个请求的Netflix那么大,但API Gateway的性能和可扩展性通常非常重要。影响性能和可扩展性的关键设计决策是API Gateway应该使用同步还是异步IO。
2、使用响应式编程抽象可维护的代码
如前所述,API组合包括调用多个后端服务。一些后端服务请求完全取决于客户端请求的参数。其他人可能依赖于其他服务请求的结果。一种方法是API端点处理程序方法按照依赖性确定的顺序调用服务。更好的方法是使用响应式方法,以声明式风格编写API组合代码,JVM的响应式抽象包括:
3、处理局部异常
除了可扩展之外,API Gateway也必须可靠。实现可靠性的一种方法是在负载均衡器后面运行多个API Gateway实例。如果一个实例失败,负载均衡器会将请求路由到其他实例。
还有一种方法可以提高API Gateway的可靠性,API Gateway需要正确处理可能导致高延迟的请求。当APl Gateway调用服务时,服务总是很慢或不可用。APl Gateway可能会在很长一段时间内(可能无限期地)等待响应,这会消耗资源并堵塞向客户端发送的响应。对失败服务未完成的请求甚至可能消耗宝贵的资源(例如线程),并最终导致API Gateway无法处理任何其他请求。
4、成为应用程续架构中的好公民
使服务的客户端(如API Gateway)能够确定服务实例的网络位置,以便客户端可以调用服务。可观测性模式使开发人员能够监控应用程序的行为并解决问题。与架构中的其他服务一样,API Gateway 必须实现整个架构中选择的各种模式。
使用现成的API Gateway产品或服务:
前面提到的另一个挑战是不同的客户需要稍微不同的数据。例如,与移动应用程序不同,桌面Web应用程序需要显示用户对订单的评级。解决方案可以是,定制接口返回数据的一种方法是让客户端能够指定所需的数据。例如,接口可以支持查询参数,如expand参数,它指定要返回的相关资源,以及field参数,它指定要返回的每个资源的字段。另一种选择是定义此接口的多个版本,作为应用后端前置模式的一部分。对于API Gateway,需要实现众多API接口,这需要做很多工作。
实现支持多种客户端的REST API的API Gateway非常耗时。因此,你可能需要考虑使用基于图形的API框架,例如GraphQL,它旨在支持高效的数据提取
模式(Schema)驱动的 API技术:
两种最流行的基于图形的API技术是 GraphQL 和Netflix Falcor。
Netflix Falcor将服务器端数据建模为虚拟JSON对象图。Falcor客户端通过执行检索该JSON对象属性的查询,从Falcor服务器检索数据。客户端还可以更新属性。在Falcor 服务器中,对象图的属性映射到后端数据源,例如使用REST API 的服务。服务器通过调用一个或多个后端数据源来处理设置或获取属性的请求。
GraphQL 由Facebook开发并于2015年发布,是另一种流行的基于图形的API技术。它将服务器端数据建模为具有字段和对其他对象引用的图形,将对象图映射到后端数据源。GraphQL客户端可以执行检索创建和更新数据的查询。与 Netflix Falcor不同,后者是一种实现,而 GraphQL是一种标准。客户端和服务器可用于各种语言,包括Node.js,Java和 Scala。
Apollo GraphQL是一种流行的JavaScript/Node.js实现。它是一个包含GraphQL服务器和客户端的平台。Apollo GraphQL实现了GraphQL规范的一些强大扩展,例如将更改的数据推送到客户端的子脚本。
就是将原本流程式的后端服务端语言代码,调整为GraphQL的语法,类比为定制化的脚本语言。由配置替代代码,如下图