Оберните вызовы исходящего шлюза Spring Integration с помощью команды hystrix

Я хочу обернуть вызов исходящего шлюза в своем приложении интеграции, используя Команда hystrix аналогична той, которая доступна в загрузочном приложении Spring.

<int-http:outbound-gateway id = "outbound.gateway"
    request-channel = "get.request.channel" url = "http://localhost:9090/profileapplication"
    http-method = "GET" charset='UTF-8' reply-channel = "reply.channel"
    >
</int-http:outbound-gateway>

У меня есть исходящий шлюз, как указано выше.

Мне это нужно для сценария, когда целевое приложение часто не работает / не реагирует и мы ищем способ дать имитационный ответ во время этих сценариев и дать возможность целевое приложение для восстановления.

По сути, я хочу использовать команда Hystrix и смоделировать здесь схема выключателя.

Я чувствую, что использую комбинацию ExpressionEvaluatingRequestHandlerAdvice и RequestHandlerCircuitBreakerAdvice может быть полезно, но я не нашел никаких документов, как использовать их вместе в моем сценарии.

С Spring Boot это кажется проще, но с интеграцией я считаю, что это непонятно.

Если кто-то реализовал подобное поведение, добавив настраиваемое поведение для шлюза исходящей почты, сообщите нам об этом.

Обновлено:

В соответствии с предложением я сделал, как показано ниже,

Добавлена ​​аннотация @EnableCircuitBreaker в мой класс загрузочного приложения Spring.

@SpringBootApplication
@RestController
@ImportResource("classpath:/META-INF/spring/integration/hystrix-outbound-config.xml")
@EnableCircuitBreaker
public class HystrixIntegrationApplication {

.. }

Кроме того, добавлена ​​аннотация @HystrixCommand к моему интерфейсу шлюза, как показано ниже,

@MessagingGateway
public interface HystrixServiceGateway {


    @Gateway(requestChannel = "get.request.channel", replyChannel = "reply.channel")
    @HystrixCommand(fallbackMethod = "getMockdata")
    String getMessage(String name);

    default String getMockData(String name) {
        return "Mock Data:" + name;
    }
}

Я добавил метод в сам интерфейс, поскольку java 8 поддерживает методы по умолчанию в интерфейсе.

Я даже пробовал использовать статические методы в интерфейсе, как показано ниже.

@MessagingGateway
public interface HystrixServiceGateway {


    @Gateway(requestChannel = "get.request.channel", replyChannel = "reply.channel")
    @HystrixCommand(fallbackMethod = "getMockdata")
    String getMessage(String name);

    static String getMockData(String name) {
        return "Mock Data:" + name;
    }
}

Я использовал версии Spring Boot 1.5.12 и Spring облако Edgware.SR3. Я также добавил зависимости весна-облако-стартер-гистрикс и sPring-Cloud-Starter-Eureka в свое приложение pom.xml.

Не уверен, что аннотация @hystrix решает проблему.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
501
1

Ответы 1

Любой адаптер исходящего канала (или шлюз) можно настроить с помощью request-handler-advice-chain, где «цепочка» является основной задачей. Таким образом, вы действительно можете связать один совет с другим, используя их комбинацию, как в вашем случае. Достаточно настроить одну за другой.

Пример retry and more должен дать вам некоторые идеи: https://github.com/spring-projects/spring-integration-samples/tree/master/intermediate/retry-and-more

Я вернусь позже с решением Hystrix, если это возможно.

ОБНОВИТЬ

Что ж, согласно документации Spring Cloud, у нас может быть что-то вроде:

@Component
 public class StoreIntegration {

         @HystrixCommand(fallbackMethod = "defaultStores")
          public Object getStores(Map<String, Object> parameters) {
                   //do stuff that might fail
          }

          public Object defaultStores(Map<String, Object> parameters) {
                   return /* something useful */;
          }
   }

А с точки зрения Spring Integration у нас может быть @MessagingGateway перед любым каналом сообщений. Итак, я предлагаю попробовать эту аннотацию Hystrix для метода @Gateway: одну для вызова HTTP-шлюза, а другую в качестве запасного варианта: https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/messaging-endpoints-chapter.html#gateway

Я добавил в свой sendbox простой образец: https://github.com/artembilan/sendbox/tree/master/spring-integration-with-hystrix

Итак, решение такое:

@ServiceActivator(inputChannel = "serviceChannel")
@HystrixCommand(fallbackMethod = "serviceFallback")
public String myService(String payload) {
    // Some external service call
}

public String serviceFallback(String payload) {
    // some fallback logic
}

Спасибо за ваше предложение. Я попытался использовать аннотацию hystrix, но она все равно не обрабатывает сценарий исключения, когда служба не работает. Я представлю изменения, которые я внес в ближайшее время.

juser 12.04.2018 12:48

См. Также обсуждение здесь: stackoverflow.com/questions/45480446/…

Artem Bilan 12.04.2018 15:19

См. ОБНОВЛЕНИЕ в моем ответе.

Artem Bilan 12.04.2018 16:51

Спасибо, но я не могу повторить попытку и другие примеры. Наверное, нужно больше времени, чтобы понять это. В любом случае ваши предложения полезны.

juser 15.04.2018 11:50

Прохладный! Похоже, время для этого: stackoverflow.com/help/someone-answers?

Artem Bilan 16.04.2018 18:45

Другие вопросы по теме