使用hystrix命令包装弹出集成出站网关调用

时间:2018-04-12 01:20:02

标签: spring-boot spring-integration hystrix circuit-breaker

我想使用在我的集成应用程序中将呼叫包装到出站网关 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似乎更简单,但是使用Integration我发现它并不清楚。

如果有人通过向出站网关添加自定义行为实现了类似的行为,请告诉我们。

更新

根据建议我做如下,

在我的Spring启动应用程序类中添加了@EnableCircuitBreaker注释。

@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 cloud Edgware.SR3 版本。 我还将 spring-cloud-starter-hystrix pring-cloud-starter-eureka 依赖项添加到我的应用程序pom.xml中。

不确定@hystrix注释是否可以解决问题。

1 个答案:

答案 0 :(得分:0)

可以使用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。所以,我建议在@Gateway方法上尝试Hystrix注释:一个用于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
}