首次调用ZuulException(SendErrorFilter)

时间:2019-03-10 05:26:15

标签: spring-boot docker docker-compose spring-cloud netflix-zuul

我正在通过Spring Cloud,Spring Boot和Docker构建应用程序。整个应用程序运行正常。我有几个微服务。每个项目都在Docker上运行。当我尝试通过Zuul API网关使用微服务时,第一次调用时出现错误。但是,如果我刷新浏览器,它就可以正常工作。错误在下面给出-

2019-03-10 04:54:55.440  WARN [netflix- 
zuul-api-gateway- 
server,1855093598d4f99c,1855093598d4f99c
true] 1 --- [nio-8765-exec-1] 
o.s.c.n.z.filters.post.SendErrorFilter   
: Error during filtering


com.netflix.zuul.exception.ZuulException 
at 
org.springframework.cloud.netflix.zuul.
filters.post.SendErrorFilter.
findZuulException(SendErrorFilter.java:
114) ~[spring-cloud-netflix-zuul- 
2.1.0.RC3.jar!/:2.1.0.RC3]
at 
org.springframework.cloud.netflix.zuul.
filters.post.SendErrorFilter.run
(SendErrorFilter.java:76) ~[spring- 
cloud- 
netflix-zuul-2.1.0.RC3.jar!/
:2.1.0.RC3]
at 
com.netflix.zuul.ZuulFilter.runFilter
(ZuulFilter.java:117) [zuul-core- 
1.3.1.jar!/:1.3.1]
at 
com.netflix.zuul.FilterProcessor.
processZuulFilter(FilterProcessor.
java:193) [zuul-core-1.3.1.jar!/:1.3.1]
 at 
com.netflix.zuul.FilterProcessor.
runFilters(FilterProcessor.java:157) 
[zuul-core-1.3.1.jar!/:1.3.1]
at 
com.netflix.zuul.FilterProcessor.error
(FilterProcessor.java:105) [zuul-core- 
1.3.1.jar!/:1.3.1]
at com.netflix.zuul.ZuulRunner.error
(ZuulRunner.java:112) [zuul-core- 
1.3.1.jar!/:1.3.1]
at 
com.netflix.zuul.http.ZuulServlet.error
(ZuulServlet.java:145) [zuul-core- 
1.3.1.jar!/:1.3.1]
at 
com.netflix.zuul.http.ZuulServlet.servic
e(ZuulServlet.java:83) [zuul-core- 
1.3.1.jar!/:1.3.1]
at org.springframework.web.servlet.mvc.
Servlet 
letWrappingController.java:165) [spring- 
webmvc- 
5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
at org.spr

我已经为所有项目创建了图像。并将其推送到DockerHub中。 Docker-Compose文件也将其推送到GitHub中。这是路径。

https://github.com/numery009/DockerCompose/blob/master/docker-compose.yaml

我还将其部署在EC2的Docker Swarm上。 但是,当我尝试通过Zuul使用微服务时,它根本无法工作。而且我的每个请求都收到相同的“过滤器错误”。

请帮助!!

3 个答案:

答案 0 :(得分:3)

根据this documentation

  

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

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

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

# application.properties
ribbon.eager-load.enabled = true

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

答案 1 :(得分:0)

对于请求,我们需要保留3件事,这些事情已经通过Zuul了

1)根据本文档-https://github.com/wixtoolset/wix3/blob/develop/src/ext/UIExtension/wixlib/WixUI_nb-NO.wxl

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

application.yaml

zuul:
   ribbon:
      eager-load:
         enabled: true

application.properties

zuul.ribbon.eager-load.enabled= true

2)根据本文档-https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.4.3.RELEASE/single/spring-cloud-netflix.html#_zuul_eager_application_context_loading

服务发现配置- 如果Zuul使用服务发现,则需要考虑两个超时:Hystrix超时(因为默认情况下所有路由都包装在Hystrix命令中)和Ribbon超时。 Hystrix超时需要考虑功能区读取和连接超时以及该服务将发生的重试总数。默认情况下,除非明确指定Hystrix超时,否则Spring Cloud Zuul会尽力为您计算Hystrix超时。

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

(ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * 
(ribbon.MaxAutoRetriesNextServer + 1)

作为示例,如果您在应用程序属性中设置以下属性

application.yaml

ribbon:
   ReadTimeout:100
   ConnectTimeout:500
   MaxAutoRetries:1
   MaxAutoRetriesNextServer:1

application.properties

ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1

然后将Hystrix超时(在这种情况下为所有路由)设置为2400ms。


在我的zuul应用程序配置中,我添加了以下属性。它正在为我的第一个电话工作,没有任何错误。

application.yaml

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 11000

ribbon:
   ConnectTimeout: 10000
   ReadTimeout: 10000

application.properties

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000

ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000

3)这是最简单的方法。禁用hystrix执行超时。

根据本文档-http://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_service_discovery_configuration

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

application.properties

hystrix.command.default.execution.timeout.enabled=false

如果我们牢记这三种情况,则可以轻松获得ZuulException(SendErrorFilter)的解决方案。

答案 2 :(得分:0)

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