为什么微服务需要 API 网关?

news2024/12/16 11:03:08

本文我们主要讲解为什么微服务需要 API 网关。

对网关我们并不陌生,网关的概念来源于计算机网络,表示不同网络之间的关口。在系统设计中,网关也是一个重要的角色,其中最典型的是各大公司的开放平台,开放平台类网关是企业内部系统对外的统一入口,承担了很多业务,比如内外部数据交互、数据安全、监控统计等功能。

在微服务架构中,API 网关的作用和开放平台等传统网关又有一些不同,下面一起来看一下微服务中 API 网关的相关知识。

为什么需要网关

在微服务架构中,一个大应用被拆分成多个小的服务,这些微服务自成体系,可以独立部署和提供对外服务。一般来说,微服务的调用规范主要有 RPC 和 Restful API 两种,API 网关主要针对的是后面一种,也就是以 Spring Cloud 为代表的微服务解决方案。

从一个实际场景入手

假设我们要使用微服务构建一个电商平台,一般来说需要订单服务、商品服务、交易服务、会员服务、评论服务、库存服务等。

移动互联网时代,我们的系统不仅会通过 Web 端提供服务,还有 App 端、小程序端等,那么不同客户端应该如何访问这些服务呢?

如果在单体应用架构下,所有服务都来自一个应用工程,客户端通过向服务端发起网络调用来获取数据,通过 Nginx 等负载均衡策略将请求路由给 N 个相同的应用程序实例中的一个,然后应用程序处理业务逻辑,并将响应返回给客户端。

1.png

在微服务架构下,每个服务都是独立部署,如果直接调用,系统设计可能是这样的:

2.png

各个调用端单独去发起连接,会出现很多问题,比如不容易监控调用流量,出现问题不好确定来源,服务之间调用关系混乱等。

如何解决这个局面呢

针对这些问题,一个常用的解决方案是使用 API 服务网关。在微服务设计中,需要隔离内外部调用,统一进行系统鉴权、业务监控等,API 服务网关是一个非常合适的切入口。

通过引入 API 网关这一角色,可以高效地实现微服务集群的输出,节约后端服务开发成本,减少上线风险,并为服务熔断、灰度发布、线上测试等提供解决方案。

3.png

使用网关,可以优化微服务架构中系统过于分散的弊端,使得架构更加优雅,选择一个适合的 API 网关,可以有效地简化开发并提高运维与管理效率。

应用网关的优劣

API 网关在微服务架构中并不是一个必需项目,而是系统设计的一个解决方案,用来整合各个不同模块的微服务,统一协调服务。

API 网关自身也是一个服务,网关封装了系统内部架构,为每个客户端提供了一个定制的 API。从面向对象设计的角度看,它与外观模式(Facade Pattern)类似,外观模式的定义是,外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,这一点和 API 网关的作用非常类似。

除了封装内部系统之外,API 网关作为一个系统访问的切面,还可以添加身份验证、监控、负载均衡、限流、降级与应用检测等功能。

通过在微服务架构中引入 API 网关,可以带来以下的收益:

  • API 服务网关对外提供统一的入口供客户端访问,隐藏系统架构实现的细节,让微服务使用更为友好;

  • 借助 API 服务网关可统一做切面任务,避免每个微服务自己开发,提升效率,使系统更加标准化;

  • 通过 API 服务网关,可以将异构系统进行统一整合,比如外部 API 使用 HTTP 接口,内部微服务可以使用一些性能更高的通信协议,然后在网关中进行转换,提供统一的外部 REST 接口;

  • 通过微服务的统一访问控制,可以更好地实现鉴权,提高系统的安全性。

API 网关并不是一个必需的角色,在系统设计中引入网关,也会导致系统复杂性增加,带来下面的问题:

  • 在发布和部署阶段需要管理网关的配置,保证外部 API 访问的是正常的服务实例;

  • API 服务网关需要实现一个高可用伸缩性强的服务,避免单点失效,否则会成为系统的瓶颈;

  • 引入API 服务网关额外添加了一个需要维护的系统,增加了开发和运维的工作量,提高了系统复杂程度。

可以看到,应用API 网关需要权衡带来的收益和因此增加的复杂性,这也是我们前面说的,分布式系统是复杂性和收益的平衡,需要针对具体业务进行合理的架构设计。

微服务网关选型

在微服务领域,有许多开源网关实现,应用比较多的是 Spring Cloud Zuul 和 Spring Cloud Gateway。

Spring Cloud Zuul

Spring Cloud Zuul 是 Spring Cloud Netflix 项目的核心组件之一,是 Netflix 开发的一款提供动态路由、监控、弹性、安全的网关服务。

Zuul 分为 1.x 和 2.x 两个大版本,1.x 版本是基于 Servlet 构建的,采用的是阻塞和多线程方式。1.x 版本在 Spring Cloud 中做了比较好的集成,但是性能不是很理想。后来 Netflix 宣布开发 2.x 版本,目前已经更新到了 2.x 版本,不过 Spring Cloud 官方并没有集成,而是开发了自己的 Spring Cloud Gateway。

Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 体系的第二代网关组件,基于 Spring 5.0 的新特性 WebFlux 进行开发,底层网络通信框架使用的是 Netty。

Spring Cloud Gateway 可以替代第一代的网关组件 Zuul。Spring Cloud Gateway 可以通过服务发现组件自动转发请求,集成了 Ribbon 做负载均衡,支持使用 Hystrix 对网关进行保护,当然也可以选择其他的容错组件,比如集成阿里巴巴开源的 Sentinel,实现更好的限流降级等功能。

总结

