应用架构的演进 | 拒绝牺牲性能为代价的安全

微服务架构下有大量服务,每个服务都会暴露自己的 API。随着时间推移,不同服务的 API 容易出现不一致、重复的情况。这给 API 的维护带来很大难度。同时,服务间存在复杂的依赖关系。一个 API 的实现可能依赖多个其他服务的 API。这种依赖关系的管理非常复杂。一个 API 的变更会影响依赖它的其他 API。因此,微服务架构对外暴露大量粒度细的 API,给 API 的设计、管理、安全、监控等带来很大挑战。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

图 1 源于:《Microservices Patterns》

作者 Chris Richardson

API Gateway 模式可以在一定程度上帮助解决微服务架构下对外暴露 API 的挑战。

  • API Gateway 可以将各个微服务的 API 聚合起来,对外可以以较粗的粒度暴露 API,这样可以降低微服务粒度划分的难度。
  • API Gateway 作为统一的 API 入口,可以实现诸如请求路由、组合、协议转换等功能。这样可以一定程度上屏蔽各个微服务 API 的不一致情况,提高一致性。
  • 依赖关系可以在 API Gateway 这一层进行管理,降低各个微服务之间的复杂依赖。
  • 结合其他的安全服务,比如 Firewall 和架构的安全设计,API Gateway 可以获得实现认证、鉴权、防护等能力,从而集中处理 API 的安全性问题。
  • 通过 API Gateway 集中接收请求,可以方便统一监控日志、报警等,提高监控效率。

图 2 源于:《Microservices Patterns》

作者 Chris Richardson

让我们来看一下 API Gateway 模式用于复杂查询的生产示例。

图 3 源于:《Microservices Patterns》

作者 Chris Richardson

如图所示,通过客户端调用多个微服务的 API,并在客户端组合这些 API 返回的结果。

是直接且简单的实现方式。每个服务只需要提供简单的 API 就可以了,但是它缺点是增加了客户端负载,如果设计不当,可能会成为性能瓶颈。

1 Backend For Frontend 架构

Backend For Frontend(BFF)架构设计思想可以很好地解决 API Gateway 存在的性能瓶颈问题。相比 API Gateway 统一对外暴露 API,BFF 为每一种类型的客户端提供符合其需求的定制化后端服务。具体来说,BFF 可以这么设计:

  • 为移动端提供面向移动端优化的 BFF 服务层。
  • 为 Web 端提供面向 Web 优化的 BFF 服务层。
  • 为第三方系统提供对应的 BFF 服务。

每个 BFF 服务层只服务对应一种类型的客户端,按需从各微服务中获取数据,提供给对应的客户端。这种设计有以下优势:

  • 每个 BFF 服务可以针对特定客户端进行优化,不会存在性能瓶颈。
  • 当某一类客户端需要变更时,只需要改变对应的 BFF 层,不影响其他客户端。
  • 新的客户端类型可以通过增加一个新的 BFF 来实现支持。

BFF 架构符合微服务的设计思想,可以避免 API Gateway 的性能及变更影响问题。它为微服务提供了一种更加可扩展、灵活的门面服务。

2 云原生的 API Gateway 模式服务

利用云原生服务和工具可以帮助我们进一步优化 BFF 工作流程,提高开发效率,增加业务弹性。比如 Amazon AppSync。

图 4

如图所示,Amazon AppSync 是亚马逊云科技提供的一种托管式 GraphQL 服务。通过自动生成 GraphQL 接口,并连接各种数据源,来快速构建功能强大的后端服务。

  • AppSync 可以自动生成数据模型和对各种数据源的访问机制,极大地减少了手动编写访问各种后端服务的代码量。
  • AppSync 内置对多种数据源(DynamoDB、Lambda 等)的集成机制,可以轻松连接这些数据源,减少直接集成的工作。
  • AppSync 支持订阅实时数据更新,对连接的数据源进行实时同步,减少直接处理实时数据同步逻辑的工作。
  • AppSync 天然支持细粒度的访问控制,可以轻松实现对 API 的访问权限控制。
  • AppSync 提供了内置的监控和指标,可以方便地观察 API 的性能。

AppSync 它适用于快速开发需要访问多个数据源的应用程序后端服务,可以处理大部分通用的后端访问需求,让前端开发者只需要关注核心业务逻辑,不再需要编写重复性的后端访问代码。这可以大大精简 API Gateway 的代码量,使其专注在核心业务处理上,提高开发效率。

小结

亚马逊根据自身对云计算和无服务器的理解,实现高性能、高安全的 API Gateway 服务。让安全与性能不产生矛盾关系。

微服务应用架构是构建业务弹性的重要实现,它有很多优势,但是并不代表它适合所有的业务模型。我选择单体应用架构还是微服务应用架构需要依据业务类型。同时,我们也看到构建和运行一个微服务应用并不简单,会面临新的挑战。无服务器可以通过多种事件驱动型的技术模式来解决微服务架构面对进程间通信的可靠性,数据一致性,以及整个业务架构的敏捷性,可靠性,可观测性的困难和挑战。

文章来源: dev.amazoncloud.cn/column/arti...

相关推荐
ZHOU西口3 分钟前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩44 分钟前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS2 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
想进大厂的小王3 小时前
Spring-cloud 微服务 服务注册_服务发现-Eureka
微服务·eureka·服务发现
景天科技苑3 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge3 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇4 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
Gemini19956 小时前
分布式和微服务的区别
分布式·微服务·架构
昌sit!12 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
茶馆大橘15 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel