谈谈微服务设计中的 API 网关模式

微服务架构开发实战:API网关意义和常见API网关的实现方式 API网关意义 API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API。 API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权,以及响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或计费等。 API并不能适用于所有场景 在基于微服务的架构设计中,往往包含多个服务,这些服务并不能适用于所有场景。例如,在一个面向PC的Web 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:架构头条(ID: ArchFront)

medium.com/dev-genius/

microservices-design-api-gateway-pattern-980e8d02bdd5

  • 客户端到微服务的连接

  • API 网关

  • API 网关的功能

  • 后端服务前端模式(BFF Backend for Frontend)

  • 著名的 API 网关

  • API 组合与聚合

  • API 网关和聚合


根据 Gartner 对微服务的定义:“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立伸缩的应用程序组件。”

与将模块高度耦合并部署为一个大的应用程序相比,微服务的目标是将应用程序充分分解或者解耦为松散耦合的许多微服务或者模块,这样做对下面几点有很大帮助:

  • 每个微服务都可以独立于应用程序中的同级服务进行部署、升级、扩展、维护和重新启动。

  • 通过自治的跨职能团队进行敏捷开发和敏捷部署。

  • 运用技术时具备灵活性和可扩展性

在微服务架构中,我们根据各自的特定需求部署不同的松耦合服务,其中每个服务都有其更细粒度的 API 模型,用以服务于不同的客户端(Web,移动和第三方 API)。

客户端到微服务的连接

在考虑客户端与每个已部署的微服务直接通信的问题时,应考虑以下挑战:

  1. 如果微服务向客户端公开了细粒度的 API,则客户端应向每个微服务发出请求。在典型的单页中,可能需要进行 多次服务器往返,才能满足请求。对于较差的网络条件下运行的设备(例如移动设备),这可能会更糟。

  2. 微服务中存在的 多种通信协议(例如 gRpc、thrift、REST、AMQP 等)使客户端很难轻松采用所有这些协议。

  3. 必须在每个微服务中实现通用网关功能(例如身份验证、授权、日志记录)。

  4. 在不中断客户端连接的情况下,很难在微服务中进行更改。例如,在合并或划分微服务时,可能需要重新编写客户端部分代码。

API 网关

为了解决上述挑战,人们引入了一个附加层,该附加层位于客户端和服务器之间,充当从客户端到服务器的反向代理路由请求。与面向对象设计的模式相似,它为封装底层系统架构的 API 提供了一个单一的入口,称为 API 网关。

简而言之,它的行为就像 API 管理员一样,但重要的是不要将 API 管理与 API Gateway 混为一谈。

API 网关的功能

路由

网关封装了底层系统并与客户端分离,为客户端提供了与微服务系统进行通信的单个入口点。

整合

API 网关整合了一些边缘的重复功能,无需让每个微服务都实现它们。它包括如下功能:

  • 认证和授权

  • 服务发现集成

  • 缓存响应结果

  • 重试策略、熔断器、QoS

  • 限速和节流

  • 负载均衡

  • log 日志、链路追踪、关联

  • Header、query 字符串 以及 claims 转义

  • IP 白名单

  • IAM

  • 集中式日志管理(服务之间的 transaction ID、错误日志等)

  • 身份的提供方,验证与授权

后端服务前端模式(BFF Backend for Frontend)

它是 API 网关模式的一种变体。它提供了基于客户端的多个网关,而不是提供给客户端一个单一的入口点。目的是根据客户端的需求提供量身定制的 API,从而消除了为所有客户端制作通用 API 造成的大量的浪费

到底需要多少 BFF

BFF 的基本概念是为每种用户体验开发利基后端。菲尔·卡尔萨多(PhilCalçado) 的指导建议是“一种体验,一种 BFF”。如果跨客户端(IOS 客户端、Android 客户端、Web 浏览器等)的要求有很大差异,并且单个代理或 API 的发布时间有严格要求,则 BFF 是一个很好的解决方案。还应注意,更复杂的设计需要复杂的步骤。

GraphQL 与 BFF

GraphQL 是一种 API 的查询语言。PhilCalçado 提出 BFF 和 GraphQL 的想法是相似的,但不是互斥的概念。他补充说,BFF 与你端口的形状无关,而在于赋予客户端对应用程序的自治权,您可以在其中构建与许多 BFF 或 OSFA(one-size-fits-all)的 GraphQL API。

著名的 API 网关

Netflix API 网关:Zuul

Netflix 的流媒体服务可在 1000 多种不同类型的设备(电视、机顶盒、智能手机、游戏系统、平板电脑等)上使用,在高峰时段可以每秒处理 50,000 个请求,这种需求是 OSFA (one-size-fits-all)的 REST API 难以满足的,因此他们为每个设备量身定制了 API 网关。