本文分享了 API 网关的应用场景,使用网关带来的收益,以及对应增加的系统复杂度,最后介绍了两款开源微服务网关选型。希望通过本课时的学习,能够让你对 API 服务网关有一个初步的认识,对文中提到的 Zuul 和 Spring Cloud Gateway 两大组件,以及背后相关的技术实现,如 WebFlux,官网有非常多的学习资料,感兴趣的同学可以自行学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VRTK】【VR开发】【Unity】13-攀爬

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 VRTK提供两个预制件实现攀爬 Climbing Controller,用于控制Player的物理义体Climbable Interactable,用于设置可攀爬对象【设置Climbing Controller…

低多边形3D建模石头材质纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

【软考中级——软件设计师】备战经验 笔记总结分享

考试成绩 我第一次备考是在2022 然后那时候取消了这次是第二次 靠前我一个月复习的看了以前的笔记 然后刷了七八道历年题目学习资料推荐 :zst——2021 b站链接自荐一下我的笔记 : 软考笔记专栏 视频确实很长 , 我的建议就是先看笔记 然后不会…

论文查重率一般不超过多少【一文读懂】

大家好,今天来聊聊论文查重率一般不超过多少,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 论文查重率一般不超过多少 在学术界,论文查重是保证学术诚信和学术质量的重要手段快…

数据结构算法-希尔排序算法

引言 在一个普通的下午,小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐,更是要用扑克牌来决定谁是真正的“大老板”。 然而,小明的牌就像刚从乱麻中取出来的那样,毫无头绪。小森的牌也像是被小丑掷…

JVM 性能调优及监控诊断工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

目录 一. 前言 二. jps(Java Virtual Machine Process Status Tool) 三. jstack 四. jmap(Memory Map)和 jhat(Java Heap Analysis Tool) 五. jstat(JVM统计监测工具) 六. hpro…

数据结构和算法-单链表

数据结构和算法-单链表 1. 链表介绍 链表是有序的列表,但是它在内存中是存储如下 图1 单链表示意图 小结: 链表是以节点的方式存储每个节点包含data域,next域,指向下一个节点。如图:发现链表的各个节点不一定是连续存储。比如地…

持续集成交付CICD:Jenkins配置Nexus制品上传流水线

目录 一、实验 1.Jenkins配置制品上传流水线 二、问题 1.上传制品显示名称有误 一、实验 1.Jenkins配置制品上传流水线 (1) 新建流水线项目 (2)描述 (3)添加参数 (4)查看构建首页 (5&…

windows系统安装RocketMQ_dashboard

1.下载源码 按照官网说明下载源码 官网 官网文档 2.源码安装 2.1.① 编译rocketmq-dashboard 注释掉报错的maven插件frontend-maven-plugin、maven-antrun-plugin mvn clean package -Dmaven.test.skiptrue2.2.② 运行rocketmq-dashboard java -jar target/rocketmq-…

网络层重点协议——IP协议详解

✏️✏️✏️今天给大家分享的是网络层的重点协议——IP协议。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈️动动你们发财的…

【Linux】进程和环境变量

我们启动一个软件,本质就是启动一个进程 在Linux下,运行一条命令,运行的时候,其实就是在系统层面创建了一个进程 而Linux系统管理大量进程则是先描述,再组织 进程 对应的代码和数据 进程等对应的PCB结构体 PCB包含了…

【深度学习】注意力机制(一)

本文介绍一些注意力机制的实现,包括SE/ECA/GE/A2-Net/GC/CBAM。 目录 一、SE(Squeeze-and-Excitation) 二、ECA(Efficient Channel Attention) 三、GE(Gather-Excite) 四、A2-Net(Double A…

Stable Diffusion AI绘画系列【23】:赛博朋克-机甲美女系列

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代,恶意攻击者的主要攻击手法是将可执行脚本(WebShell)上传至目标服务器,以达到控制目标服务器的目的。 此漏洞成立的前提条件至少有下面两个: 1.可以上传对应的脚本文件,…

Java 8 新特性深度解析:探索 Lambda 表达式、Stream API 和函数式编程的革新之路

Java8 新特性 Java 8 的革新之路 自 1995 年首次发布以来,Java 已经成为世界上最广泛使用的编程语言之一。随着时间的推移,Java 经历了多次版本更新,其中最具里程碑意义的便是 Java 8 的发布。这个版本引入了许多重大变革,包括 …

vivado时序方法检查11

TIMING-47 &#xff1a; 同步时钟之间的伪路径、异步时钟组或仅最 大延迟数据路径约束 在 <clock_group> 与 <clock_group> 这两个时钟之间设置了 <message_string> 时序约束 &#xff08; 请参阅 VivadoIDE 的“ Timing Constraint ”窗口中的约束位…

Oracle(2-13) RMAN Complete Recove

文章目录 一、基础知识1、Restoration Using RMAN利用RMAN进行恢复2、Relocate a Tablespace 重新定位表空间 二、基础操作1、恢复前的准备2、恢复数据库3、恢复单个数据文件4、在数据库打开的情况下恢复 RMAN Complete Recove RMAN完全恢复 目标&#xff1a; 了解RMAN用于恢复…

HarmonyOS应用开发者基础认证考试(稳过)

判断题 ​​​​​​​ 1. Web组件对于所有的网页都可以使用zoom(factor: number)方法进行缩放。错误(False) 2. 每一个自定义组件都有自己的生命周期正确(True) 3. 每调用一次router.pushUrl()方法&#xff0c;默认情况下&#xff0c;页面栈数量会加1&#xff0c;页面栈支持的…

基于ssm校园教务系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园教务信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

Fall in love with English

Fall in love with English 爱上英语 Hiding behind the loose dusty curtain, a teenager packed up his overcoat into the suitcase. 躲藏在布满尘土的松软的窗帘后边&#xff0c;一个年轻人打包他的外套到行李箱中。 He planned to leave home at dusk though there was th…