Spring Cloud Gateway提供了十来种路由谓词工厂。为网关实现灵活的转发提供了基石。
Spring Cloud Gateway中内置的谓词工厂,包括:
Path
访问/goods/** 相当于访问访问集群wfx-goods
gateway:
#配置路由规则
routes:
- id: wfx-goods
#请求转发到微服务集群
uri: lb://wfx-goods
predicates:
- Path=/goods/** #http://localhost:8040/goods/hello ->lb://wfx-goods/goods/hello
After
在下列时间之后才能访问
这里的时间是ZoneDateTime格式的
Before
在下列时间 之前才可以访问
Between
在下列时间之间才可以访问
Cookie
请求中带下列cookie才可以访问 可以用apifox快速查询
Header
请求头中带下列参数才可以访问
Host
下列域名才可以访问
Method
限制请求的方法 get/post
Query
请求的参数 例如localhost:8888/orders?id=1 后面的id=1 通常用于get请求
RemoteAddr
限制远程访问的ip
自定义RoutePredicateFactory
自定义谓词工厂的类名规范:后缀必须是RoutePredicateFactory
myconfig是一个实体类
package com.wfx.predicates;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
/**
* <p>title: com.wfx.predicates</p>
* author zhuximing
* description: 需求:年龄必须是18以上
*/
@Component
public class MyHeaderRoutePredicateFactory extends AbstractRoutePredicateFactory<MyConfig> {
public MyHeaderRoutePredicateFactory() {
super(MyConfig.class);
}
@Override
public Predicate<ServerWebExchange> apply(MyConfig config) {
return new Predicate<ServerWebExchange>() {
@Override
public boolean test(ServerWebExchange exchange) {
//获取请求头
//需求:请求头中必须要有 指定的kv 键值对
// String value = exchange.getRequest().getHeaders().getFirst(config.getKey());
// if (value == null) {
//
// return false;
// }else{
// if(value.equals(config.getValue())){
// return true;
// }else{
// return false;
// }
// }
if(StringUtils.isEmpty(config.getValue())){//只配置了key,但是没有配置value表 //value不等于空 只匹配key不匹配value走这个逻辑
//exchange.getRequest().getHeaders().containsKey(config.getKey())表示是 请求头里是否包含key
if(exchange.getRequest().getHeaders().containsKey(config.getKey())){
return true;
}else{
return false;
}
}else{//同时配置了key和value
//根据key获取value
String value = exchange.getRequest().getHeaders().getFirst(config.getKey());
//表示请求头里包含所配置的value 返回true
if(config.getValue().equals(value)){
return true;
}else{
return false;
}
}
}
};
}
//获取配置参数
@Override
public List<String> shortcutFieldOrder() {
//- MyHeader=bbb,cccc
//[bbb,cccc]
//bbb赋值给MyConfig#key
//cccc赋值给MyConfig#value
return Arrays.asList("key","value");
}
}
自定义路由 配置文件加上 MyHeader=1,2 设定了请求头1,2才可以访问
server:
#网关微服务的启动端口
port: 8040
spring:
application:
name: wfx-gateway #微服务的应用名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos-server的服务地址
gateway:
#配置路由规则
routes:
- id: wfx-goods
#请求转发到微服务集群
uri: lb://wfx-goods
predicates:
- Path=/goods/** #http://localhost:8040/goods/hello ->lb://wfx-goods/goods/hello
- After=2021-02-04T09:35:30.654+08:00[Asia/Shanghai]
- Cookie=age,18
- MyHeader=name,xx