在使用spring cloud openfeign的时候,我们常常会使用单个的FeignClient定义很多的mapping,但是spring cloud feign本身只支持feignClient级别的超时,不支持mapping级别的超时. 所以我们通常会结合Hystrix来定义单个mapping的超时. 但是切换到Sentinel后,我们无法对单个feignClient的mapping做超时处理了。针对这个问题,迁移时有什么好的方法吗?
public class FooServiceCommand extends HystrixCommand {
protected FooServiceCommand(HystrixCommandGroupKey group) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("OtherGroup"))
// command key
.andCommandKey(HystrixCommandKey.Factory.asKey("fooService"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(500) // 这句无法迁移
.withCircuitBreakerRequestVolumeThreshold(5)
.withCircuitBreakerErrorThresholdPercentage(50)
.withCircuitBreakerSleepWindowInMilliseconds(10000)
));
}
@Override
protected String run() throws Exception {
return "some_result";
}
}
这个问题不在feign里面也会出现,因为都有这种超时中断的场景.
原提问者GitHub用户sN0wpeak
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个的本质因素是因为Hystrix可以做物理线程池的方式进行隔离,而Sentinel则基于信号量做隔离,Sentinel更轻量、更解耦,超时设置我认为应该回归到框架/类库本身去做设置。
至于client对象本身,参考httpclient/asynchttpclient等实现,client本身是轻量级的对象,所以如果纯基于client来做超时,一般是按client做设置,不同的配置组合定义不同的client(未必一定重用),并且从文档来看,通过hystrix的线程池模型来做超时等效,实际上跟设置连接本身的超时也是完全不一样的性质。
原回答者GitHub用户jasonjoo2010
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。