场景:
将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务

AllToOneGatewayFilterFactory
java
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class AllToOneGatewayFilterFactory extends AbstractGatewayFilterFactory<AllToOneGatewayFilterFactory.Config> {
public AllToOneGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
request.getURI();
// 替换路径
String path = request.getPath().toString();
ServerHttpRequest modifiedRequest = request.mutate().header(config.headerName, path).path(config.getToPath()).build();
exchange = exchange.mutate().request(modifiedRequest).build();
log.info("AllToOne: headers{{}:{}}, {} ---> {}", config.getHeaderName(),path, request.getURI(), modifiedRequest.getURI());
return chain.filter(exchange);
};
}
@Setter
@Getter
public static class Config {
private String headerName;
private String toPath;
}
}
bash
spring:
cloud:
gateway:
httpclient:
ssl:
useInsecureTrustManager: true
routes:
- id: AllToOne_fnpt
uri: http://localhost:19982
predicates:
- Path=/**
filters:
- name: AllToOne
args:
headerName: api-path
toPath: /api/unified
注意:1.类名必须以GatewayFilterFactory结尾否则会出现不识别 的情况
2.配置的filters -name 的值为类的前缀(截取GatewayFilterFactory之后的)