ZuulException (SendErrorFilter) при первом вызове

Я создаю приложение с помощью 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, это вообще не работает. И я получаю ту же «Ошибку фильтра» для каждого моего запроса.

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

Пожалуйста, попробуйте следующий URL-адрес для файла Docker-Compose github.com/numery009/Docker-Compose/blob/master/…

Numery 10.03.2019 06:39

Это происходит, как только вы запускаете приложение только с помощью docker-compose, а затем оно работает нормально?

Mostafa Hussein 10.03.2019 09:43

Это происходит для 1-го запроса через Zuul. Я пробовал в Docker-Compose на своей локальной машине. Для 1-го запроса я получаю сообщение об ошибке. Затем, если я обновляю браузер, он работает нормально. Я также пробовал Docker-Swarm на EC2. На EC2 каждый раз, когда я получаю одну и ту же ошибку фильтра. Для EC2 это не работает. Нужно ли мне менять какой-либо код?

Numery 10.03.2019 23:08

Я проверил журнал всех служб, прежде чем отправлять какие-либо запросы через zuul. Я не отправляю запрос немедленно. Когда все мои службы запущены и работают, я дал еще 5 минут времени, чтобы разогреть докер. Меня беспокоит в основном EC2. На EC2 каждый раз я получаю ту же ошибку. Какие шаги я могу предпринять, чтобы решить эту проблему?

Numery 10.03.2019 23:27

как я могу воспроизвести проблему, может быть, я могу понять это, в настоящее время я запускаю docker-compose up, что мне делать дальше?

Mostafa Hussein 10.03.2019 23:28

Перейдите по следующему URL-адресу и проверьте журнал контейнера Zuul, вы можете увидеть ошибку. локальный: 8765/учетная запись клиента-mysql/api/v1/притворство клиента

Numery 10.03.2019 23:31

Давайте продолжить обсуждение в чате.

Mostafa Hussein 10.03.2019 23:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
7
9 041
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

У меня не работает. Я использую это свойство. Но все равно получаю ту же ошибку.

Numery 14.03.2019 05:18
Ответ принят как подходящий

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

приложение.yaml

zuul:
   ribbon:
      eager-load:
         enabled: true

приложение.свойства

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)

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

приложение.yaml

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

приложение.свойства

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

Тогда тайм-аут Hystrix (в данном случае для всех маршрутов) будет установлен на 2400 мс.


В моей конфигурации приложения zuul я добавил следующие свойства. И он работает для моего 1-го звонка без каких-либо ошибок.

приложение.yaml

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

Следующее свойство отключит тайм-аут выполнения hystrix на Zuul.

приложение.свойства

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

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

Измените URL-адрес с localhost на имя службы, указанное в клиенте обнаружения.

Другие вопросы по теме