时间:2021-05-19
这篇文章主要介绍了SpringCloud断路器Hystrix原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性
两个比较重要的类
注解@HystrixCommand(fallbackMethods="methods")methods中可以添加降级策略
除了提供服务降级
还提供了请求缓存
不过添加CacheResult的时候,说
HystrixRequestContext未初始化。
查看官方文档https://github.com/Netflix/Hystrix/wiki/How-To-Use
Typically this context will be initialized and shut down via a ServletFilter that wraps a user request or some other lifecycle hook.
在同一用户请求的上下文中,相同依赖服务的返回数据始终保持一致。在当次请求内对同一个依赖进行重复调用,只会真实调用一次。在当次请求内数据可以保证一致性。
初始化是在filter中进行(官方建议),但是每一次请求都会进行初始化 。所以说和一般的缓存还是有去别的,可以解决高并发,保证的资源的线程安全。在某些场景很有用。
请求合并
/** * 建议: 服务提供方有较高的延迟。可以考虑使用请求合并 * HystrixCollapser 合并请求的时候会创建一个请求处理器。如果每次合并的请求量不大,只有很少的请求还要合并,会造成合并时间窗 * 并发量增大,时间窗的创建和消耗增大。所以只有在时间窗内有很大的并发量,推荐请求合并。 * * batchMethod 请求合并后的替换方法com.gitee.munan56.cloud.hystrixconsumer.AService#findALl(java.util.List) 注意客户端要有这个方法 *HystrixProperty 一个属性合并时间窗100s 这个时间结束后会发起请求,也就是指这个时间是合并处理的时间 * @param id * @return */ @HystrixCollapser(batchMethod = "findALl",collapserProperties = @HystrixProperty(name = "timerDelayInMilliseconds",value = "100")) public String doBFindOne(String id){ System.out.println("begin do provider service"); return restTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody(); }全部代码
package com.gitee.munan56.cloud.hystrixconsumer;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;import com.netflix.hystrix.contrib.javanica.cache.annotation.CacheResult;import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;import com.netflix.ribbon.proxy.annotation.Hystrix;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import java.util.List;/** * @author munan * @version 1.0 * @date 2020/1/13 10:41 */@Servicepublic class AService { @Autowired private RestTemplate restTemplate; public String doAService(){ return "A Service is run"; }// @Hystrix(fallbackHandler = ) @HystrixCommand(fallbackMethod = "error") public String doBServiceOne(){ System.out.println("begin do provider service"); return restTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody(); } /** * CacheResult 请求缓存(针对request的缓存),官方建议在serverlet filter 中初始化HystrixRequestContext * 在同一用户请求的上下文中缓存在统一请求的上下文环境中有效。 * @param id * @return */ @CacheResult(cacheKeyMethod = "getKey") @HystrixCommand(fallbackMethod = "error") public String doBServiceTwo(String id){ System.out.println("begin do provider service"); return restTemplate.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 这个时间结束后会发起请求,也就是指这个时间是合并处理的时间 * @param id * @return */ @HystrixCollapser(batchMethod = "findALl",collapserProperties = @HystrixProperty(name = "timerDelayInMilliseconds",value = "100")) public String doBFindOne(String id){ System.out.println("begin do provider service"); return restTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody(); } @HystrixCommand() public String findALl(List<String> ids){ System.out.println("begin do provider service"); return restTemplate.getForEntity("http://service-provider:8081/api/v1/provider/do",String.class).getBody(); } /** * 服务降级 * 指定调用服务出错的回调方法 * @return */ public String error(Throwable e){ return "do provider error this is default result" + "the error is " + e.getMessage(); } /** * 服务降级 * 指定调用服务出错的回调方法 * @return */ public String error(String id ,Throwable e){ return "do provider error this is default result" + "the error is " + e.getMessage(); } public String getKey(String id){ return id; }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识。SpringCloudHystrix
在SpringCloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离。
一、springcloud简介springcloud是一个基千springboot实现的微服务架构开发工具。它为微服务架构中涉及的配置管理、服务治理、断路器、智
断路器1p是指断路器只断1根线(通常断火线),2p是指断路器断2根。对于微型断路器来说1p、2p一般都用来作为单相用电器的通断控制,但效果不同。 断路器是指能
空开频繁跳闸的原因及解决办法: 一、超负荷跳闸 电路中的负荷过高,引发断路器过载保护,从而引起跳闸。如果是普通的断路器跳闸,或漏电断路器跳闸后复位按钮没有突