我们的微服务中为什么需要网关?

news2025/1/16 2:04:36

说起 Spring Cloud Gateway 的使用场景,我相信很多小伙伴都能够脱口而出认证二字,确实,在网关中完成认证操作,确实是 Gateway 的重要使用场景之一,然而并不是唯一的使用场景。在微服务中使用网关的好处可太多了,今天我们就来逐一分析一下。

1、请求路由

首先,Gateway 的第一个重要特点就是对请求进行路由,根据不同的请求头、请求参数、请求路径等,将请求路由到不同的服务上。

从这个角度来说,Spring Cloud Gateway 所扮演的角色与 Nginx 这一类的反向代理服务器类似,之前就有小伙伴问我,Spring Cloud Gateway 和 Nginx 有啥区别?能不能用 Nginx 代替 Spring Cloud Gateway?其实,你要是单纯的只看请求路由这一个功能,那么确实可以用 Nginx 代替 Spring Cloud Gateway,然而在实际开发中,我们 Spring Cloud Gateway 所承担的责任可不仅仅是请求路由转发,还有其他方面的功能(后文有介绍),其他的功能用 Nginx 做起来就有一些吃力了。

如果用 Spring Cloud Gateway 做请求路由转发,我们可以画一张简单的架构图,如下:

2、API 组合

网关的另一个作用就是可以实现 API 的组合。当然这个一般来说需要一些代码开发,单纯的配置一般来说是无法实现需求的。

先来说说没有网关的时候我们可能会存在什么情况。

以松哥最近在录的 TienChin 项目视频为例,我有一个活动管理服务,也就是健身房定期会做一些促销活动,促销活动往往又分为线上或者线下,线上线下又继续细分为不同的渠道,如小红书推广、抖音推广、公众号推广、线下地推等等,所以,假设我现在要做一个修改活动的功能,那么当我选中一条记录,点击修改按钮,此时,客户端至少要发送两条请求:

  1. 首先根据我选中的记录的 ID,去服务端查询这条记录当前的值。
  2. 去查询活动渠道,因为活动记录中保存的是渠道 ID,我们得去查询所有的渠道信息,然后根据渠道信息才能显示出来具体的渠道。

画一张简单的架构图,类似下面这样:

如上图所示,如果你是一个微服务项目,但是却没有网关,那么前端用户一个点击事件你可能需要在后台发出 N 多个操作。并且,这 N 多个操作还都属于互联网请求,小伙伴们知道,互联网请求的一个特点就是低带宽和高延迟,连着发送两个甚至多个请求,用户体验肯定不佳。

像这样的场景,如果我们有网关,就可以在网关中提供一个粗粒度的 API,这样,前端只需要发送一个请求到网关,然后又网关去发送多个请求,从不同的微服务上把数据拿回来再统一返回给前端。如下图:

可能有小伙伴会说,你这个请求还是发送了两次,不一定省时间。其实不然!网关往往和微服务处于同一个局域网之中,相比于互联网,局域网的通信延迟就要小很多了。

这是网关的第二个作用。

3、协议切换

通过网关我们还能实现请求协议的切换。

一般来说我们暴露给外部的服务都是 RESTful API,但是,有时候考虑到服务内部的执行效率问题,我们可以在服务内容实用其他更高效的协议,通过服务网关就可以实现这个切换。

当然,这并不是必须的,只是说,当我们在微服务中使用了网关之后,如果想做请求协议的切换,就会比较容易实现。

4、限流

微服务中的限流操作,一个比较好的限流位置就是网关了,我们可以利用 Alibaba 的 Sentinel 结合 Spring Cloud Gateway 就可以非常方便的实现限流操作。

5、请求分析

如果我们需要统计某一个请求的细节,如执行时间、参数等信息,那么这个操作也可以在网关上来做,在网关上对请求进行详细分析。

6、缓存

对于一些不经常变化的数据,我们可以设置缓存时间,在网关上直接进行检查,如果缓存还没失效,直接响应 304,让从客户端读取即可。

