「第二部:容器和微服务架构](9) API网关模式与客户端直接通信

简介: 「第二部:容器和微服务架构](9) API网关模式与客户端直接通信

在微服务体系结构中,每个微服务公开一组(通常)细粒度端点。如本节所述,这一事实可能会影响客户端到微服务的通信。


直接客户端到微服务通信


一种可能的方法是使用直接的客户机到微服务通信体系结构。在这种方法中,客户端应用程序可以直接向某些微服务发出请求,如图12所示。


图12 使用直接客户端到微服务的通信体系结


在这种方法中,每个微服务都有一个公开端点,有时每个微服务有一个不同的TCP端口。特定服务的URL示例可以是Azure中的以下URL:

http://eshoponcontainers.westus.cloudapp.azure.com:88/

在基于集群的生产环境中,该URL将映射到集群中使用的负载平衡器,后者反过来将请求分布到各个微服务。在生产环境中,可以在微服务和Internet之间使用类似于Azure应用程序网关的应用程序交付控制器(ADC)。它充当一个透明层,不仅执行负载平衡,而且通过提供SSL终止来保护您的服务。这通过将CPU密集型SSL终止和其他路由职责卸载到Azure应用程序网关来提高主机的负载。在任何情况下,从逻辑应用程序体系结构的角度来看,负载平衡器和ADC都是透明的。


对于一个小型的基于微服务的应用程序来说,直接的客户端到微服务的通信体系结构已经足够好了,特别是如果客户端应用程序是一个服务器端的web应用程序,比如ASP.NET MVC应用程序。然而,当您构建大型复杂的基于微服务的应用程序(例如,当处理数十种微服务类型时),特别是当客户端应用程序是远程移动应用程序或SPA web应用程序时,这种方法面临一些问题。

在基于微服务开发大型应用程序时,请考虑以下问题:

  • 客户端应用程序如何将对后端的请求数量减至最小,并减少对多个微服务的聊天通信?

通过与多个微服务交互来构建一个UI屏幕,可以增加互联网上往返的次数。这增加了UI端的延迟和复杂性。理想情况下,应该在服务器端有效地聚合响应。这减少了延迟,因为多个数据块并行返回,一些UI可以在数据准备好后立即显示数据。

  • 如何处理交叉关注点,如授权、数据转换和动态请求分派?

在每个微服务上实现安全性和交叉关注点(如安全性和授权)可能需要大量的开发工作。一种可能的方法是将这些服务放在Docker主机或内部集群中,限制从外部直接访问它们,并在一个集中的地方实现这些交叉关注点,比如API网关。

  • 客户端应用程序如何与使用非互联网友好协议的服务通信?

服务器端使用的协议(如AMQP或二进制协议)通常在客户端应用程序中不受支持。因此,请求必须通过HTTP/HTTPS等协议执行,然后转换为其他协议。在这种情况下,中间人的方法会有所帮助。

  • 你如何塑造一个专为移动应用程序设计的外观?

多个微服务的API可能不能很好地满足不同客户端应用程序的需要。例如,移动应用程序的需求可能不同于web应用程序的需求。对于移动应用程序,您可能需要进一步优化,以便数据响应更加高效。您可以通过聚合来自多个微服务的数据并返回一组数据来完成此操作,有时还会在响应中删除移动应用程序不需要的任何数据。当然,你也可以压缩这些数据。同样,在移动应用程序和微服务之间的facade或API对于这个场景也很方便。


为什么要考虑API网关而不是直接的客户机到微服务通信


在微服务架构中,客户端应用程序通常需要使用多个微服务的功能。如果直接执行该消耗,则客户端需要处理对微服务终结点的多个调用。当应用程序发展并引入新的微服务或更新现有的微服务时会发生什么?如果你的应用程序有很多微服务,那么从客户端应用程序处理这么多端点可能是一场噩梦。由于客户端应用程序将耦合到这些内部终结点,因此在未来改进微服务可能会对客户端应用程序造成很大影响。

因此,对于基于微服务的应用程序,具有中间层或间接层(网关)可能非常方便。如果没有API网关,则

客户端应用程序必须直接向微服务发送请求,这会引发问题,例如以下问题:

  • 耦合:没有API网关模式,客户端应用程序耦合到内部微服务。客户端应用程序需要知道应用程序的多个区域是如何在微服务中分解的。在对内部微服务进行演化和重构时,这些操作对维护的影响非常严重,因为它们会导致对客户端应用程序的中断更改,因为客户端应用程序直接引用了内部微服务。客户端应用程序需要频繁更新,使得解决方案更难发展。
  • 往返次数太多:客户端应用程序中的单个页面/屏幕可能需要多次调用多个服务。这可能导致客户机和服务器之间的多个网络往返,从而增加显著的延迟。在中间级别处理聚合可以提高客户端应用程序的性能和用户体验。
  • 安全问题:如果没有网关,所有微服务都必须暴露在“外部世界”中,使得攻击面比隐藏客户端应用程序未直接使用的内部微服务更大。攻击面越小,应用程序就越安全。
  • 横切关注点:每个公开发布的微服务都必须处理诸如授权、SSL等关注点。在许多情况下,这些关注点可以在单层中处理,这样内部微服务就简化了。

