【发布时间】:2020-10-06 12:04:45
【问题描述】:
我正在尝试设置一个简单的 Spring Cloud Gateway 示例。
我有 2 个本地运行的 docker 容器,当以下端点被命中时,它们将响应 AAA 和 ZZZ
http://localhost:2000/restmessage
http://localhost:2001/restmessage
我正在尝试制作一个简单的网关来路由到这些服务之一。最终会有实际的逻辑来做出这个决定,但现在我只想看到一些工作,并且已经硬编码到第一个实例。
这是我的GlobalFilter
@Component
public class MacFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerWebExchange modifiedExchange = exchange.mutate()
.request(rq -> rq.uri(
UriComponentsBuilder.fromUri(exchange.getRequest().getURI())
.host("localhost")
.port(2000)
.build()
.toUri()
))
.build();
// ServerWebExchangeUtils.setAlreadyRouted(modifiedExchange);
return chain.filter(modifiedExchange);
}
}
和属性
spring.cloud.gateway.routes[0].id=routezero
spring.cloud.gateway.routes[0].uri=http://localhost:8081
spring.cloud.gateway.routes[0].predicates[0]=Path=/restmessage
每次我使用 restmessage (http://localhost:8080/restmessage) 访问网关时,都会运行此过滤器。但是如果注释掉的setAlreadyRouted 方法被注释掉了,它会命中数百次。最终 curl 命令失败并返回 413 REQUEST ENTITY TOO LARGE。通过查看 docker 服务的日志,我可以知道它们从未被命中。
$ curl localhost:8080/restmessage -i
HTTP/1.1 413 Request Entity Too Large
content-length: 0
如果我取消注释 setAlreadyRouted 方法,它不再调用数百次,请求立即返回,但响应为空,并且不再调用 docker 容器。
$ curl localhost:8081/restmessage -i
HTTP/1.1 200 OK
content-length: 0
我也尝试过使用 FilterFactory 和 RouteLocator Bean,但它们都表现出相同的行为。
我一直在搜寻所有文档,但我能找到的所有内容似乎都表明这应该可以工作。谁能帮帮我?
【问题讨论】:
标签: java spring rest gateway spring-cloud-gateway