Spring boot 第一次调用时的ZuuleException(SendErrorFilter)

Spring boot 第一次调用时的ZuuleException(SendErrorFilter),spring-boot,docker,docker-compose,spring-cloud,netflix-zuul,Spring Boot,Docker,Docker Compose,Spring Cloud,Netflix Zuul,我正在用SpringCloud、SpringBoot和Docker构建一个应用程序。整个应用程序运行良好。我有几项微服务。每个项目都在Docker上运行。当我试图通过Zuul API网关使用我的微服务时,我在第一次调用时遇到了一个错误。但是如果我刷新浏览器,它就可以正常工作了。错误如下所示-- 我已经为我的所有项目创建了图像。把它推到码头上。Docker Compose文件我也将其推送到GitHub中。下面是路径 我还将其部署在EC2上的Docker Swarm上。 但当我试图通过Zuul使用

我正在用SpringCloud、SpringBoot和Docker构建一个应用程序。整个应用程序运行良好。我有几项微服务。每个项目都在Docker上运行。当我试图通过Zuul API网关使用我的微服务时,我在第一次调用时遇到了一个错误。但是如果我刷新浏览器,它就可以正常工作了。错误如下所示--

我已经为我的所有项目创建了图像。把它推到码头上。Docker Compose文件我也将其推送到GitHub中。下面是路径

我还将其部署在EC2上的Docker Swarm上。 但当我试图通过Zuul使用我的微服务时,它根本不起作用。我的每个请求都会得到相同的“过滤错误”

请帮忙

根据:

Zuul在内部使用Ribbon调用远程URL。默认情况下,功能区客户端在第一次调用时由Spring Cloud延迟加载。Zuul的此行为可以通过使用以下配置进行更改,这将导致在应用程序启动时立即加载与子功能区相关的应用程序上下文

以下示例显示如何启用即时加载:

# application.yml
zuul:
  ribbon:
    eager-load:
      enabled: true

您可能需要检查以下相关问题:


对于通过Zuul的请求,我们需要记住三件事

1) 根据本文件—

Zuul在内部使用Ribbon调用远程url,默认情况下,Ribbon客户端在第一次调用时由SpringCloud延迟加载。对于Zuul,可以使用以下配置更改此行为,并将导致在应用程序启动时急切地加载与子功能区相关的应用程序上下文

应用程序.yaml

zuul:
   ribbon:
      eager-load:
         enabled: true
ribbon:
   ReadTimeout:100
   ConnectTimeout:500
   MaxAutoRetries:1
   MaxAutoRetriesNextServer:1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 11000

ribbon:
   ConnectTimeout: 10000
   ReadTimeout: 10000
应用程序属性

zuul.ribbon.eager-load.enabled= true
ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000

ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000
hystrix.command.default.execution.timeout.enabled=false
2) 根据本文件—

服务发现配置--- 如果Zuul正在使用服务发现,那么您需要关注两个超时:Hystrix超时(因为默认情况下,所有路由都封装在Hystrix命令中)和功能区超时。Hystrix超时需要考虑功能区读取和连接超时加上该服务将发生的重试总数。默认情况下,SpringCloudZuul将尽最大努力为您计算Hystrix超时,除非您明确指定Hystrix超时

Hystrix超时使用以下公式计算:

(ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * 
(ribbon.MaxAutoRetriesNextServer + 1)
例如,如果在应用程序属性中设置以下属性

zuul.ribbon.eager-load.enabled= true
ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000

ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000
hystrix.command.default.execution.timeout.enabled=false
应用程序.yaml

zuul:
   ribbon:
      eager-load:
         enabled: true
ribbon:
   ReadTimeout:100
   ConnectTimeout:500
   MaxAutoRetries:1
   MaxAutoRetriesNextServer:1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 11000

ribbon:
   ConnectTimeout: 10000
   ReadTimeout: 10000
应用程序属性

zuul.ribbon.eager-load.enabled= true
ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000

ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000
hystrix.command.default.execution.timeout.enabled=false
然后,Hystrix超时(对于本例中的所有路由)将设置为2400ms


在我的zuul应用程序配置中,我添加了以下属性。这是我第一次打电话,没有任何错误

应用程序.yaml

zuul:
   ribbon:
      eager-load:
         enabled: true
ribbon:
   ReadTimeout:100
   ConnectTimeout:500
   MaxAutoRetries:1
   MaxAutoRetriesNextServer:1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 11000

ribbon:
   ConnectTimeout: 10000
   ReadTimeout: 10000
应用程序属性

zuul.ribbon.eager-load.enabled= true
ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000

ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000
hystrix.command.default.execution.timeout.enabled=false
3) 这是最简单的方法。禁用hystrix执行超时

根据这份文件-

以下属性将禁用Zuul上的hystrix执行超时

应用程序属性

zuul.ribbon.eager-load.enabled= true
ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000

ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000
hystrix.command.default.execution.timeout.enabled=false

如果我们记住这三种情况,那么我们就可以很容易地得到ZuuleException(SendErrorFilter)的解决方案.

将URL从
localhost
更改为发现客户端中提到的服务名称。

请尝试Docker Compose文件的以下URL。这是否会在您仅使用Docker Compose启动应用程序并正常工作后立即发生?这是通过Zuul的第一个请求发生的。我在本地机器上尝试了Docker Compose。对于第一个请求,我得到了错误。如果我重新打开浏览器,它就可以正常工作了。我还尝试了EC2上的Docker Swarm。在EC2上,每次我都会收到相同的过滤器错误。对于EC2,它不起作用。我需要更改任何代码吗?在通过zuul发送任何请求之前,我已经检查了所有服务日志。我不会立即发送请求。当我的所有服务都启动并运行后,我再给docker 5分钟的热身时间。我关心的基本是EC2。在EC2上,每次我都会收到相同的错误。我可以按照什么步骤来解决它?点击下面的URL并检查Zuul容器上的日志,您可以看到错误。这对我不起作用。我已经用过这个房子了。但仍然得到同样的错误。