Я пытаюсь включить возможность повтора в шлюзе Zuul и могу заставить все работать локально, но при развертывании шлюза в PCF я получаю следующую ошибку, когда zuul.retryable=true
:
{
"timestamp": 1524669167094,
"status": 500,
"error": "Internal Server Error",
"exception": "com.netflix.zuul.exception.ZuulException",
"message": "COMMAND_EXCEPTION"
}
Связанные журналы дают мне следующие подробности исключений:
com.netflix.zuul.exception.ZuulException: Forwarding error
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: spring-demo failed and no fallback available.
Caused by: org.apache.http.NoHttpResponseException: spring-demo.example.com:443 failed to respond
Я протестировал spring-demo.example.com
, и он правильно отвечает (200) в течение 200 мс, и Zuul также может получить действительный ответ, когдаЯ удаляю свойство zuul.retryable
(хотя тогда оно не повторяет никаких кодов ошибок или тайм-аутов).
Когда я запускаю локально, я вижу, как RibbonLoadBalancedRetryPolicy
пробует разные экземпляры по тайм-ауту или при получении500, так что только в PCF я получаю ошибку.Я проверил, что экземпляры отображаются в PCF Eureka, а также попытался увеличить время ожидания подключения / чтения / hystrix.
Вот схема службы:
- 2 экземпляра«рабочего» приложения, подключенного к Eureka как «spring-demo»
- 2 экземпляра «сломанного» приложения, подключенного к Eureka как «spring-demo» (время ожидания или возврат 500)
- Zuulподключен к Eureka
Zuul application.yml:
zuul:
ignoredServices: '*'
ignoredPatterns: '/**/actuator/**'
retryable: true
routes:
spring-demo: '/spring-demo/**'
ribbon:
retryableStatusCodes: 404, 500
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 5
OkRetryOnConnectionErrors: true
Варианты зависимости Gradle:
- Spring Boot 1.5.12.RELEASE
- Spring Cloud Edgware.SR3
- Pivotal Services 1.6.3.RELEASE
- spring-boot-starter-web
- spring-boot-starter-привод
- Spring-Cloud-Starter-Netflix-Zuul
- Spring-Retry
- Spring-Cloud-Services-Starter-Service-Registry
- Spring-Cloud-Services-Starterвыключатель