玩过微服务的朋友,对SpringCloud中的SpringCloudGateway都有一定的了解。宋大哥之前不仅写过相关文章,还录制过相关视频给小伙伴们介绍一下SpringCloud。Gateway,不过在之前的介绍中,我可能更侧重于向小伙伴们介绍SpringCloudGateway的使用方法。我可能没有仔细分析为什么我们在微服务中使用SpringCloudGateway。最近有空,一起来聊聊这个话题。说起SpringCloudGateway的使用场景,相信很多小伙伴都能脱口而出认证这个词。的确,在网关中完成认证操作确实是Gateway的重要使用场景之一,但并不是唯一的使用场景。在微服务中使用网关的好处太多了,今天我们就一一分析。1、请求路由首先Gateway的第一个重要特性就是对请求进行路由,根据不同的请求头、请求参数、请求路径等,将请求路由到不同的服务,从这个角度来看SpringCloudGateway所起到的作用类似于Nginx等反向代理服务器。之前有朋友问我,SpringCloudGateway和Nginx有什么区别?可以使用Nginx代替SpringCloudGateway吗?其实如果只看请求路由的功能,确实可以用Nginx代替SpringCloudGateway。但是在实际开发中,我们SpringCloudGateway的职责不仅仅是请求路由转发,还有其他方面。function(后面介绍),其他功能用Nginx实现起来有些困难。如果使用SpringCloudGateway进行请求路由转发,我们可以画出一个简单的架构图如下:2.API组合网关的另一个作用是实现API的组合。当然,这一般需要进行一些代码开发,简单的配置一般不能满足要求。我们先说说在没有网关的情况下我们可能会发生什么。以宋哥最近录制的天津项目视频为例。我有一项活动管理服务,就是健身房会定期做一些促销活动。促销活动往往分为线上和线下,线上和线下进一步细分为不同的渠道,比如小红书促销,抖音促销,公众号促销,线下促销等等。那么,假设我要修改功能activity的,那么当我选择一条记录,点击修改按钮,此时,客户端至少需要发送两个请求:首先,根据我选择的记录的ID,去服务器端查询当前这条记录的价值。查询活动频道,因为活动记录中保存了频道ID,所以我们要查询所有的频道信息,然后根据频道信息显示具体的频道。画一个简单的架构图,类似如下:如上图所示,如果你是一个没有网关的微服务项目,那么你可能需要为前端用户的一个点击事件在后台发出N多次操作.而且,这N个操作都是互联网请求。小伙伴们都知道,互联网请求的一个特点就是低带宽和高延迟。如果连续发送两个或多个请求,用户体验肯定不会好。在这样的场景中,如果我们有一个网关,我们可以在网关中提供一个粗粒度的API。这样,前端只需要向网关发送一个请求,然后网关发送多个请求,将来自不同微服务的数据取回来,统一返回给前端。如下图所示:有朋友可能会说,你的请求还是发送了两次,不一定节省时间。其实并不是!网关通常与微服务位于同一局域网中。与互联网相比,局域网的通信延迟要小得多。这是网关的第二个作用。3.协议切换通过网关,我们还可以切换请求协议。一般来说,我们对外暴露的服务都是RESTfulAPI。但是,有时考虑到服务内部的执行效率,我们可以在服务内容中实现其他更高效的协议,而这种切换可以通过服务网关来实现。当然,这不是必须的。只是说明我们在微服务中使用网关的时候,如果要切换请求协议,会更容易实现。4、对于限流微服务中的限流操作,比较好的限流位置是网关。我们可以使用阿里巴巴的Sentinel结合SpringCloudGateway来非常方便的实现限流操作。5、请求分析如果我们需要统计某个请求的详细信息,比如执行时间、参数等,那么这个操作也可以在网关上进行,在网关上对请求进行详细分析。6、缓存对于一些不经常变化的数据,我们可以设置缓存时间,直接在网关上查看。如果缓存没有过期,我们可以直接响应304,让客户端读取。7.Authentication这个大家都很熟悉了。一般来说,我们可能会有一个单独的认证服务。当认证请求到达网关后,网关将其转发给相应的认证服务,完成认证。对于非认证请求,需要在到达网关时验证请求是否已经过认证。这个验证不需要转发,直接在网关上验证即可。宋大哥举了一个简单的例子,也是我自己之前在项目中的实践经验,即用户登录请求到达网关后,网关将其转发给专门的认证服务(因为认证过程中往往需要操作用户数据库,所以不在网关上做鉴权,交给专门的鉴权服务进行鉴权操作),鉴权成功后,返回JWT字符串给前端。下次请求带着JWT字符串来到网关时,直接在网关上验证JWT字符串就可以了。这个验证本身比较容易,不需要连接数据库,所以在网关上就可以完成。验证成功后,将验证过的用户信息放在请求头中,然后将请求转发给不同的微服务,让每个微服务都知道请求用户是谁。8.记录请求日志如果需要记录请求日志,网关也是一个不错的地方。网关可以做这么多事情,用Nginx代替SpringCloudGateway显然不现实。
