Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring云网关:未路由请求,最终遇到413请求实体过大_Java_Spring_Rest_Gateway_Spring Cloud Gateway - Fatal编程技术网

Java Spring云网关:未路由请求,最终遇到413请求实体过大

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

我试图建立一个简单的SpringCloudGateway示例

我有两个docker容器在本地运行,当到达以下端点时,它们将以
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"