ZuulException (SendErrorFilter) при первом вызове - PullRequest
1 голос
/ 10 марта 2019

Я создаю приложение от Spring Cloud, Spring Boot и Docker.Все приложение работает нормально.У меня есть пара микро-услуг.Каждый проект работает на Docker.Когда я пытаюсь использовать свои микро-сервисы через Zuul API Gateway, я получаю сообщение об ошибке при первом вызове.Но если я обновлю браузер, он будет работать нормально.Ошибка приведена ниже -

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

Я также развернул его в Docker Swarm на EC2.Но когда я пытаюсь использовать свои микро-сервисы через Zuul, это совсем не работает.И я получаю ту же «Ошибка фильтра» для каждого моего запроса.

Пожалуйста, помогите !!!.

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

Согласно этой документации :

Зуул внутренне использует Ленточку для вызова удаленных URL-адресов.По умолчанию клиенты ленты загружаются Spring Cloud при первом вызове.Это поведение можно изменить для Zuul с помощью следующей конфигурации, которая приводит к активной загрузке дочерних контекстов приложения, связанных с лентой, во время запуска приложения.

В следующем примере показано, как включить активную загрузку:

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

Или

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

Возможно, вам понадобится проверить следующие вопросы:

0 голосов
/ 18 марта 2019

Там должно быть 3 вещи, которые мы должны держать на макушке для запроса, который прошел через Zuul

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внутренне использует ленту для вызова удаленных URL-адресов, и клиенты ленты по умолчанию загружаются Spring Cloud при первом вызове.Это поведение можно изменить для Zuul, используя следующую конфигурацию, и это приведет к тому, что дочерние ленточные контексты приложения будут загружены во время запуска приложения.

application.yaml

zuul:
   ribbon:
      eager-load:
         enabled: true

application.свойства

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) и тайм-аут ленты.Время ожидания Hystrix должно учитывать время ожидания чтения и подключения ленты, а также общее количество повторных попыток для этой службы.По умолчанию Spring Cloud Zuul сделает все возможное, чтобы рассчитать тайм-аут Hystrix, если вы не укажете тайм-аут Hystrix.

Тайм-аут Hystrix рассчитывается по следующей формуле:

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

AsНапример, если вы зададите следующие свойства в свойствах вашего приложения

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

Следующее свойство отключит время выполнения Hystrix в Zuul

application.properties

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

Если мы будем помнить эти 3 сценария, то мы можем легко получить решение ZuulException (SendErrorFilter).

...