一.请求过程
大致流程:
- 请求去访问GateWay Client
- 访问GateWay Handler Mappeing 寻找有没有与路径相匹配的路由
- 根据predicate来决定访问那个路由
- 再经过pre类型的过滤器,进行请求代理
- 再经过post类型过滤器
二.predicate
-
predicate就像是一个条件,SpringCloud GateWay内置很多predicate,配置在配置文件中即可生效。
-
参考如下,需要要求发访时间在两点之间才可以通过
spring:
cloud:
gateway:
routes:
- id: between_route
uri: http://example.org
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] -
其余可参考SpringCloudGateWay官网:SpringCloudGateWay官网地址
三.Filter
filter分为pre类型过滤器和post类型过滤器,pre类型过滤器作用于访问路由前,可以进行鉴权,限流,日志输出,请求头的修改,post类型过滤器作用访问路由后,可以进行响应头协议的修改。
3.1内置Filter
SpringCloud GateWay 内置了许多Filter。
-实例配置如下,在响应头添加数据
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://example.org
filters:
- AddResponseHeader=X-Response-Foo, Bar
- 具体可参考官方文档:SpringCloudGateWay官方问答
3.2自定义Filter
-
项目现状,一共三个微服务,注册中心(registry),服务提供者(provider),网关(gateway)。provider提供两个接口/hi,/hello。
具体参考GitHub地址:GitHub地址 -
全局过滤器,实现接口GlobalFilter, Ordered ,并重写Mono(),getOrder()方法,注入IOC容器
@Component
@Slf4j
public class YourFilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info(“这里是全局过滤器”);
return chain.filter(exchange);
}@Override public int getOrder() { return 0; }
}
-
局部过滤器,实现接口,重写方法,添加到指定路由
@Slf4j
public class MyFilter implements GatewayFilter, Ordered {private static final String REQUEST_TIME_BEGIN = "requestTimeBegin"; //过滤器逻辑 @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("这里是pre类型过滤器"); return chain.filter(exchange).then( Mono.fromRunnable(() -> { log.info("这里是post类型过滤器"); }) ); } //给过滤器设定优先级别 @Override public int getOrder() { return 0; }
}
@Configuration
public class GateWayConfig {
//这个是局部的
@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path(“/provider/**”)
.filters(f -> f.filter(new MyFilter())
.addResponseHeader(“X-Response-Default-Foo”, “Default-Bar”).stripPrefix(1))
.uri(“lb://SERVER-PROVIDER”)
.order(0)
.id(“provider-routes”)
)
.build();
}
}