Spring Gateway是Spring自己编写的,也是SpringCloud的组件
SpringGateway官网:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
StringGateway网关是一个依赖,不是一个软件
使用时需要创建一个SpringBoot项目
使用时也需注册到Nacos注册中心中,网关项目也是微服务的一个组成部分
需添加以下配置:
org.springframework.cloud
spring-cloud-starter-gateway
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-loadbalancer
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/**
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/**
网关项目的配置会随着微服务模块增多而变得复杂,后期维护的工作量也会增大
我们希望gateway能自动理由到每个模块的路由
这样不管当前项目有多少个路由目标,都不需要再去维护yml文件了
需要在配置文件添加Gateway的动态路由功能:
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
配置中使用了内置断言:
断言的意思就是判断某个条件是否满足,
上面配置中使用了Path断言,判断请求的路径是不是满足条件
如果路径满足这个条件,就路由到指定的服务器,
Path断言只是断言中的一种,下面列举其他的断言:
after,before,between
判断当前时间在指定时间之前,之后或中间的操作
条件满足则可以执行路由操作,反之拒绝访问
表示时间的格式较特殊可以用下面代码获得时间:
ZonedDateTime.now()
例:在yml配置中添加新的断言配置:
使用After设置在指定时间之后才能访问,否则会报404错误拒绝访问
routes:
- id: gateway-shanghai
uri: lb://shanghai
predicates:
- Path=/sh/**
# After是时间断言,判断当前访问时间是否晚于配置的时间
# 如果时间早于配置的时间,会发生404,只有晚于这个时间才能正常访问
# 所有断言配置都是"与"的关系
- After=2023-02-22T16:27:10.619+08:00[Asia/Shanghai]
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还提供内置过滤器:
但是不要和我们代码中的filter混淆
内置过滤器允许我们在路由请求到目标资源的同时,对这个请求进行加工或处理:
常见的过滤器比如:
AddRequestParament过滤器
它的作用是请求中添加参数和它对应的值
routes:
- id: gateway-shanghai
uri: lb://shanghai
filters:
- AddRequestParameter=age,18
predicates:
- Path=/sh/**
# Query断言判断请求中是否包含参数名称为username的参数,如果不包含发生404错误
- Query=username
添加之后在控制器则需要进行接收:
@GetMapping("/show")
public String show(String username,Integer age){
System.out.println(ZonedDateTime.now());
return "这里是上海!姓名:"+username +"年龄:"+age;
}
今日学习到此结束,感谢你的阅读,如有疑问或者问题欢迎私信,我会帮忙解决,如果没有回,那我就是在学习