SpringCloud Gateway(三)自定义全局过滤器

Gateway
placeholder image
admin 发布于:2023-01-29 17:59:48
阅读:loading

全局过滤器

很多时候Gateway内置的过滤器工厂不能够覆盖我们的业务需求,难免我们会进行自定义过滤器工厂,说白了就是我们需要自定义http请求的匹配逻辑,可以是从URL请求的各个地方切入做逻辑的匹配,当匹配通过后执行对应匹配的微服务,所以一个简单的自定义过滤器拦截实现处理。在Gateway中的过滤器区分全局和局部的过滤器,前者只需要定义声明即可,后者除了定义声明以外还需要在路由规则中进行使用声明,即全局过滤器对所有的路由请求均生效;局部过滤器只对声明了的路由才起作用。

一个用于统计请求耗时的全局过滤器实现如下:

package cn.chendd.cofig.filters;

import ...

/**
 * request请求耗时全局过滤器
 *
 * @author chendd
 * @date 2022/12/27 21:12
 */
@Component
public class RequestConsumeMillisecondsFilter implements GlobalFilter , Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //记录开始时间
        StopWatch start = StopWatch.createStarted();
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            //获取请求地址,记录结束时间
            String rawPath = exchange.getRequest().getURI().getRawPath();
            long time = start.getTime(TimeUnit.MILLISECONDS);
            GatewayLogger.getLogger().debug("request {} consume {} milliseconds" , rawPath , time);
        }));
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE + 1000;
    }
}

image.png

(全局过滤器访问日志)

启用访问日志

    <!-- 增加访问日志 begin -->
    <appender name="nettyAccessLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/access_log.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/access_log-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
        <appender-ref ref="nettyAccessLog"/>
        <appender-ref ref="CONSOLE"/>
    </logger>
    <!-- 增加访问日志 end -->

image.png

(内置访问日志)

特别说明

(1)源码示例见:源码下载.txt

(2)基于Netty的WebFlux框架的异步响应式代码看起来还是很复杂的;

(3)Gateway内部集成了AccessLog访问日志,需要结合日志配置启用这块的日志输出;



 点赞


 发表评论

当前回复:作者

 评论列表


留言区