Я создаю приложение с помощью 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, это вообще не работает. И я получаю ту же «Ошибку фильтра» для каждого моего запроса.
Пожалуйста помоги!!!.
Это происходит, как только вы запускаете приложение только с помощью docker-compose, а затем оно работает нормально?
Это происходит для 1-го запроса через Zuul. Я пробовал в Docker-Compose на своей локальной машине. Для 1-го запроса я получаю сообщение об ошибке. Затем, если я обновляю браузер, он работает нормально. Я также пробовал Docker-Swarm на EC2. На EC2 каждый раз, когда я получаю одну и ту же ошибку фильтра. Для EC2 это не работает. Нужно ли мне менять какой-либо код?
Я проверил журнал всех служб, прежде чем отправлять какие-либо запросы через zuul. Я не отправляю запрос немедленно. Когда все мои службы запущены и работают, я дал еще 5 минут времени, чтобы разогреть докер. Меня беспокоит в основном EC2. На EC2 каждый раз я получаю ту же ошибку. Какие шаги я могу предпринять, чтобы решить эту проблему?
как я могу воспроизвести проблему, может быть, я могу понять это, в настоящее время я запускаю docker-compose up, что мне делать дальше?
Перейдите по следующему URL-адресу и проверьте журнал контейнера Zuul, вы можете увидеть ошибку. локальный: 8765/учетная запись клиента-mysql/api/v1/притворство клиента
Давайте продолжить обсуждение в чате.




Согласно эта документация:
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
Возможно, вам потребуется проверить следующие связанные проблемы:
У меня не работает. Я использую это свойство. Но все равно получаю ту же ошибку.
У нас должно быть 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 на имя службы, указанное в клиенте обнаружения.
Пожалуйста, попробуйте следующий URL-адрес для файла Docker-Compose github.com/numery009/Docker-Compose/blob/master/…