Gateway谓词工厂详解

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值