Java Spring云网关:未路由请求,最终遇到413请求实体过大
我试图建立一个简单的SpringCloudGateway示例 我有两个docker容器在本地运行,当到达以下端点时,它们将以Java Spring云网关:未路由请求,最终遇到413请求实体过大,java,spring,rest,gateway,spring-cloud-gateway,Java,Spring,Rest,Gateway,Spring Cloud Gateway,我试图建立一个简单的SpringCloudGateway示例 我有两个docker容器在本地运行,当到达以下端点时,它们将以AAA和ZZZ响应 http://localhost:2000/restmessage http://localhost:2001/restmessage 我正在尝试创建一个简单的网关,它将路由到这些服务之一。最终会有实际的逻辑来做出这个决定,但现在我只想看到一些工作,并已硬编码到第一个实例 这是我的GlobalFilter @组件 公共类MacFilter实现了Glob
AAA
和ZZZ
响应
http://localhost:2000/restmessage
http://localhost:2001/restmessage
我正在尝试创建一个简单的网关,它将路由到这些服务之一。最终会有实际的逻辑来做出这个决定,但现在我只想看到一些工作,并已硬编码到第一个实例
这是我的GlobalFilter
@组件
公共类MacFilter实现了GlobalFilter{
@凌驾
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
ServerWebExchange modifiedExchange=exchange.mutate()
.request(rq->rq.uri)(
UriComponentsBuilder.fromUri(exchange.getRequest().getURI())
.host(“本地主机”)
.港口(2000年)
.build()
.toUri()
))
.build();
//ServerWebExchangeUtils.setAlreadyRouted(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请求实体太大
。通过观察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尝试了这一点,但它们都表现出相同的行为
我已经在所有的文档中搜索过了,但是我能找到的一切似乎都表明这应该是可行的。有人能帮我吗?也许像尤里卡这样的探索中心能解决你的问题
- 首先,向eureka注册docker服务器李>
- 然后,给spring云网关一个eureka配置李>
- 最后,在SpringCloudGateway应用程序类中设置@EnableDiscoveryClient
此外,本期的帖子可以给您很大帮助:您要做的是定义到后端服务的路由。在您当前的设置中,您正在创建一个到8081端口上运行的服务的路由,据我在您的描述中所知,该端口上没有运行的服务 换句话说,如果您有两个相同的服务,一个运行在localhost:2000上,另一个运行在localhost:2001上,那么您将需要两个路由,一个用于一个服务,另一个用于另一个。当然,由于服务公开了相同的端点,您需要一些东西来区分要路由到哪个服务。例如,这可以通过向请求添加头来完成 示例设置可以是这样的。在application.yaml中(因此不在application.properties中,它也可以在属性文件中完成,但yaml更适合此目的),放置如下内容:
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: 2000service
uri: http://localhost:2000
predicates:
- Path=/restmessage
- Header=route, service-one
- id: 2001service
uri: https://localhost:2001
predicates:
- Path=/restmessage
- Header=route, service-two
您可以去掉您的全局过滤器和您定义的属性。现在启动您的应用程序:
mvn spring-boot:run
然后对您的服务进行卷曲(假设您的网关在端口8080上运行):
您现在应该看到您的请求被路由到端口2000上运行的服务
希望这有帮助 感谢您的回复,但不幸的是,我无法提前知道我的路线,无法在配置中填充它们。这个特定的例子很简单,没有包含这个细节,但最终我不得不依赖外部服务来路由。我将基于服务响应构建一个缓存,以便它能够快速运行,但缓存和路由必须由外部服务确定。所以我真正需要的是一种基于普通java中缓存内容的动态路由方法。
curl http://localhost:8080/restmessage -H "route: service-one"