SpringGateway网关
奈非框架简介
早期(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服务器