Netflix 的 Zuul 2 是所有进入 Netflix 云基础架构的请求的第一步。Zuul 2 大大改进了架构和功能,使我们的网关能够处理、路由和保护 Netflix 的云系统,并帮助为我们的 1.25 亿会员提供最佳体验。

亚马逊 API 网关

AWS 提供了完备的托管服务,用于创建、发布、维护、监视以及保护 REST、HTTP 和 WebSocket,开发人员可以在其中创建用于访问 AWS 或其他 Web 服务的 API,并将数据存储在 AWS 云上面。

Kong API 网关

Kong Gateway 是一个开源的,轻量级的微服务 API 网关,可提供无与伦比的延迟性能优化和可伸缩性。如果您只需要这些基础能力,那么它就是很合适的选项。只需要增加更多节点就可以轻松横向扩展。它以非常低的延迟来支持大量可变的工作负载。

其他 API 网关

  • Apigee API Gateway

  • MuleSoft

  • Tyk.io

  • Akana

  • SwaggerHub

  • Azure API Gateway

  • Express API Gateway

  • Karken D

选择正确的网关

评估标准里面,一些常见的指标包括简便性、开源还是专有、可伸缩性和灵活性、安全性、后续功能、社区、管理(支持情况、监控和部署)、环境配置(安装、配置、是否支持托管)、定价和文档等。

API 组合与聚合

API 网关中的一些 API 请求直接映射到单个服务的 API 上,可以通过将请求路由到相应的微服务来提供服务。但是,在需要从多个微服务获得结果的复杂 API 操作的情况下,可以通过 API 组合 / 聚合(分散 - 收集机制)来提供服务。在需要同步通信的情况下,如果服务彼此依赖,则必须遵循链式组合模式。组合层必须支持很大一部分的 ESB / 集成功能,例如转换、编排、弹性和稳定性模式。

根容器的部署必须配备特殊的分发器和聚合器功能(或微服务)。分发者负责分解成细粒度的任务,并将这些任务分发给微服务实例。聚合器负责聚合业务工作流从组合微服务中得出的结果。

API 网关和聚合

具备复杂功能的网关会增大测试和部署的难度。强烈建议大家避免在 API 网关中进行聚合和数据转换。领域专属的功能更应该遵循软件开发实践的定义,在应用程序的代码中完成。Netflix API Gateway Zuul 2 从他们在 Zuul 到原始系统的网关中,删除了许多业务逻辑。

Service Mesh 与 API 网关

微服务中的 Service Mesh 是处理进程间通信的可配置网络基础结构层。这和通常称为 Sidecar 代理或 Sidecar 网关的东西很像。它提供了许多功能,例如:

  • 负载均衡

  • 服务发现

  • 健康检查

  • 安全性

从表面上看,API 网关和 Service Mesh 似乎解决了相同的问题,因此好像是多余的。它们确实解决了相同的问题,但是应用在不同的场景。API 网关被部署为业务解决方案的一部分,被外部的服务发现,处理纵向的流量(面对外部客户端),但是,Service Mesh 是用来处理横向流量(在不同的微服务之间)。

实现 Service Mesh 可避免在您自己的代码中出现一些弹性交互,例如熔断器、服务发现、健康检查以及服务观察。对于少量的微服务,应考虑使用其他替代方法来进行故障管理,因为 Service Mesh 集成可能代价太大了。但对于大量的微服务,它的收益是显著的。

结合这两种技术可能是确保应用程序正常运行时间和弹性伸缩能力的一种有效方法,同时又可以确保您的应用程序易于使用。将两者视为同样的产品是不对的,最好将两者视为在涉及微服务和 API 的部署中相辅相成的工具。

API 网关实现的注意事项:

  • 可能产生的单点故障或者瓶颈

  • 由于通过 API 网关进行了额外的网络跳转以及复杂性风险,响应时间增长了。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,艿一口,点个赞!????

API Gateway与GraphQL的集成方式 随着互联网的发展,API(应用程序接口)已经成为了各种应用程序之间交流和数据交换的重要手段。API Gateway 是一种特殊的代理服务器,它负责处理来自客户端的请求,并将其转发到后端服务器上。API Gateway 可以提供安全性、负载均衡、监控和日志记录等功能,使得开发人员可以专注于编写业务逻辑,而无需关心底层服务的细节。GraphQL 是一种查询语言,它允许客户端通过单个请求获取所需的数据,而不是通过多个请求获取不同的数据。 阅读详情

相关推荐

