Я использую микросервисы в своем приложении (Eureka используется как обнаружение сервиса). Микросервисы общаются с помощью FeignCleint. Основной микросервис отправляет данные анализатору, который сначала проверяет, есть ли они в кеше. Итак, схема выглядит примерно так:
main -> analyzer -> cache
Когда у меня запущен основной микросервис и нет других, когда я вызываю конечную точку отправки данных, я получил эту ошибку:
java .lang.RuntimeException: com.netflix.client.ClientException: балансировщик нагрузки не имеет доступного сервера для клиента: szprot-server-analyzer
ОК, это нормально. Я создал FallbackFactory для исключений:
class AnalyzerFallbackFactory : FallbackFactory<AnalyzerFeignClient> {
override fun create(cause: Throwable) = object : AnalyzerFeignClient {
override fun analyzeData(data: MutableList<Data>) {
logger.error("FALLBACK! Reason: ${cause.message}")
dataQueue.addAll(data)
}
}
}
Perfect! Приложение зарегистрировало исключение. У меня есть запланированная функция, которая повторно отправляет данные, если dataQueue не пуст. Я сделал CacheFallbackFactory по аналогии:
class CacheFallbackFactory : FallbackFactory<CacheFeignClient> {
private fun printFallback(cause: Throwable) {
println("FALLBACK! Reason: ${cause.message}")
}
override fun create(cause: Throwable) = object : CacheFeignClient {
override fun updateCache(cacheUpdateRequest: CacheUpdateRequest, analyzerCache: Boolean) {
println("FALLBACK! Reason: ${cause.message}")
}
}
}
Main и Analyzer работают, а Cache нет. Я отправляю данные и ... Хорошо, я должен этого ожидать. Приложение зарегистрировало ошибку, но Main об этом не знает, поэтому не создает очередь на повторный анализ. Я попытался вернуть исключение (я знаю, что это делает резервный вариант бесполезным), но я получил это в журналах анализатора:
2020-05-26 13:37:35.264 ERROR 70109 --- [nio-8091-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: CacheProxy#getStopPileCode(GPSFrame,boolean) failed and fallback failed.] with root cause
com.netflix.client.ClientException: Load balancer does not have available server for client: szprot-server-cache
at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483)
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184)
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180)
at rx.Observable.unsafeSubscribe(Observable.java:10327)
и в основных журналах:
2020-05-26 13:36:01.996 ERROR 68732 --- [rver-analyzer-4] p.s.s.s.e.m.FeignErrorDecoder : [STP2] ErrorMessage{message='CacheProxy#getStopPileCode(GPSFrame,boolean) failed and fallback failed.', microserviceName=null, code=0}
Я попытался сделать настраиваемый исключение и обработка его, но без эффектов. Есть ли способ поделиться результатом отката или кешировать его ответ?