Программно созданный клиент Feign и цель Eureka

Несколько дней назад я начал изучать решения по отказоустойчивости в микросервисах. В моей экосистеме есть несколько микросервисов, и теперь они связаны с поиском сервисов Eureka. Я использовал FeignClient для звонков от одного к другому. Когда я услышал и прочитал, что Hystrix находится на обслуживании, я подумал, могу ли я использовать Resilience4J в Feign вместо Hystrix. Ну, по крайней мере, не с уровня аннотаций прямо сейчас, как кажется. Я нашел отличный адаптер Feign.Builder для добавления функций отказоустойчивости resilience4j над FeignClient в качестве декоратора (https://github.com/resilience4j/resilience4j/tree/master/resilience4j-feign), поэтому я хотел его использовать.

Итак, я использовал это, сложил вместе функции и добавил элементы кодировщика, декодера и т. Д. По умолчанию в конструктор симуляций. Оказывается, я должен закончить свой код с помощью вызова .target, который создает мой клиентский прокси, и я не мог сделать это с помощью Eureka в хорошем смысле:

  1. Первый конструктор, который принимает тип класса и URL-адрес, жестко запрограммирован, поэтому, если я добавлю запрос следующего сервера eureka в этот параметр, это будет просто жестко запрограммированный URL-адрес для одного из экземпляров, это не будет сбалансировано по нагрузке. Какое-то обходное решение может заключаться в том, что я создаю прототип или аналогичные краткосрочные bean-компоненты этого клиента и всегда получаю «следующий URL» для вызова. Это увеличивает нагрузку на использование клиентов в каждом классе, который я делаю. По крайней мере, так, как я это видел. Возможно, я мог бы добавить какой-то синглтон-компонент-помощник вокруг прототипирования, но, опять же, это не лучший дизайн, как я вижу.

  2. Я подумал, может быть, я смогу создать EurekaTarget из интерфейса Target, но, конечно, ни один из методов не указывает на «конец жизненного цикла», даже метод apply. Я подумал, что, возможно, это одна из точек, которая вызывается перед вызовом службы, но я видел несколько обращений к ней, поэтому мне пришлось изменить URL-адрес для всех вызовов.

Вы знаете лучшее решение для этой миграции?


person newhouse    schedule 11.09.2019    source источник


Ответы (1)


Я думаю, вы используете Spring Boot? Следующая версия Resilience4j v1.0.0 будет поддерживать аннотацию @FeignClient. Был PR, который добавил функциональность -> https://github.com/resilience4j/resilience4j/pull/579

Затем вы можете использовать его следующим образом:

@FeignClient(name = DUMMY_FEIGN_CLIENT_NAME)
@CircuitBreaker(name = DUMMY_FEIGN_CLIENT_NAME)
public interface DummyFeignClient {

    String DUMMY_FEIGN_CLIENT_NAME = "dummyFeignClient";

    @GetMapping(path = "/api/{param}")
    void doSomething(@PathVariable(name = "param") String param);
} 
person Robert Winkler    schedule 13.09.2019