我想使用在我的集成应用程序中将呼叫包装到出站网关 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注释是否可以解决问题。
答案 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
}