网关:用于graphql服务的api网关。 https:gateway.nautilus.dev

鹦鹉螺/网关 一种旨在将您的graphql API整合到一个端点的独立服务。 有关入门的指南,请阅读。 有关完整文档,请访问。 运行可执行文件 运行网关的最简单方法是从GitHub上的最新版本下载可执行文件,然后直接在您的计算机上运行它: $ ./gateway start --port 4000 --services http://localhost:3000,http://localhost:3001 这将在端口4000上启动服务器,该服务器将覆盖在http://localhost:3000和http://localhost:3001运行的服务。 有关传递可执行文件的可能参数的更多

谈谈微服务设计中的API网关模式

来源:架构头条(ID: ArchFront)原文:http://dwz.date/crrw根据 Gartner 对微服务的定义:“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立...

MarkerHub的博客 334

Graphql构建Api网关思考

Graphql构建Api网关思考,全球软件开发技术峰会PPT,陈国兴

【Java设计模式】网关模式

网关设计模式是Java设计模式中用于简化API集成和与远程服务交互的关键概念。它为外部系统提供了一个统一且简化的接口,增强了应用程序的可维护性和架构。通过封装这些交互,网关模式确保了松散耦合,并促进了更模块化和可扩展的软件设计,对于强大和高效的应用程序开发至关重要。

道长的博客 1141

哈工大2024春大数据挖掘期末考试回忆版试题

(3)现有一个用户数量远多于物品(还是物品远多于用户,忘了是哪个了)的情景,应该使用基于user-user的推荐系统还是item-itmen的推荐系统,说明原因。(1)L是n*n拉普拉斯矩阵,x是一个n*1列向量,证明对任意的x,(x)^TLx>=0(6分)(3)证明:p到o的K-可达距离,至少是o的K-distance(2分)(2)(1)的结果说明竞争率的上界是多少?(2)考Gain的意义,如何利用Gain选择划分点(2分)(2)说明如何利用划分后的数据进行验证(2分)(2)k可达距离是对称的吗?

ymd2002的博客 1892

【Verilog模块例化全解析:从入门到精通】

本文详细解析了Verilog模块例化的核心概念与方法。主要内容包括: 模块定义与例化的基本概念,强调模块例化会生成独立硬件电路; 两种端口连接方式:位置映射(按顺序连接)和名称映射(按端口名连接),推荐使用名称映射提高可读性; 参数化例化方法,通过parameter实现可配置模块设计; 多层模块嵌套的实战应用,展示复杂设计的层次化实现。 文章通过2位加法器等代码示例,对比分析了不同例化方式的优缺点,为硬件设计中的模块复用提供了实用指导。重点推荐名称映射和参数化设计方法,以提高代码可维护性和设计灵活性。

m0_58476824的博客 1328

JAVA微服务之网关(GateWay)学习

加入一个注解:@ConditionalOnclass(DispatchherService.class)MVC的核心类,有这个类就启动配置,没有就不启动,解决问题。从商城服务到购物车服务,商城服务的User信息是从网关得到的,因此可以从UserContext上下文取到,然后通过OpenFeign的中这个拦截器来进行请求头的添加,实现了用户信息的传递。解法:配置管理服务,例如Apllo,可以实现不停机修改配置功能,黑马用的是Nacos。弄完后报错了,网关加入了common模块,但网关不能处理。

小泽的博客 1304

CentOS7环境下搭建 rsyslog 日志服务器,rsyslog+loganalyzer

