SpringCloud Gateway(二)自定义谓词工厂
Gatewayadmin 发布于:2023-01-29 17:41:28
阅读:loading
很多时候Gateway内置的谓词工厂不能够覆盖我们的业务需求,难免我们会进行自定义谓词工厂,说白了就是我们需要自定义http请求的匹配逻辑,可以是从URL请求的各个地方切入做逻辑的匹配,当匹配通过后执行对应匹配的微服务,所以一个简单的自定义谓词工厂的示例参考如下代码所示:
spring:
application:
name: chendd-gateway
#gateway 网关
gateway:
discovery:
locator:
# 开启当前项目的服务注册与发现功能
enabled: true
# 把服务名转换为小写
lower-case-service-id: true
routes:
# 匹配 nacos-client 路径下的所有子路径路由
- id: nacos-client-urlContains
uri: lb://chendd-nacos-client
order: 10010
predicates:
- UrlContains= /nacos-client/hello/list , /nacos-client/hello/\w+
package cn.chendd.cofig.predicates;
import com.google.common.collect.Lists;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import java.util.List;
import java.util.function.Predicate;
/**
* url包含特定文本的请求过滤,若url请求中包含了配置的子url(不区分大小写),符合则进行过滤
*
* @author chendd
* @date 2022/12/25 19:43
*/
@Component
public class UrlContainsRoutePredicateFactory extends AbstractRoutePredicateFactory<UrlContainsRoutePredicateFactory.Config> {
public UrlContainsRoutePredicateFactory() {
super(Config.class);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return serverWebExchange -> {
String path = serverWebExchange.getRequest().getPath().toString();
List<String> values = config.getValues();
for (String value : values) {
if (path.matches(value) || path.equalsIgnoreCase(value)) {
return true;
}
}
return false;
};
}
/**
* 设置参数映射的数据类型:List<String>
* @return 数据类型
*/
@Override
public ShortcutType shortcutType() {
return ShortcutType.GATHER_LIST;
}
/**
* 设置配置的参数值与属性名称的映射
* @return 属性集合
*/
@Override
public List<String> shortcutFieldOrder() {
return Lists.newArrayList("values");
}
@Validated
public static class Config {
/**
* 参数值
*/
private List<String> values;
public List<String> getValues() {
return values;
}
public void setValues(List<String> values) {
this.values = values;
}
}
}
(1)lb://chendd-nacos-client是ribbon中的负载均衡的请求协议,需要结合注册中心;
(2)UrlContains是自定义的谓词工厂名称,使用配置时必须紧跟等于号,参数值得前后支持空格隔开,多个参数值可使用英文逗号分隔,支持正则表达式;
(3)UrlContainsRoutePredicateFactory类名存在限定的写法,前缀表示配置文件中的声明部分,后缀是固定;
(4)源码示例见:源码下载.txt;
点赞
发表评论
当前回复:作者