预过滤器

创建一个名为 TrackingFilter 的过滤器,它将检查所有传入网关的请求,并确定请求中是否存在一个名为 tmx-correlation-id 的HTTP头。tmx-correlation-id 头将包含一个唯一的全局标识符(GUID),可用于跟踪用户在多个微服务之间的请求。如果HTTP头中不存在tmx-correlation-id,TrackingFilter 将生成并设置关联ID。

要在Spring Cloud Gateway中创建全局过滤器,我们需要实现 GlobalFilter 类,然后覆盖 filter() 方法。这个方法包含了过滤器实现的业务逻辑。

@Log4j2
@Order(1)
@Component
public class TrackingFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String correlationID = FilterUtils.getCorrelationId(
                exchange.getRequest().getHeaders());
        if (correlationID == null) {
            correlationID = generateCorrelationId();
            exchange = FilterUtils.setCorrelationId(exchange, correlationID);
            log.debug("tmx-correlation-id generated in tracking filter: {}.",
                    correlationID);
        } else {
            log.debug("tmx-correlation-id found in tracking filter: {}. ",
                    correlationID);
        }
        return chain.filter(exchange);
    }

    private String generateCorrelationId() {
        return UUID.randomUUID().toString();
    }
}

我们已经实现了一个名为 FilterUtils 的类,该类封装了所有过滤器共用的常见功能。

为了测试这个调用,我们可以调用我们的 organization 或 licensing 服务:

一旦调用被提交,我们应该在控制台中看到一个日志消息,该消息会在流经过滤器时输出传入的关联ID:

如果在控制台上看不到消息,只需将以下清单中显示的代码行添加到网关服务器的 application.yml 配置文件中:

Last updated