@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();
}
}
@Log4j2
public final class FilterUtils {
public static final String CORRELATION_ID = "tmx-correlation-id";
public static final String AUTH_TOKEN = "tmx-auth-token";
public static final String USER_ID = "tmx-user-id";
public static final String ORG_ID = "tmx-org-id";
public static final String PRE_FILTER_TYPE = "pre";
public static final String POST_FILTER_TYPE = "post";
public static final String ROUTE_FILTER_TYPE = "route";
public static String getCorrelationId(HttpHeaders headers) {
List<String> correlationIds = headers.get(CORRELATION_ID);
if (correlationIds != null) {
return correlationIds.stream().findFirst().get();
}
return null;
}
public static ServerWebExchange setRequestHeader(
ServerWebExchange exchange, String name, String value) {
ServerHttpRequest request = exchange.getRequest().mutate()
.header(name, value)
.build();
return exchange.mutate()
.request(request)
.build();
}
public static ServerWebExchange setCorrelationId(
ServerWebExchange exchange, String correlationId) {
return setRequestHeader(exchange, CORRELATION_ID, correlationId);
}
}
http://localhost:8072/organization-service/v1/organization/100
tmx-correlation-id generated in tracking filter: 3fef7f9d-0234-4a16-9736-22f5e964
如果在控制台上看不到消息,只需将以下清单中显示的代码行添加到网关服务器的 application.yml 配置文件中:
logging:
level:
com.netflix: WARN
org.springframework.web: WARN
com.study: DEBUG