与我一起学习微服务架构设计模式8—外部API模式

外部API的设计难题

Web应用在防火墙内部运行,它们通过高带宽、低延迟的局域网访问服务。其他客户端在防火墙之外运行,通过较低带宽、较高延迟的互联网或移动网路访问。

移动客户端API的设计难题

移动应用程序扮演API组合器的角色,调用多个服务并组合结果,存在如下问题:

  • 多次客户端请求导致用户体验不佳

  • 缺乏封装导致前端开发做出的代码修改影响后端

  • 服务可能选用对客户端不友好的进程间通信

其他类型客户端API的设计难题

web应用程序

web应用程序直接访问后端服务是可以的

基于浏览器的JavaScript应用程序 

与移动应用程序具有相同的网络延迟问题,且可能需要组合更多的服务。

第三方应用程序 

同样存在API组合低效的问题,但更大的问题是第三方开发人员需要一个稳定的API,API旧版本可能需要永远维护。

API Gateway模式

直接访问服务的API客户端会导致很多问题,更好的方法是API Gateway,即实现一个服务,该服务是外部API客户端进入基于微服务应用程序的入口点,

它负责:

  • 请求路由

  • API组合

  • 协议转换

  • 能够为每一个客户端提供它们专用的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。影响性能和可扩展性的关键设计决策是API Gateway应用使用同步还是异步I/O

异步(非阻塞)I/O模型没有多个线程开销,更具扩展性,但编程模型复杂得多。

选择哪种取决于API Gateway的请求处理逻辑特性。如是I/O密集型还是CPU密集型。

使用响应式编程抽象 

按顺序调用服务,服务响应时间过长,尽可能同时调用所有服务,但编写可维护的并发代码存在挑战。可使用响应式方法,如CompleteFutures、Monos、RxJava等。

处理局部故障

方法:

1、多实例,负载均衡 

2、断路器模式

和其他服务一样,必须实现整个架构中选择的各种模式

实现一个API Gateway

使用现成的API Gateway产品或服务

可以选择AWS API Gateway,AWS Application Load Balancer等,这些产品实现了边缘功能和强大的路由功能,但不支持API组合。

开发自己的API Gateway

开发API Gateway更好的起点时使用满足如下要求的框架:

  • 实现定义路由规则的机制以简化复杂的代码

  • 正确实现HTTP代理行为,包括如何处理HTTP标头

Netflix Zuul 

处理路由和边缘功能。可定义实现API组合的Spring MVC控制器扩展Zuul,但Zuul只能实现基于路径的路由(不支持请求方法)。

Spring Cloud Gateway 

它属于响应式Web框架,构建在Project Reactor之上(基于NIO的JVM响应式框架)。支持以下操作:

  • 路由

  • API组合

  • 边缘功能

包含以下包:

  • ApiGatewayMain:定义API Gateway的主程序

  • 一个或多个API包:一个API包实现一组API端点

  • 代理程序包:由API程序包用于调用服务的代理类组成

使用GraphQL实现API Gateway

实现支持多种客户端的REST API的API Gateway非常耗时,你可能需要考虑使用基于图形的API框架,如GraphQL。

API由映射到服务的基于图形的模式组成,客户端发出检索多个图形节点的查询。基于查询的API框架通过从一个或多个服务检索数据来执行查询。

基于GraphQL(一种标准)的API Gateway可使用Node.js Express Web 框架和Apollo GraphQL服务器,用js编写。

它可以由三部分组成:

  • GraphQL模式:定义服务器端数据模型及其支持的查询

  • 解析器函数:解析函数将模式的元素映射到各种后端服务。

  • 代理类:代理类调用应用程序的服务。

执行GraphQL 

使用GraphQL的主要好处是它的查询语言为客户端提供了对返回数据的令人难以置信的控制。客户端通过向服务器发出包含查询文档的请求来执行查询。简单情况下,查询文档包含查询的名称,参数值及要返回结果的对象字段。

把模式连接到数据源 

当GraphQL服务器执行查询时,必须从一个或多个数据存储中检索所请求的数据。通过将解析函数附加到模式定义的对象类型字段,可以将GraphQL模式与数据源相关联。GraphQL通过调用解析器函数检索数据,以此实现API组合模式。

GraphQL通过递归调用Query文档中指定的字段解析器函数来执行查询。首先,它执行查询解析器,然后递归调用结果对象层次结构中字段的解析器。

使用批处理和缓存优化负载 

批处理将N个调用转换为服务,变成单个调用,该调用将检索一批N个对象。缓存会利用先前获取的同一对象结果,以避免不必要的重复调用。

为了让客户端调用GraphQL,你需要将它与Web框架集成,如Express Web

编写GraphQL客户端 

客户端库可以使用HTTP库或GraphQL客户端库调用GraphQL服务器。

java达人

ID:drjava

(长按或扫码识别)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值