SpringCloud Gateway(三)自定义全局过滤器
Gatewayadmin 发布于: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;
}
}
(全局过滤器访问日志)
<!-- 增加访问日志 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 -->
(内置访问日志)
(1)源码示例见:源码下载.txt;
(2)基于Netty的WebFlux框架的异步响应式代码看起来还是很复杂的;
(3)Gateway内部集成了AccessLog访问日志,需要结合日志配置启用这块的日志输出;
点赞
发表评论
当前回复:作者