SpringGateway网关
奈非框架简介
早期(2020年前)奈非提供的微服务组件和框架受到了很多开发者的欢迎
这些框架和SpringCloud Alibaba的对应关系我们要了解
现在还有很多旧项目维护是使用奈非框架完成的微服务架构
Nacos对应Eureka都是注册中心
Dubbo对应Ribbon+feign都是实现微服务远程RPC调用的组件
Sentinel对应Hystrix都是做项目限流熔断降级的组件
Gateway对应Zuul都是网关组件
Gateway框架不是阿里写的,是Spring提供的
什么是网关
"网"指网络,"关"指关口或关卡
网关:就是指网络中的关口\关卡
网关就是当前微服务项目的"统一入口"
程序中的网关就是当前微服务项目对外界开放的统一入口
所有外界的请求都需要先经过网关才能访问到我们的程序
提供了统一入口之后,方便对所有请求进行统一的检查和管理
网关项目git地址
https://gitee.com/jtzhanghl/gateway-demo.git
网关的主要功能有
- 将所有请求统一经过网关
- 网关可以对这些请求进行检查
- 网关方便记录所有请求的日志
- 网关可以统一将所有请求路由到正确的模块\服务上
路由的近义词就是"分配"
Spring Gateway简介
我们使用Spring Gateway作为当前项目的网关框架
Spring Gateway是Spring自己编写的,也是SpringCloud中的组件
SpringGateway官网
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
网关项目git地址
https://gitee.com/jtzhanghl/gateway-demo.git
简单网关演示
SpringGateway网关是一个依赖,不是一个软件
所以我们要使用它的话,必须先创建一个SpringBoot项目
这个项目也要注册到Nacos注册中心,因为网关项目也是微服务项目的一个组成部分
beijing和shanghai是编写好的两个项目
gateway项目就是网关项目,需要添加相关配置
<dependencies>
<!-- SpringGateway的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 网关负载均衡依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
我们从yml文件配置开始添加
server:
port: 9000
spring:
application:
name: gateway
cloud:
nacos:
discovery:
# 网关也是微服务项目的一个模块,需要注册到Nacos才能生效
server-addr: localhost:8848
gateway:
# route是路由的意思,下面的内容就是配置路由,因为一个网关项目可能配置很多路由,所以设计为了一个List集合
routes:
# List类型赋值时,每个元素都要以"-"开头,在一个"-"之后的所有内容,是同一个元素的属性值
# id表示当前路由的唯一标识名称,和其他名称的配置没有关联,唯一的要求就是不能和路由名称重复
- id: gateway-beijing
# uri属性配置路由目标服务器,beijing指注册到nacos名称为beijing的项目
# lb就是LoadBalance的缩写,表示支付负载均衡调用
uri: lb://beijing
# predicate是断言的意思,断言就是满足某些条件时执行某些操作的设置
predicates:
# predicates也是一个List,赋值要以"-"开头
# 断言配置的含义是如果访问网关项目的请求路径以/bj/开头,就路由到上面配置的beijing服务器
# ↓ P要大写!!!!!! **是通配任何路径
- Path=/bj/**
先启动nacos
再启动beijing
最后启动gateway
网关多路由配置
上面只配置了一个beijing的路由设置
下面我们修改yml文件也实现shanghai的路由设置
gateway:
# route是路由的意思,下面的内容就是配置路由,因为一个网关项目可能配置很多路由,所以设计为了一个List集合
routes:
- id: gateway-shanghai
uri: lb://shanghai
predicates:
- Path=/sh/**
# List类型赋值时,每个元素都要以"-"开头,在一个"-"之后的所有内容,是同一个元素的属性值
# id表示当前路由的唯一标识名称,和其他名称的配置没有关联,唯一的要求就是不能和路由名称重复
- id: gateway-beijing
# uri属性配置路由目标服务器,beijing指注册到nacos名称为beijing的项目
# lb就是LoadBalance的缩写,表示支付负载均衡调用
uri: lb://beijing
# predicate是断言的意思,断言就是满足某些条件时执行某些操作的设置
predicates:
# predicates也是一个List,赋值要以"-"开头
# 断言配置的含义是如果访问网关项目的请求路径以/bj/开头,就路由到上面配置的beijing服务器
# ↓ P要大写!!!!!! **是通配任何路径
- Path=/bj/**
在保证nacos启动的情况下
beijing服务器如果启动无需重启
启动shanghai项目
最后重启网关
测试网关路由到两个模块的效果
http://localhost:9000/bj/show可以访问beijing服务器的资源
http://localhost:9000/sh/show可以访问shanghai服务器的资源
以此类推,再有很多服务器时,我们都可以仅使用9000端口号来将请求路由到正确的服务器
就实现了gateway成为项目的统一入口的效果
动态路由
网关项目的配置会随着微服务模块数量增多而变得复杂,维护的工作量也会越来越大
所以我们希望gateway能够设计一套默认情况下自动路由到每个模块的路由规则
这样的话,不管当前项目有多少个路由目标,都不需要维护yml文件了
这就是我们SpringGateway的动态路由功能
配置文件中开启即可
server:
port: 9000
spring:
application:
name: gateway
cloud:
nacos:
discovery:
# 网关也是微服务项目的一个模块,需要注册到Nacos才能生效
server-addr: localhost:8848
gateway:
discovery:
locator:
# 开启动态路由的配置
# 默认的路由规则:在网关端口号后,先编写要路由到的目标服务器注册到Nacos的名称
# 然后再写这个模块具体访问的路径
# 例如 localhost:9001/bj/show -> localhost:9000/beijing/bj/show
enabled: true
按上面修改完配置之后
我们可以重启gateway来测试动态路由路径是否生效
动态路由生成规则为:在网关端口号后先写要路由到的目标服务器在nacos注册的名称,再编写具体路径
内置断言
我们上次课在网关配置中使用了predicates(断言)的配置
断言的意思就是判断某个条件是否满足
我们之前使用了Path断言,判断请求的路径是不是满足条件,例如是不是/sh/** /bj/**
如果路径满足这个条件,就路由到指定的服务器
但是Path实际上只是SpringGateway提供的多种内置断言中的一种
还有很多其它断言
- after
- before
- between
- cookie
- header
- host
- method
- path
- query
- remoteaddr
时间相关
after,before,between
判断当前时间在指定时间之前,之后或之间的操作
如果条件满足可以执行路由操作,否则拒绝访问
表示时间的格式比较特殊,先使用下面代码获得时间
ZonedDateTime.now()
运行程序输出,可获得当前时间,这个时间的格式可能是
2023-02-22T16:17:12.619+08:00[Asia/Shanghai]
下面在yml配置中添加新的断言配置
使用After设置必须在指定时间之后访问
routes:
- id: gateway-shanghai
uri: lb://shanghai
predicates:
- Path=/sh/**
# After是时间断言,判断当前访问时间是否晚于配置的时间
# 如果时间早于配置的时间,会发生404,只有晚于这个时间才能正常访问
# 所有断言配置都是"与"的关系
- After=2023-02-22T16:27:10.619+08:00[Asia/Shanghai]
必须在指定时间之后才能访问服务
否则发生404错误拒绝访问
需要注意测试时,先启动Nacos,再启动shanghai之后启动gateway
测试时必须通过9000端口访问才能有效果
使用Before设置必须在指定时间之前访问
predicates:
- Path=/sh/**
- Before=2023-02-22T16:31:00.619+08:00[Asia/Shanghai]
使用Between设置必须在指定时间之间访问
predicates:
- Path=/sh/**
- Between=2023-02-22T16:33:00.619+08:00[Asia/Shanghai],2023-02-22T16:33:30.619+08:00[Asia/Shanghai]
要求指定参数的请求
Query断言,判断是否包含指定的参数名称,包含参数名称才能通过路由
predicates:
- Path=/sh/**
# Query断言判断请求中是否包含参数名称为username的参数,如果不包含发生404错误
- Query=username
重启gateway测试
必须是包含username参数的请求才能访问到指定的页面
例如:http://localhost:9000/sh/show?username=tom
路由配置的设计规则
路由规则解释
路由规则一定是在开发之前就设计好的
一般可以使用约定好的路径开头来实现的
例如
gateway项目
如果路径以 /bj开头,就是要访问beijing项目
如果路径以 /sh开头.就是养访问shanghai项目