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

微服务架构下有大量服务,每个服务都会暴露自己的 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...

相关推荐
Java程序之猿4 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
Karoku0665 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
Yvemil76 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
Yvemil79 小时前
《开启微服务之旅:Spring Boot Web开发》(二)
前端·spring boot·微服务
维李设论9 小时前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
探索云原生10 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳10 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
jwolf212 小时前
基于K8S的微服务:一、服务发现,负载均衡测试(附calico网络问题解决)
微服务·kubernetes·服务发现
Yvemil714 小时前
《开启微服务之旅:Spring Boot Web开发举例》(二)
前端·spring boot·微服务
会飞的土拨鼠呀14 小时前
chart文件结构
运维·云原生·kubernetes