springcloud第4季 springcloud-gateway网关filter案例场景

发布于:2024-06-11 ⋅ 阅读:(36) ⋅ 点赞:(0)

一  filter作用

1.1 filter搭建流程

1.1.1 网关配置

1.1.2 服务提供者

1.1.3 测试验证

1.启动consul

2.启动zipkin

3.启动应用微服务

4.进行访问:  http://localhost:6666/pay/wg/filter

1.2  其他常见API

RemoveRequestHeader=sec-fetch-site      # 删除请求头sec-fetch-site
#- SetRequestHeader=sec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy
#- AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v

二   自定义网关统计接口耗时

2.1  编写统计耗时接口类

1.截图

2.具体代码:

package com.jurf.ms.gateway6666.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @auther zzyy
 * @create 2023-12-31 21:05
 */
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered
{
    public static final String BEGIN_VISIT_TIME = "begin_visit_time";//开始调用方法的时间

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        //1 先记录下访问接口的开始时间
        exchange.getAttributes().put(BEGIN_VISIT_TIME,System.currentTimeMillis());
        //2 返回统计的各个结果给后台
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);
            if(beginVisitTime != null)
            {
                log.info("访问接口主机:"+exchange.getRequest().getURI().getHost());
                log.info("访问接口端口:"+exchange.getRequest().getURI().getPort());
                log.info("访问接口URL:"+exchange.getRequest().getURI().getPath());
                log.info("访问接口URL后面参数:"+exchange.getRequest().getURI().getRawQuery());
                log.info("访问接口时长:"+(System.currentTimeMillis() - beginVisitTime) + "毫秒");
                log.info("============分割线==========================");
                System.out.println();
            }
        }));
    }

    /**
     * 数字越小,优先级越高
     * @return
     */
    @Override
    public int getOrder()
    {
        return 0;
    }
}

2.2 启动服务统计耗时

1.启动服务

2.请求地址:

http://localhost:8081/feign/pay/gateway/zdy/1?cityName=sz

3.耗时统计显示:

三   自定义网关过滤指定参数

2.1  编写过滤参数代码

package com.jurf.ms.gateway6666.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

/**
 * @auther zzyy
 * @create 2023-12-31 21:41
 */
@Component
public class ZdyGatewayFilterFactory extends AbstractGatewayFilterFactory<ZdyGatewayFilterFactory.Config>
{
    public ZdyGatewayFilterFactory()
    {
        super(Config.class);
    }


    @Override
    public GatewayFilter apply(Config config)
    {
        return new GatewayFilter()
        {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
            {
                ServerHttpRequest request = exchange.getRequest();
                System.out.println("进入了自定义网关过滤器MyGatewayFilterFactory,status:"+config.getStatus());
                if(request.getQueryParams().containsKey("guangzhou")){
                    return chain.filter(exchange);
                }else{
                    exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
                    return exchange.getResponse().setComplete();
                }
            }
        };
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("status");
    }

    public static class Config
    {
        @Getter@Setter
        private String status;//设定一个状态值/标志位,它等于多少,匹配和才可以访问
    }
}
//单一内置过滤器GatewayFilter

2.2 配置

在filters的配置项,如下:

2.3 测试

1.请求地址:http://localhost:6666/pay/wg/filter?guangzhou=234

2.console控制台:status的值为gz,可以和请求参数的值guagnzhou=234   即gz和234 是否相等做一下业务逻辑判断的场景。


网站公告

今日签到

点亮在社区的每一天
去签到