Spring Hystrix 未在内部方法上触发

Posted

技术标签:

【中文标题】Spring Hystrix 未在内部方法上触发【英文标题】:Spring Hystrix not triggered on inner methods 【发布时间】:2017-02-11 18:51:30 【问题描述】:

我正在尝试在 Spring Boot 应用程序中包含 Hystrix 断路器。 我的应用程序是带有 spring-cloud-hystrix v 1.2.0 应用程序的标准 spring boot 1.4.1 应用程序,该应用程序具有单个控制器类,该控制器类使用“聚合”方法调用服务类。 此方法使用内部私有方法在内部调用两个服务。

如果我用 @HystrixCommand 注释“聚合”方法一切正常,但如果注释其他内部方法 Hystrix 似乎不会被触发

这是我的服务类:

@Service
public class AggregationService 

    @Autowired
    Service1 service1Client;

    @Autowired
    Service2 service2Client;

    private static final String QUERY = "query";
    private static final Logger log = LogManager.getLogger();
    private final ObjectMapper objectMapper = new ObjectMapper();

    //@HystrixCommand(
    //    fallbackMethod = "emptyResult",
    //    groupKey = "aggregation-service",
    //    commandKey = "aggregate")
    public AggregationResponse aggregate(final AggregationParams params)
            throws ApiException, IOException 

        final String query = queryExplain(params);
        final WrapperQueryBuilder wrappedQuery = QueryBuilders.wrapperQuery(query);
        final SearchResponse aggregationResult = searchAggregation(params, wrappedQuery);

        return toDtoResponse(aggregationResult.getAggregations().get(params.getAggregationField().name().toLowerCase()));
    

    @HystrixCommand(
        fallbackMethod = "emptyAggregationResult",
        groupKey = "aggregation-service",
        commandKey = "searchAggregation")
    private SearchResponse searchAggregation(final AggregationParams params, final WrapperQueryBuilder query) 

        return ... do something with service 2 ....
    

    //    @HystrixCommand(
    //        fallbackMethod = "rethrowTimeoutException",
    //        groupKey = "aggregation-service",
    //        commandKey = "query-for-aggregation",
    //        ignoreExceptions = TimeoutException.class)
    private String queryExplain(final AggregationParams params) throws ApiException, IOException 
        final String queryAsString = ... do something with service 1 ....
    

    private String rethrowTimeoutException(final AggregationParams params, final Throwable e) 
        log.error("On Hystrix fallback because of ", e);
        return null;
    

    private SearchResponse emptyAggregationResult(final AggregationParams params, final WrapperQueryBuilder query, final Throwable e) 
        log.error("On Hystrix fallback because of ", e);
        return null;
    


我的控制器方法是:

 @GetMapping("field")
    @ResponseStatus(HttpStatus.OK)
    public AggregationResponse aggregate(... some params ...) throws ApiException, IOException 

... omissis ....

        return aggregationService.aggregate(params);

我的配置类有这些注释:

@Configuration
@EnableHystrix

我的 application.properties 包含:

hystrix.command.searchAggregation.execution.isolation.thread.timeoutInMilliseconds=1
hystrix.command.searchAggregation.circuitBreaker.errorThresholdPercentage=10
hystrix.command.queryExplain.execution.isolation.thread.timeoutInMilliseconds=1
hystrix.command.queryExplain.circuitBreaker.errorThresholdPercentage=10
hystrix.command.default.execution.timeout.enabled=true

我故意将执行隔离的超时时间保持在 1MS 以捕获 hystrix 执行。

奇怪的是,似乎只有放置在“aggergate”方法上的@HystrixCommand 被触发,而其他的则不会被触发,如果我在“聚合”顶部注释注释,则不会触发超时错误,如果我取消注释注释 a “缺少回退异常”被触发

我在问我配置错了什么? @HystrixCommand 必须只放在“被调用”方法上,不能用于内部方法吗?

希望我的问题很清楚(因为对我来说很模糊:))

提前致谢

【问题讨论】:

【参考方案1】:

Javanica 使用HystrixCommandAspect 方面来检测带有HystrixCommand 注释的方法,并且似乎定义的pointcut 只影响公共方法。

更新:有一个bug report 与此特定问题相关。

【讨论】:

感谢您的问题!我找不到它。我也尝试将方法可见性更改为公共,但行为是相同的,如果不直接调用方法,则不会触发 hystrix。喜欢的问题中提到了相同的环境,但没有提供解决方案(据我了解),我想知道是否可以在谷歌上检测没有 HystrixCommand 注释的方法我没有找到任何指南或示例。现在我已经将我的课程分成三部分并配备了 hystrix 并且一切正常,但我仍然认为我的应用程序的这种方法有点过度设计 HystrixCommand 注解只是 Javanica 引入的高级简化。如果您需要更大的灵活性,您可以以标准方式实现您的命令,即通过继承 HystrixCommand 类 github.com/Netflix/Hystrix/wiki/Getting-Started#hello-world @IlTera,“不直接调用”是什么意思?什么时候不直接调用方法? @jrahhali 我想你需要看看这里才能理解。直接表示我没有调用 myService.hystrixWrappedMethod() 而是调用了 myService.someMethodThatCallesTheHystrixWrappedMethod()。在这种情况下,它似乎不起作用。讨论:github.com/Netflix/Hystrix/issues/1020#issuecomment-165885957

以上是关于Spring Hystrix 未在内部方法上触发的主要内容,如果未能解决你的问题,请参考以下文章

PHP 的“未设置”构造如何在内部工作?

笔记:Spring Cloud Hystrix 异常处理缓存和请求合并

git status 在内部的工作方式与 git diff 在显示未跟踪文件方面有何不同?

datagrid的SelectionChanged事件未以mvvm方式触发

8.Spring-Cloud-Hystrix之异常处理

使用feign-hystrix实现断路由-简书