Общий или кешированный резервный вариант FeignClient? - PullRequest
0 голосов
/ 27 мая 2020

Я использую микросервисы в своем приложении (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}

Я попытался сделать настраиваемый исключение и обработка его, но без эффектов. Есть ли способ поделиться результатом отката или кешировать его ответ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...