SpringCloud断路器Hystrix原理及用法解析
这篇文章主要介绍了SpringCloud断路器Hystrix原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性
两个比较重要的类
- HystrixCommand
- HystrixObservableCommand
注解@HystrixCommand(fallbackMethods="methods")methods中可以添加降级策略
除了提供服务降级
还提供了请求缓存
- @CacheResult
- @CacheRemve
不过添加CacheResult的时候,说
HystrixRequestContext未初始化。
2020-01-1316:12:10.273ERROR15348---[nio-8083-exec-1]o.a.c.c.C.[.[.[/].[dispatcherServlet]:Servlet.service()forservlet[dispatcherServlet]incontextwithpath[]threwexception[Requestprocessingfailed;nestedexceptionisjava.lang.reflect.UndeclaredThrowableException]withrootcause java.lang.IllegalStateException:Requestcachingisnotavailable.MaybeyouneedtoinitializetheHystrixRequestContext? atcom.netflix.hystrix.HystrixRequestCache.get(HystrixRequestCache.java:104)~[hystrix-core-1.5.18.jar:1.5.18] atcom.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:478)~[hystrix-core-1.5.18.jar:1.5.18] atcom.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:454)~[hystrix-core-1.5.18.jar:1.5.18] atrx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)~[rxjava-1.3.8.jar:1.3.8] atrx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)~[rxjava-1.3.8.jar:1.3.8]
查看官方文档https://github.com/Netflix/Hystrix/wiki/How-To-Use
TypicallythiscontextwillbeinitializedandshutdownviaaServletFilterthatwrapsauserrequestorsomeotherlifecyclehook.
在同一用户请求的上下文中,相同依赖服务的返回数据始终保持一致。在当次请求内对同一个依赖进行重复调用,只会真实调用一次。在当次请求内数据可以保证一致性。
初始化是在filter中进行(官方建议),但是每一次请求都会进行初始化。所以说和一般的缓存还是有去别的,可以解决高并发,保证的资源的线程安全。在某些场景很有用。
请求合并
/**
*建议:服务提供方有较高的延迟。可以考虑使用请求合并
*HystrixCollapser合并请求的时候会创建一个请求处理器。如果每次合并的请求量不大,只有很少的请求还要合并,会造成合并时间窗
*并发量增大,时间窗的创建和消耗增大。所以只有在时间窗内有很大的并发量,推荐请求合并。
*
*batchMethod请求合并后的替换方法com.gitee.munan56.cloud.hystrixconsumer.AService#findALl(java.util.List)注意客户端要有这个方法
*HystrixProperty一个属性合并时间窗100s这个时间结束后会发起请求,也就是指这个时间是合并处理的时间
*@paramid
*@return
*/
@HystrixCollapser(batchMethod="findALl",collapserProperties=@HystrixProperty(name="timerDelayInMilliseconds",value="100"))
publicStringdoBFindOne(Stringid){
System.out.println("begindoproviderservice");
returnrestTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody();
}
全部代码
packagecom.gitee.munan56.cloud.hystrixconsumer;
importcom.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;
importcom.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
importcom.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
importcom.netflix.hystrix.contrib.javanica.cache.annotation.CacheResult;
importcom.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
importcom.netflix.ribbon.proxy.annotation.Hystrix;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importorg.springframework.web.client.RestTemplate;
importjava.util.List;
/**
*@authormunan
*@version1.0
*@date2020/1/1310:41
*/
@Service
publicclassAService{
@Autowired
privateRestTemplaterestTemplate;
publicStringdoAService(){
return"AServiceisrun";
}
//@Hystrix(fallbackHandler=)
@HystrixCommand(fallbackMethod="error")
publicStringdoBServiceOne(){
System.out.println("begindoproviderservice");
returnrestTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody();
}
/**
*CacheResult请求缓存(针对request的缓存),官方建议在serverletfilter中初始化HystrixRequestContext
*在同一用户请求的上下文中缓存在统一请求的上下文环境中有效。
*@paramid
*@return
*/
@CacheResult(cacheKeyMethod="getKey")
@HystrixCommand(fallbackMethod="error")
publicStringdoBServiceTwo(Stringid){
System.out.println("begindoproviderservice");
returnrestTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody();
}
/**
*建议:服务提供方有较高的延迟。可以考虑使用请求合并
*HystrixCollapser合并请求的时候会创建一个请求处理器。如果每次合并的请求量不大,只有很少的请求还要合并,会造成合并时间窗
*并发量增大,时间窗的创建和消耗增大。所以只有在时间窗内有很大的并发量,推荐请求合并。
*
*batchMethod请求合并后的替换方法com.gitee.munan56.cloud.hystrixconsumer.AService#findALl(java.util.List)注意客户端要有这个方法
*HystrixProperty一个属性合并时间窗100s这个时间结束后会发起请求,也就是指这个时间是合并处理的时间
*@paramid
*@return
*/
@HystrixCollapser(batchMethod="findALl",collapserProperties=@HystrixProperty(name="timerDelayInMilliseconds",value="100"))
publicStringdoBFindOne(Stringid){
System.out.println("begindoproviderservice");
returnrestTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody();
}
@HystrixCommand()
publicStringfindALl(Listids){
System.out.println("begindoproviderservice");
returnrestTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody();
}
/**
*服务降级
*指定调用服务出错的回调方法
*@return
*/
publicStringerror(Throwablee){
return"doprovidererrorthisisdefaultresult"+"theerroris"+e.getMessage();
}
/**
*服务降级
*指定调用服务出错的回调方法
*@return
*/
publicStringerror(Stringid,Throwablee){
return"doprovidererrorthisisdefaultresult"+"theerroris"+e.getMessage();
}
publicStringgetKey(Stringid){
returnid;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。