首页 > 其他分享 >gateway笔记

gateway笔记

时间:2024-01-17 22:33:39浏览次数:28  
标签:java 请求 笔记 public springframework import gateway

自定义断言

  • 新增一个Bean 标记为@Component、
    • 继承AbstractRoutePredicateFactory类命名需要以 RoutePredicateFactory结尾
    • 声明一个静态内部类 来接受配置文件中的信息
    • 重写 shortcutFieldOrder 来映射 配置文件中的参数
    • 重写apply方法

下面是一个根据 请求头和时间 来决定是否放心请求的例子

yaml配置

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user_router
          uri: lb://user-service
          predicates:
            - Path=/user-serv/**
   #当请求的为FirstHeader 值为 FirstValue 时间在2024-01-19 之前的请求放行到user-service服务
            - Custom=test, testValue,2024-01-19 
          filters:
            - StripPrefix=1

实现类

package com.cckeep.gateway.predicates;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.function.Predicate;

@Component
@Slf4j
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {
    //需要与前面配置文文件中第一个值名称一致 因为前面我业务上把第一个当做请求头head 
    private static final String HEAD_KEY = "test";
    
    public CustomRoutePredicateFactory() {
        super(Config.class);
    }
    //把前面配置文件的值通过set方法按顺序 映射到 Config
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("head", "value", "limitTime");
    }

    @Validated
    public static class Config {
        @Setter
        @Getter
        private String head;
        @Setter
        @Getter
        private String value;
        @Getter
        private Date limitTime;
        public Config() {
        }
      //  读取配置文件出来的是String 所以这里重写set方法
        public void setLimitTime(String limitTime) {
            try {
                this.limitTime = new SimpleDateFormat("yyyy-MM-dd").parse(limitTime);
            } catch (ParseException e) {
                log.error("格式化时间错误");
                throw new RuntimeException(e);
            }
        }
    }
    @Override
  //真正处理逻辑的地方  
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                List<String> heads = serverWebExchange.getRequest().getHeaders().getOrDefault(HEAD_KEY, Collections.emptyList());
                if (heads.isEmpty()) {
                    return false;
                }
                for (int i = 0; i < heads.size(); i++) {
                    if (config.getValue().equals(heads.get(i)) && new Date().before(config.getLimitTime())) {
                        return true;
                    }
                }
                return false;
            }
        };
    }

}

测试

这是我的controller

通过apiPost发请求测试


当请求头 和值 与配置一致时候请求成功

修改请求头不一致 请求失败

标签:java,请求,笔记,public,springframework,import,gateway
From: https://www.cnblogs.com/icemomo/p/17971362

相关文章

  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 算法笔记
    1.回溯法(Backtracking)应用:组合、排列、子集等组合型问题,0/1背包问题、图的着色问题等。时空复杂度:时空复杂度较高,指数级别。时间复杂度:O(2^n)或更高,其中n是问题规模。空间复杂度:O(n)或更高,取决于递归深度。特性:通过深度优先搜索遍历解空间。需要撤销选择,回溯到上一步......
  • 学习笔记——ST算法
    ST算法ST算法是一种运用倍增来解决RMQ问题也就是区间最值问题的算法。给定一个长度为\(N\)的序列\(A\),ST算法能在\(\mathcalO(NlogN)\)的时间预处理后,以\(\mathcalO(1)\)的时间在线回答区间最值问题。设\(F_{i,j}\)表示序列\(A\)中下标在子区间\(\left[i,......
  • 学习笔记——线段树
    线段树(SegmentTree)1.建树首先我们要明白线段树中的每个节点都代表一个区间,而对于线段树中的每个内部节点\(\left[l,r\right]\),它的左子节点是\(\left[l,mid\right]\),右子节点是\(\left[mid+1,r\right]\),其中\(mid=(l+r)/2\)(向下取整)。然后我们可以让根节点的编号为\(......
  • Stack-array based implementation【1月17日学习笔记】
    点击查看代码//Stack-arraybasedimplementation#include<iostream>usingnamespacestd;#defineMAX_SIZE101intA[MAX_SIZE];//globleinttop=-1;//globlevoidpush(intx){ if(top==MAX_SIZE-1){ cout<<"error:stackoverflow"&l......
  • Numpy学习笔记
    1、创建数组直接创建数组np.array([1,2,3,4])创建指定形状和内容的数组numpy.zeros(shape,dtype=float,order='C')numpy.ones(shape,dtype=float,order='C')numpy.empty(shape,dtype=float,order='C')参数描述shape数组形状dtype数据类......
  • Doubly linked list【1月17日学习笔记】
    点击查看代码//Doublylinkedlist#include<iostream>usingnamespacestd;structnode{ intdata; node*next; node*prev;};//定义双向链表结构体node*A;node*getnewnode(intx){ node*temp=newnode; temp->data=x; temp->prev=NULL; temp->nex......
  • 【学习笔记】后缀自动机 SAM
    一.后缀自动机的定义SAM(SuffixAutomaton)是一种有限状态自动机,仅可以接受一个字符串的所有后缀。如果您不懂自动机,那么换句话说:SAM是一个有向无环图。称每个结点为状态,边为状态间的转移,每个转移标有一个字母,同一节点引出的转移不同。SAM存在一个源点\(S\),称为初始状态......
  • 【学习笔记】整体二分
    一.整体二分概念整体二分的主体思路就是把多个查询一起解决,是一个离线算法。其要求:询问的答案具有可二分性修改对判定答案的贡献互相独立,修改之间互不影响效果修改如果对判定答案有贡献,则贡献为一确定的与判定标准无关的值贡献满足交换律,结合律,具有可加性题目允......
  • 【学习笔记】线段树合并
    一.普通线段树合并线段树合并就是建立一棵新的线段树保存原有的两棵线段树的信息。两棵线段树当前要合并的点所表示的区间是一样的。线段树合并的过程很简单。如果A有p位置,B没有,新的线段树p位置赋成A,返回A;如果B有p位置,A没有,新的线段树p位置赋成B,返回A;如果合并到叶子结......