gateway网关
一、介绍
SpringCloud Gateway是Spring官方出品,基于Spring5+Reactor技术开发的网关,性能强劲基于Reactor+WebFlux、功能多样,基于springboot2.x, 直接可以jar包方式运行
官网地址:https://spring.io/projects/spring-cloud-gateway
二、依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>三、配置文件
route组成部分
id:路由的ID
uri:匹配路由的转发地址
predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。
order:路由的优先级,数字越小,优先级越高。
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes: #数组形式
- id: cloud-order
#uri: http://127.0.0.1:8000 #想要转发到的地址,输入ip表示不接入注册中心的时候
uri: lb://cloud-order # 从nacos获取名称转发,lb是负载均衡轮训策略
order: 1 #优先级,数字越小优先级越高
predicates: #断言 配置哪个路径才转发
- Path=/order-server/**
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第一层前缀
discovery:
locator:
enabled: true #开启网关拉取nacos的服务四、交互流程
客户端向Spring Cloud Gateway发出请求
如果网关处理程序映射确定请求与路由匹配
则将其发送到网关Web处理程序
通过特定过滤器链运行,前置处理-后置处理
五、断言
Predicate 来源于Java8,接受输入参数,返回一个布尔值结果,Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则, 如转发的判断条件,SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。支持多个Predicate请求的转发是必须满足所有的Predicate后才可以进行路由转发
predicates:
#指定地址才能访问
- Host=**.spring.io
#path列表作为参数,使用Spring的PathMatcher匹配path,可以设置可选变量
#其中的segment变量可以通过下面方式获取:
#PathMatchInfo variables = exchange.getAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE);
#Map<String, String> uriVariables = variables.getUriVariables();
#String segment = uriVariables.get("segment");
- Path=/user/{segment},/user/{segment}
#通过HTTP的method来匹配路由
- Method=GET
#指定header匹配,一个header的name,一个是正则匹配的value
- Header=X-Request-Id, \d+ #指定请求头才能访问
#通过一个或两个参数来匹配路由,一个是查询的name,一个是查询的正则value,只有一个参数表示只要请求带有参数即可,有两个表示要有这个参数,并且值要匹配第二个值
- Query=aa, tes.
#使用的是时间作为匹配规则,只要当前时间大于设定时间,路由才会匹配请求
- After=2020-12-25T12:00:47.789+08:00
##使用的是时间作为匹配规则,只要当前时间小于设定时间,路由才会匹配请求
- Before=2020-12-25T12:00:47.789+08:00
#使用两个时间作为匹配规则,只要当前时间大于第一个设定时间,并小于第二个设定时间,路由才会匹配请求。
- Between=2018-12-25T14:33:47.789+08:00, 2018-12-26T14:33:47.789+08:00六、过滤器
过滤器生命周期
PRE: 这种过滤器在请求被路由之前调用,一般用于鉴权、限流等
POST:这种过滤器在路由到微服务以后执行,一般用于修改响应结果,比如增加header信息、打点结果日志
网关过滤器分类,
局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以 GatewayFilterFactory 结尾。顶级接口 GatewayFilterFactory
全局过滤器:作用全部路由上。顶级接口 GlobalFilter
七、自定义全局过滤器
package com.lcy.cloud.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @Description 用户token过滤器
* @Author lcy
* @Date 2021/8/1 11:34
*/
@Component
public class UserTokenFilter implements GlobalFilter, Ordered {
@Override public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain){
String token = exchange.getRequest().getHeaders().getFirst("token");
//处理逻辑
return chain.filter(exchange);
}
@Override public int getOrder(){
return 0;
}
}