我正在通过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使用微服务时,它根本无法工作。对于每个请求,我都会收到相同的“过滤器错误”。
请帮忙!!!。
通过Zuul,我们需要保持3件事才能满足要求
1)根据本文档-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在内部使用Ribbon来调用远程URL,默认情况下,Spring Cloud在第一次调用时会延迟加载Ribbon客户端。可以使用以下配置为Zuul更改此行为,这将导致在应用程序启动时紧急加载与子Ribbon相关的应用程序上下文。
application.yaml
zuul: ribbon: eager-load: enabled: true
application.properties
zuul.ribbon.eager-load.enabled= true
2)根据本文档-http://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring- cloud.html#_service_discovery_configuration
服务发现配置 -–如果Zuul使用服务发现,则需要考虑两个超时:Hystrix超时(因为默认情况下所有路由都包装在Hystrix命令中)和Ribbon超时。Hystrix超时需要考虑功能区读取和连接超时以及该服务将发生的重试总数。默认情况下,Spring Cloud Zuul将尽力为您计算Hystrix超时,除非您明确指定Hystrix超时。
Hystrix超时使用以下公式计算:
(ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1)
例如,如果您在应用程序属性中设置以下属性
ribbon: ReadTimeout:100 ConnectTimeout:500 MaxAutoRetries:1 MaxAutoRetriesNextServer:1
ribbon.ReadTimeout= 100 ribbon.ConnectTimeout= 500 ribbon.MaxAutoRetries= 1 ribbon.MaxAutoRetriesNextServer= 1
然后Hystrix超时(在这种情况下,对于所有路由)将设置为2400ms。
在我的zuul应用程序配置中,我添加了以下属性。它正在为我的第一个电话工作,没有任何错误。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 11000 ribbon: ConnectTimeout: 10000 ReadTimeout: 10000
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执行超时
hystrix.command.default.execution.timeout.enabled=false
如果我们牢记这三种情况,则可以轻松获得ZuulException(SendErrorFilter)的解决方案。