欢迎光临散文网 会员登陆 & 注册

SpringGateway网关

2022-08-03 19:56 作者:星月袭空  | 我要投稿

奈非框架简介

早期(2020年前)奈非提供的微服务组件和框架受到了很多开发者的欢迎

这些框架和SpringCloud Alibaba的对应关系我们要了解

Nacos对应Eureka都是注册中心

Dubbo对应Ribbon+feign都是实现微服务远程调用的组件

Sentinel对应Hystrix都是项目限流熔断降级的组件

Gateway对应Zuul都是网关项目

Gateway框架不是阿里写的,是Spring提供的

什么是网关

"网"指网络,"关"指关口或关卡

网关:就是指网络中的关口\关卡

网关就是当前微服务项目的"统一入口"

程序中的网关就是当前微服务项目对外界开放的统一入口

因为提供了统一入口之后,方便对所有请求进行统一的检查和管理

网关的主要功能有

  • 将所有请求统一由经过网关

  • 网关可以对这些请求进行检查

  • 网关方便记录所有请求的日志

  • 网关可以统一将所有请求路由到正确的模块\服务上

路由的近义词就是"分配"

Spring Gateway简介

我们使用Spring Gateway作为当前项目的网关框架

Spring Gateway是Spring自己编写的,也是SpringCloud中的组件

SpringGateway官网

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

简单网关演示

SpringGateway网关是一个依赖,不是一个软件

所以我们要使用它的话,必须先创建一个SpringBoot项目

这个项目也要注册到Nacos注册中心,因为网关项目也是微服务项目的一个组成部分

beijing和shanghai是编写好的两个项目

gateway项目就是网关项目,需要添加相关配置

我们从yml文件配置开始添加

我们使用

http://localhost:9000/bj/show可以访问beijing服务器的资源

http://localhost:9000/sh/show可以访问shanghai服务器的资源

以此类推,再有很多服务器时,我们都可以仅使用9000端口号来将请求路由到正确的服务器

就实现了gateway成为项目的统一入口的效果

动态路由

网关项目随着微服务数量的增多

gateway项目的yml文件配置会越来越多,维护的工作量也会越来越大

所以我们希望gateway能够设计一套默认情况下自动路由到每个模块的路由规则

这样的话,不管当前项目有多少个路由目标,都不需要维护yml文件了

这就是我们SpringGateway的动态路由功能

配置文件中开启即可


内置断言

断言的意思就是判断某个条件是否满足

我们之前使用了Path断言,判断请求的路径是不是满足条件,例如是不是/sh/** /bj/**

如果路径满足这个条件,就路由到指定的服务器

但是Path实际上只是SpringGateway提供的多种内置断言中的一种

还有很多其它断言

  • after

  • before

  • between

  • cookie

  • header

  • host

  • method

  • path

  • query

  • remoteaddr

时间相关

after,before,between

判断当前时间在指定时间之前,之后或之间的操作

如果条件满足可以执行路由操作,否则拒绝访问

我们先利用下面代码

获得当前时间,这个时间的格式可能是

下面在yml配置中添加新的断言配置,使用After设置必须在指定时间之后访问

必须在指定时间之后才能访问服务

否则发生404错误拒绝访问

需要注意测试时,先启动Nacos,再启动shanghai之后启动gateway

测试时必须通过9000端口访问才能有效果

使用Before设置必须在指定时间之前访问

使用Between设置必须在指定时间之间访问

要求指定请求参数

Query断言,判断是否包含指定的参数名称,包含指定参数名称才能通过路由

内置过滤器

Gateway还提供的内置过滤器

不要和我们学习的filter混淆

内置过滤器允许我们在路由请求到目标资源的同时,对这个请求进行一些加工或处理

常见过滤器也有一些

我们给大家演示一下AddRequestParameter过滤器

它的作用是在请求中添加参数

进行测试 http://localhost:9000/sh/show?name=tom

因为过滤器的存在,控制器可以获取网关过滤器添加的参数值

其他内置过滤器和自定义过滤器的使用,可以查阅相关文档自己了解;


创建gateway网关子项目

父子相认

修改子项目pom文件和依赖

application.yml文件配置如下

网关项目的knife4j配置

我们希望配置网关之后,在使用knife4j测试时

就不来回切换端口号了

我们需要配置Knife4j才能实现

在gateway项目中创建config包

SwaggerProvider

SwaggerController类

SwaggerHeaderFilter类

启动Nacos\Seata\Sentinel

启动cart\stock\order\business

最后启动gateway

可以通过10000端口测试各个业务模块的功能

http://localhost:10000/nacos-stock/doc.html

http://localhost:10000/nacos-cart/doc.html

http://localhost:10000/nacos-order/doc.html

http://localhost:10000/nacos-business/doc.html

如果不使用网关一切正常,但是启动网关访问失败的话,就是gateway项目配置问题

Gateway和SpringMvc依赖冲突问题和解决

之前网关的演示项目我们添加的网关依赖

当前项目需要配置knife4j的路由配置,需要编写一个控制器

所以我们添加了SpringMvc的依赖

这两个依赖在同一个项目中时,默认情况下启动会报错

SpringMvc框架中自带一个Tomcat服务器

而SpringGateway框架中自带一个Netty的服务器

在启动项目时,两个框架中包含的服务器都想占用相同端口,因为争夺端口号和主动权而发生冲突

导致启动服务时报错

要想能够正常启动必须在yml文件配置

reactive:反应的

添加这个配置之后,会启动netty服务器

SpringGateway网关的评论 (共 条)

分享到微博请遵守国家法律