7、认证

这个是大家比较熟悉的了。

一般来说,我们可能会有单独的认证服务,当认证请求到达网关之后,网关将之转发到相应的认证服务上去完成认证。对于非认证请求,到达网关的时候需要校验这个请求是否有进行认证,这个校验就没必要转发了,可以直接在网关上进行校验。

举个简单的例子,也是我自己之前在项目中的一个实践经验,就是用户登录请求到达网关之后,网关将之转发到专门的认证服务上去(由于认证的过程往往需要操作用户数据库,所以不要在网关上做认证,转发到专门的认证服务上去做认证操作),认证成功之后,返回 JWT 字符串给前端。下一次,请求带着 JWT 字符串来到网关,可以直接在网关上校验 JWT 字符串,这个校验本身比较容易,又不需要连接数据库,所以可以在网关上完成,校验成功之后,将校验得到的用户信息放到请求头中,然后再转发请求到不同的微服务上,这样在各个微服务上,就知道请求的用户到底是谁了。

8、记录请求日志

如果需要记录请求日志,网关也是一个好地方。

网关能干这么多事,so,想要用 Nginx 代替 Spring Cloud Gateway 显然不太现实。

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

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

相关文章

MODBUS TCP 转 PROFINET 网关从站快速配置手册

一、本案例是1500PLC通过微硬创新MODBUS TCP 转 PROFINET 网关连接组态王服务器从站快速配置,将 Modbus TCP 设备数据转接入到西门子 PROFINET 网络中 二、设备列表如下: 三、MODBUS TCP 转 PROFINET 网关从站快速配置方法步骤: 第1步&#x…

全网最详细的介绍ChatGPT:包括ChatGPT原理、应用、如何试用以及回答ChatGPT能否让程序员失业

文章目录1. 介绍ChatGPT2. ChatGPT示例3. 试用ChatGPT4. ChatGPT原理5. ChatGPT应用5.1 世界杯问题咨询5.2 写书信(情书)6. 总结1. 介绍ChatGPT 今天开车去上班的路上,听到电台介绍ChatGPT,此时百度的股价涨幅为25%,当…

谈谈Spring中Bean的生命周期?(让你瞬间通透~)

目录 1.Bean的生命周期 1.1、概括 1.2、图解 2、代码示例 2.1、初始化代码 2.2、初始化的前置方法和后置方法(重写) 2.3、Spring启动类 2.4、执行结果 2.5、经典面试问题 3.总结 1.Bean的生命周期 1.1、概括 Spring中Bean的生命周期就是Bean在…

Spring Cloud Alibaba+saas企业架构技术选型+架构全景业务图 + 架构典型部署方案

基于Spring Cloud Alibaba 分布式微服务高并发数据平台化(中台)思想多租户saas设计的企业开发架构,支持源码二次开发、支持其他业务系统集成、集中式应用权限管理、支持拓展其他任意子项目。 一、架构技术选型 核心框架 Spring Boot SOA Spring Cloud …

如何搞垮一个测试团队【反向教学,最为致命】

如何搞垮一个测试团队【反向教学,最为致命】 目录:导读 一、QA 二、项目经理 三、产品经理 四、开发人员 五、测试人员 六、组织文化 七、组织战略 要想彻底搞垮一个测试团队并非易事,需要多角色通力配合、多方联动、综合施策&#x…

FFmpeg5.0源码阅读——内存池AVBufferPool

摘要:FFmpeg中大多数数据存储比如AVFrame,AVPacket都是通过AVBufferRef管理的,而承载数据的结构为AVBuffer。本文主要通过FFmpeg源码来分析下FFmpeg中AVBuffer相关的实现。 关键字:AVBuffer、AVBufferPool、AVBufferPool 1. AVBufferRef 1.…

谁说菜鸟不会数据分析,不用Python,不用代码也轻松搞定

