前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >与我一起学习微服务架构设计模式8—外部API模式

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

作者头像
java达人
发布2019-12-06 14:18:10
1.4K0
发布2019-12-06 14:18:10
举报
文章被收录于专栏:java达人

外部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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 外部API的设计难题
    • 移动客户端API的设计难题
      • 其他类型客户端API的设计难题
      • API Gateway模式
        • 好处与弊端
          • API Gateway的设计难题
          • 实现一个API Gateway
            • 使用现成的API Gateway产品或服务
              • 开发自己的API Gateway
              • 使用GraphQL实现API Gateway
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档