ZuulException (SendErrorFilter) 第一次调用
ZuulException (SendErrorFilter) at first call
我正在通过 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 使用我的微服务时,它根本不起作用。我的每个请求都得到相同的 "Filter Error"。
请帮忙!!!
Zuul internally uses Ribbon for calling the remote URLs. By default, Ribbon clients are lazily loaded by Spring Cloud on first call. This behavior can be changed for Zuul by using the following configuration, which results eager loading of the child Ribbon related Application contexts at application startup time.
以下示例展示了如何启用预先加载:
# application.yml
zuul:
ribbon:
eager-load:
enabled: true
或
# application.properties
ribbon.eager-load.enabled = true
您可能需要检查以下相关问题:
对于通过 Zuul 的请求,我们需要牢记 3 件事
Zuul 在内部使用 Ribbon 来调用远程 url 并且 Ribbon 客户端默认情况下由 Spring Cloud 在第一次调用时延迟加载。可以使用以下配置为 Zuul 更改此行为,并将导致在应用程序启动时急切加载与子 Ribbon 相关的应用程序上下文。
application.yaml
zuul:
ribbon:
eager-load:
enabled: true
application.properties
zuul.ribbon.eager-load.enabled= true
服务发现配置 ---
如果 Zuul 使用服务发现,则需要关注两个超时,Hystrix 超时(因为默认情况下所有路由都包含在 Hystrix 命令中)和 Ribbon 超时。 Hystrix 超时需要考虑功能区读取和连接超时加上该服务将发生的重试总数。默认情况下 Spring Cloud Zuul 将尽最大努力为您计算 Hystrix 超时,除非您明确指定 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 超时(对于本例中的所有路由)将设置为 2400 毫秒。
在我的 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 执行超时。
根据此文档 -https://github.com/Netflix/Hystrix/wiki/Configuration#executiontimeoutenabled
以下属性 将禁用 Zuul 上的 hystrix 执行超时
application.properties
hystrix.command.default.execution.timeout.enabled=false
如果我们一直记住这3个场景,那么我们就很容易得到ZuulException(SendErrorFilter)的解决方法。
将 URL 从 localhost
更改为发现客户端中提到的服务名称。
我正在通过 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 使用我的微服务时,它根本不起作用。我的每个请求都得到相同的 "Filter Error"。
请帮忙!!!
Zuul internally uses Ribbon for calling the remote URLs. By default, Ribbon clients are lazily loaded by Spring Cloud on first call. This behavior can be changed for Zuul by using the following configuration, which results eager loading of the child Ribbon related Application contexts at application startup time.
以下示例展示了如何启用预先加载:
# application.yml
zuul:
ribbon:
eager-load:
enabled: true
或
# application.properties
ribbon.eager-load.enabled = true
您可能需要检查以下相关问题:
对于通过 Zuul 的请求,我们需要牢记 3 件事
Zuul 在内部使用 Ribbon 来调用远程 url 并且 Ribbon 客户端默认情况下由 Spring Cloud 在第一次调用时延迟加载。可以使用以下配置为 Zuul 更改此行为,并将导致在应用程序启动时急切加载与子 Ribbon 相关的应用程序上下文。
application.yaml
zuul:
ribbon:
eager-load:
enabled: true
application.properties
zuul.ribbon.eager-load.enabled= true
服务发现配置 --- 如果 Zuul 使用服务发现,则需要关注两个超时,Hystrix 超时(因为默认情况下所有路由都包含在 Hystrix 命令中)和 Ribbon 超时。 Hystrix 超时需要考虑功能区读取和连接超时加上该服务将发生的重试总数。默认情况下 Spring Cloud Zuul 将尽最大努力为您计算 Hystrix 超时,除非您明确指定 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 超时(对于本例中的所有路由)将设置为 2400 毫秒。
在我的 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 执行超时。
根据此文档 -https://github.com/Netflix/Hystrix/wiki/Configuration#executiontimeoutenabled
以下属性 将禁用 Zuul 上的 hystrix 执行超时
application.properties
hystrix.command.default.execution.timeout.enabled=false
如果我们一直记住这3个场景,那么我们就很容易得到ZuulException(SendErrorFilter)的解决方法。
将 URL 从 localhost
更改为发现客户端中提到的服务名称。