版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yingziisme/article/details/90381759
Predict与自定义Predict
Predict(谓词)用于匹配用户的请求,来选择是否要路由
Spring Cloud Gateway自带的谓词工程列表
Predict | 说明 |
---|---|
After Route Predicate | 请求的时候发生在指定时间之后 |
Before Route Predicate | 请求发生在指定时间之前 |
Between Route Predicate | 请求发生在指定时间之间 |
Cookie Route Predicate | 请求带有指定的cookie,且值包含在指定的值列表里面 |
Header Route Predicate | 请求头带有指定的key,value满足规则 |
Host Route Predicate | 主机满足规则 |
Method Route Predicate | 指定HTTP Method |
Path Route Predicate | 指定路径规则 |
Query Route Predicate | 指定请求参数 |
RemoteAddr Route Predicate | 请求ip满足规则 |
写个demo测试一下
路由配置
routes:
- id: spring-cloud-client-demo
uri: lb://spring-cloud-client-demo
predicates:
- Path=/client/**
- Method=GET
- Header=X-Request-Id, \d+
filters:
- AddRequestHeader=X-Request-Foo, Bar
- StripPrefix=1
postman 请求 http://localhost:10001/client/demo/get?param=aaa
返回
{
"timestamp": 1558354136596,
"path": "/client/demo/get",
"status": 404,
"error": "Not Found",
"message": "No matching handler"
添加头
X-Request-Id =1
再从请求,得到正确的返回
启动的时候可以看到所有存在的predict
2019-05-20 19:39:11.389 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]
2019-05-20 19:39:11.389 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]
2019-05-20 19:39:11.389 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]
2019-05-20 19:39:11.389 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]
2019-05-20 19:39:11.389 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]
2019-05-20 19:39:11.389 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]
2019-05-20 19:39:11.390 INFO 8156 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]
编写自己的Predict
package com.mt.demo.gateway.predict;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import javax.validation.constraints.NotEmpty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
/**
* UserRoutePredicateFactory
*
* @author mt.luo
* @description:
*/
@Slf4j
@Component
@Order(1)
public class UserRoutePredicateFactory extends AbstractRoutePredicateFactory<UserRoutePredicateFactory.Config> {
private String user = "mt";
public UserRoutePredicateFactory() {
super(UserRoutePredicateFactory.Config.class);
}
@Override
public ShortcutType shortcutType() {
return ShortcutType.GATHER_LIST;
}
@Override
public List<String> shortcutFieldOrder() {
return Collections.singletonList("sources");
}
@Override
public Predicate<ServerWebExchange> apply(UserRoutePredicateFactory.Config config) {
log.info("================config: {}", config);
return exchange -> {
if (config.sources.contains(user)) {
return true;
}
return false;
};
}
@Validated
public static class Config {
@NotEmpty
private List<String> sources = new ArrayList<>();
public List<String> getSources() {
return sources;
}
public UserRoutePredicateFactory.Config setSources(List<String> sources) {
this.sources = sources;
return this;
}
public UserRoutePredicateFactory.Config setSources(String... sources) {
this.sources = Arrays.asList(sources);
return this;
}
}
}
重启程序可以看到,以及存在了自定义的Predicate
2019-05-20 20:24:09.325 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [User]
2019-05-20 20:24:09.325 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]
2019-05-20 20:24:09.325 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]
2019-05-20 20:24:09.325 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]
2019-05-20 20:24:09.326 INFO 3448 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]
添加配置
routes:
- id: spring-cloud-client-demo
uri: lb://spring-cloud-client-demo
predicates:
- Path=/client/**
- Method=GET
- Header=X-Request-Id, \d+
- User=mt
filters:
- AddRequestHeader=X-Request-Foo, Bar
- StripPrefix=1
请求http://localhost:10001/client/demo/get?param=aaa
正常返回
把User=mt换成User=mm
则返回异常
{
"timestamp": 1558355190499,
"path": "/client/demo/get",
"status": 404,
"error": "Not Found",
"message": "No matching handler"
}