Оберните исходящие вызовы шлюза интеграции Spring с помощью команды 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 версии. Я также добавил в приложение pom.xml зависимости spring-cloud-starter-hystrix и spring-cloud-starter- eureka.

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

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 */;
          }
   }

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

Я добавил несколько простых образцов в мой 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
}
Другие вопросы по тегам