作为一个菜鸟,你可能觉得数据分析就是做表格的,或者觉得搞个报表很简单。实际上,当前有规模的公司任何一个岗位如果没有数据分析的思维和能力,都会被淘汰,数据驱动分析是解决日常问题的重点方式。很多时候,…

RS232串口之RTS与CTS作用

RTS与CTS的定义 RTS和CTS用于流控,提供了流控信号,但实际的流控功能还是要在软件实现,就是说即使硬件上RTS和CTS做了连线,但软件没有使用这两个信号,则通信就如无流控状态。 RTS (Require ToSend&#xf…

力扣64.最小路径和

文章目录力扣64.最小路径和题目描述方法1:动态规划力扣64.最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步…

爱了爱了,这些顶级的 Python 工具包太棒了

Python 语言向来以丰富的第三方库而闻名,今天来介绍几个非常nice的库,有趣好玩且强大!推荐好好学习。 文章目录技术交流数据采集AKShareTuShareGoPUPGeneralNewsExtractor爬虫playwright-pythonawesome-python-login-modelDecryptLoginScylla…

「题解」关于sizeof陷阱,无符号整形,变种水仙花数

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 sizeof陷阱以及无符号整形 让我们看一下这段代码:​​​​​​​ int main(){ int x …

C语言操作符详解(下)

提示:本篇内容是C语言操作符详解下篇 文章目录前言八、条件表达式九、逗号表达式十、 下标引用、函数调用和结构成员1. [ ] 下标引用操作符2. ( ) 函数调用操作符3.结构成员访问操作符十一、表达式求值1. 隐式类型转换举例说明1举例说明2举例说明32.算数转换3.操作…

三子棋——【保姆级C语言小游戏】

前言:今天七七为大家带来的是C语言中比较简单的小游戏“三子棋” 下面跟着七七一起来学习吧! 文章目录游戏整体思路游戏的实现流程游戏的实现菜单的打印创建与初始化棋盘玩家下棋电脑下棋判断输赢代码的整体运行游戏整体思路 我们需要三个文件&#xff…

Nginx 配置文件详细介绍

1、大致说明 Nginx 包含很多配置文件,但是主要配置文件是:/usr/local/nginx/conf/nginx.conf。去掉全部注释后,配置文件的主体结构为: worker_processes 1;events {worker_connections 1024; }http {include mime.types…

勒索病毒整体攻击态势简单分析

声明 本文是学习2018勒索病毒白皮书政企篇. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 勒索病毒整体攻击态势 2018年,勒索病毒攻击特点也发生了变化:2017年,勒索病毒由过去撒网式无差别攻击逐步转向以服务器定…

python(14)--集合

前言 本篇文章学习的是 python 中集合的基础知识。 集合元素的内容是不可变的,常见的元素有整数、浮点数、字符串、元组等。至于可变内容列表、字典、集合等不可以是集合元素。虽然集合不可以是集合的元素,但是集合本身是可变的,可以去增加或…

代码随想录算法训练营第六十四天_第十章_单调栈 | 84. 柱状图中最大的矩形

LeetCode 84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的 矩形的最大面积。 视频讲解文章讲解https://programmercarl.com/0084.%E6%9F%B1%E7%8A%…

【MyBatis】| MyBatis的缓存

目录 一:MyBatis的缓存 1. ⼀级缓存 2. ⼆级缓存 3. MyBatis集成第三方缓存EhCache(了解) 一:MyBatis的缓存 (1)缓存(cache):提前把数据存放到缓存当中,下一次使用的时候&#x…

谷歌浏览器无法自动更新怎么办

越来越多的小伙伴选择使用谷歌浏览器,近期有小伙伴发现谷歌浏览器突然无法自动升级更新了,这是怎么回事,遇到这种问题应该怎么解决呢,下面小编就给大家详细介绍一下谷歌浏览器无法自动更新的解决方法,大家感兴趣的话就…

「ChatGPT」一夜之间“火爆出圈“【杞人忧天 or 未雨绸缪】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…