什么是API网关模式?


当您使用多个客户端应用程序设计和构建大型或复杂的基于微服务的应用程序时,一个好的考虑方法可以是API网关。这是一个为某些微服务组提供单一入口点的服务。它类似于面向对象设计中的Facade模式,但在本例中,它是分布式系统的一部分。API网关模式有时也被称为“前端后端”(backend for frontend,BFF),因为您在考虑客户端应用程序需求的同时构建它。

因此,API网关位于客户端应用程序和微服务之间。它充当反向代理,将请求从客户端路由到服务。它还可以提供额外的横切特性,如身份验证、SSL终止和缓存。


图13显示了一个定制的API网关是如何与一个简化的基于微服务的体系结构(只需几个微服务)相适应的。


图13 使用作为自定义服务实现的API网关


应用程序连接到一个端点,即API网关,配置为将请求转发到各个微服务。在本例中,API网关将作为一个自定义的ASP.NET核心WebHost服务实现,该服务作为一个容器运行。


在该图中,需要强调的是,您将使用一个面向多个不同客户端应用程序的自定义API网关服务。这一事实可能是一个重要的风险,因为您的API网关服务将根据来自客户端应用程序的许多不同需求不断增长和发展。最终,由于这些不同的需求,它将变得臃肿,而且实际上它可能非常类似于单片应用程序或单片服务。这就是为什么我们非常建议将API网关分成多个服务或多个较小的API网关,例如,每个客户端一个app form factor类型。

在实现API网关模式时需要小心。通常,让一个API网关聚合应用程序的所有内部微服务不是一个好主意。如果它这样做了,它将充当一个整体聚合器或编排器,并通过耦合所有微服务来违反微服务自治。

因此,API网关应该根据业务边界和客户端应用程序进行隔离,而不是作为所有内部微服务的单个聚合器。


当将API网关层拆分为多个API网关时,如果应用程序具有多个客户端应用程序,则在标识多个API网关类型时,这可能是一个主轴心,以便您可以针对每个客户端应用程序的需要具有不同的门面。本例是一个名为“Backend for Frontend”(BFF)的模式,其中每个API网关可以为每个客户端应用程序类型提供不同的API,甚至可以基于客户端的形状因子,通过实现下面调用多个内部微服务的特定适配器代码,如下图所示:


图13.1。使用多个自定义API网关


图13.1显示了按客户机类型隔离的API网关;一个用于移动客户机,一个用于web客户机。传统的web应用程序连接到使用web API网关的MVC微服务。该示例描述了一个具有多个细粒度API网关的简化架构。在本例中,为每个API网关标识的边界纯粹基于“Backend for Frontend”(BFF)模式,因此仅基于每个客户端应用程序所需的API。但在更大的应用程序中,您还应该更进一步,基于业务边界创建额外的API网关,作为第二个设计中心。

关于<<API网关模式与直接客户端到微服务通信>>,下一章继续。


额外资源


相关文章
|
JSON 自然语言处理 API
gRPC凭什么成为微服务通信首选?深度解析RPC进化史
本文深入解析了分布式系统中服务通信的核心机制,重点介绍了 RPC 与 gRPC 的原理、优势及使用场景,并详解 gRPC 所依赖的序列化协议 Protocol Buffers(Protobuf)。内容涵盖 RPC 概念、gRPC 特性、Protobuf 语法及服务定义,适合微服务架构设计与维护人员阅读,助你构建高性能、低耦合的服务通信体系。
1332 73
gRPC凭什么成为微服务通信首选?深度解析RPC进化史
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
770 59
|
人工智能 算法 网络安全
基于PAI+专属网关+私网连接:构建全链路Deepseek云上私有化部署与模型调用架构
本文介绍了阿里云通过PAI+专属网关+私网连接方案,帮助企业实现DeepSeek-R1模型的私有化部署。方案解决了算力成本高、资源紧张、部署复杂和数据安全等问题,支持全链路零公网暴露及全球低延迟算力网络,最终实现技术可控、成本优化与安全可靠的AI部署路径,满足企业全球化业务需求。
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
1117 4
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
3062 70
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1863 0
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
4057 37
微服务架构解析:跨越传统架构的技术革命
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
979 12