SpringCloud Gateway(二)自定义谓词工厂

Gateway
placeholder image
admin 发布于: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


 点赞


 发表评论

当前回复:作者

 评论列表


留言区