Оберните исходящие вызовы шлюза интеграции 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
}