1.系统环境部署 ip hostname 192.168.200.182 web 192.168.200.184 rsyslog-mysql 关闭防火墙、selinux、下载epel源 [root@web ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/f

sehn_的博客 3755

Baeldung Java 周评 | 第七十六弹(关键词:Eclipse 第十次年度发布链及酷点、使用 API 网关构建微服务、编写下载服务器、单库蓝绿部署、高性能 Java 持久化、无服务器更新)

开篇词 尤金的第 76 篇 Java 周评,诞生了!   Spring 以及 Java 相关 Eclipse 发行第十次年度发布链(+ InfoQ 报道) Eclipse Mars(4.5)已发布 - 这是该发行版的酷点。另外 - 这是该版本中前十大功能的简要说明。 构建微服务:使用 API 网关 在以微服务为中心的架构中使用 API 网关模式的必读文章。 以我自己的经验,我发现代理/...

纽雪澳诺加海美德的博客 524

MacX DVD Ripper Pro for Mac(DVD解码器) 6.2.120190416免激活版

只需要5分钟即可转档一张DVD光碟!并允许我们在编码之前预览、编辑、裁剪、修剪或扩展视频。第一款也是唯一一款能够支持DVD到MP4,H.264,MOV,FLV,MPEG4等所有格式DVD(新DVD,99-标题DVD,损坏和无法播放的DVD)和翻录DVD / ISO映像的工具,AVI,QT,MP3等。借助350多种预设配置文件MacX DVD Ripper Pro for Mac(DVD解码器) 6...

llhf688的博客 891

通信原理 | python调制识别数据及代码

数据集包含了从-20dB 到+18dB 总共 20 个信噪比(步长为 2)下的 11 种调制信号, 包括 AM-DSB、 AM-SSB 和 WBFM 三种模拟调制信号,以及 BPSK、 QPSK、 8PSK、 CPFSK、 GFSK、 PAM4、 QAM16 和 QAM64 八种数字调制信号。其中信号的中心频率为 200KHz,采样频率为 1Msamp/s,且每个信噪比下每种调制信号包含 1000 个信号。其中每个信号包含 IQ 两路数据,且每一路数据都包含有 128 个采样点。

若北辰 1758

微服务通信的设计模式

在我的上一篇博客中,我谈到了微服务的设计模式。现在我想更深入地探讨微服务架构中最重要的模式:微服务之间的相互通信。我仍然记得我们过去开发单一应用时通讯是一项艰巨的任务。在那时我们必须小心的设计数据库表和对象模型映射之间的关系。而现在在微服务中,我们已经将它们分解为独立的服务,并创建网格来彼此通信。让我们来谈谈迄今为止为解决这个问题而发展起来的所有通信方式和模式。 许多架构师已经将微服务之间的通信划分为同步和异步两种模式。让我们一个一个来介绍。 同步模式 当我们说到同步时,意思是客户端向服务端发出请求并

august5291的博客 229

一文吃透!C#上位机CAN总线通信开发:从协议解析到数据可视化

CAN底层协议仅定义了8字节数据的传输规则,实际业务需自定义应用层协议,实现多类型数据的有序传输,这是数据解析的核心。仲裁ID(16进制)数据长度(DLC)数据场格式业务含义解析规则0x0014字节0~3:温度数据温度采集(单位:℃)4字节→float类型(大端/小端需统一,如西门子PLC格式)0x0022字节0~1:转速数据电机转速(单位:r/min)2字节→short类型(Int16)0x0031字节0:bit0~bit7设备状态(8路开关量)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 848

Baeldung Java 周评 | 第五十七弹(关键词:悲观加锁弥补乐观加锁的不足、Java 嵌套类型、Graphite 存储 Hystrix 月历史指标、OAuth2 单点登录、十二要素应用模式)

开篇词 尤金的第 57 篇 Java 周评,诞生了!   Spring 以及 Java 相关 如何使用悲观加锁修复乐观加锁竞争条件 嵌套类型的前五个用例 Java 中不一致的操作会扩大规则 以编程方式确定 Java 类的 JDK 编译版本 在 Graphite 中存储 Hystrix 的几个月历史指标 带有 OAuth2 的 SSO:AngularJS 和 Spring Securit...

纽雪澳诺加海美德的博客 554

计算机网络实验报告实验七可靠传输TCP协议分析

计算机网络实验报告实验七可靠传输TCP协议分析

m0_56638814的博客 966

8、Windows 部署ollama

一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,已被包括LangChain、Taskweaver等在内的多个热门项目高度集成。

Andy_shenzl的博客 1131

面试官问:MySQL 的自增 ID 用完了,怎么办?

来源:程序猿面试指南既然这块知识点不清楚,那回头就自己动手实践下。首先,创建一个最简单的表,只包含一个自增 id,并插入一条数据。createtablet0(idintunsig...

MarkerHub的博客 133

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在华为鸿蒙OS上尝鲜,撸一个“To Do List”

点击蓝色“架构文摘”关注我哟加个“星标”,每天上午 09:25,干货推送!作者:-个俗人来源:https://my.oschina.net/u/169565/blog/4557279前序...

架构文摘 3790

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

zookeeper 网关_zookeeper 有哪些应用场景?面试官希望听到这 4 点!

点击蓝色“架构文摘”关注我哟加个“星标”,每天上午 09:25,干货推送!作者:中华石杉来源:github.com/shishan100/Java-Interview-Advanced面试题zookeeper 都有哪些使用场景?面试官心理分析假设现在聊的话题是分布式系统,面试官跟你聊完了 dubbo 相关的一些问题之后,已经确认你对分布式服务框架/RPC框架基本都有一些认知了。那么接下来...

weixin_39765840的博客 427

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 2020 年 10 月程序员工资统计,终于涨了!
下一篇: 熬了一个通宵,终于把 7000 万个 Key 删完了
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值