范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringCloud中断路器CircuitBreaker的应用

  环境:Springboot2.3.12.RELEASE + cloud-netflix-hystrix2.2.10.RELEASE简介
  SpringCloud Circuit breaker(断路器)提供了跨不同断路器实现的抽象。它提供了在应用程序中使用的一致API,允许开发人员选择最适合应用程序需要的断路器实现。
  支持的断路器类型:Netfix Hystrix Resilience4J Sentinel Spring Retry 核心概念
  要在代码中创建断路器(circuit breaker),可以使用断路器工厂API。当您在类路径中包含Spring Cloud Circuit Breaker starter时,将自动创建一个实现此API的bean。下面给出了使用此API的一个非常简单的示例:@Service public static class DemoService {   private RestTemplate rest;   private CircuitBreakerFactory cbFactory;    public DemoService(RestTemplate rest, CircuitBreakerFactory cbFactory) {     this.rest = rest;     this.cbFactory = cbFactory;   }    public String slow() {     // 通过默认的CircuitBreakerFactory工厂创建一个指定id(名称)的断路器     // run方法是实际执行你的业务方法,第二个参数throwable 是当发生异常或者是执行超时     // 执行的回退(降级)处理     return cbFactory.create("slow").run(() -> rest.getForObject("/slow", String.class), throwable -> "fallback");   } }项目配置
  通过引入下面不同依赖来确定使用具体的那个断路器Hystrix -  org.springframework.cloud:spring-cloud-starter-netflix-hystrix Resilience4J -  org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j Reactive Resilience4J -  org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j Spring Retry -  org.springframework.cloud:spring-cloud-starter-circuitbreaker-spring-retry Sentinal -  org.springframework.cloud:spring-cloud-starter-circuitbreaker-sentinal
  以上5种断路器是不同的实现方式,根据需要引入即可。示例
  这里以Hystrix为例来使用
  引入依赖   org.springframework.cloud   spring-cloud-starter-netflix-hystrix   2.2.10.RELEASE 
  定义具有熔断功能的服务@Service public class DemoService {    private RestTemplate rest;   // 注入系统默认的实现   private CircuitBreakerFactory cbFactory;    public DemoService(RestTemplate rest, CircuitBreakerFactory cbFactory) {     this.rest = rest;     this.cbFactory = cbFactory;   }    public String slow() {     // 使用系统默认的实现创建断路器进行业务的处理     return cbFactory.create("slow").run(() -> rest.getForObject("http://localhost:8080/demos/slow", String.class), throwable -> "fallback");   }    public String slow2() {     // 使用自定义的断路器工厂进行业务的处理     return cbf().create("demo-slow").run(() -> rest.getForObject("http://localhost:8080/demos/slow", String.class), throwable -> "fallback");   }    // 可以将这个定义为Bean来覆盖系统默认的实现,在系统默认的实现上有条件限定   private CircuitBreakerFactory cbf() {     HystrixCircuitBreakerFactory cbf = new HystrixCircuitBreakerFactory() ;     // 配置线程池     HystrixThreadPoolProperties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter() ;     threadPoolProperties.withCoreSize(5)       .withKeepAliveTimeMinutes(5)       .withMaxQueueSize(Integer.MAX_VALUE)       .withQueueSizeRejectionThreshold(1000) ;     // 配置默认的执行行为属性     HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter() ;     commandProperties.withCircuitBreakerEnabled(true)     // 当请求超过了3s那么断路器就会工作进行回退(降级处理),执行上面run方法中的第二个参数       .withExecutionTimeoutInMilliseconds(3000)       .withRequestCacheEnabled(true)       // 隔离策略有两种THREAD,SEMAPHORE       // THREAD: 避免线程被阻塞       // SEMAPHORE: 适合高并发限流处理;因为线程池的方式一般不会创建过多的线程       // 线程是有限的,在高并发情况下是没法满足响应处理的。       .withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD); 		     // 将其加入到集合中,为不同的服务创建不同的配置     cbf.configure(builder -> {       builder.commandProperties(commandProperties).groupName("demo") ;     }, "demo-slow"); 	         // 当默认的id不存在时使用这默认的配置     cbf.configureDefault(id -> {       HystrixCommand.Setter setter = HystrixCommand.Setter         .withGroupKey(HystrixCommandGroupKey.Factory.asKey("demo")) // 服务分组,大的模块         .andCommandKey(HystrixCommandKey.Factory.asKey("demo-slow")) // 服务标识(具体服务分组中的某一个子的服务),子模块         .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("demo-pools")) // 线程池名称         .andThreadPoolPropertiesDefaults(threadPoolProperties) // 线程池相关配置         .andCommandPropertiesDefaults(commandProperties) ; // 执行时相关属性配置        return setter ;     });     return cbf ;   }  }
  Controller接口@RestController @RequestMapping("/demos") public class DemoController { 	   @Resource   private DemoService demoService ; 	   @GetMapping("/index")   public Object index() {     return demoService.slow2() ;   } 	   @GetMapping("/slow")   public Object slow() {     try {       TimeUnit.SECONDS.sleep(5) ;     } catch (InterruptedException e) {       e.printStackTrace();     }     return "slow" ;   } 	 }原理
  CircuitBreakerFactory#create方法创建了CircuitBreaker实例
  根据当前的CLASSPATH我们使用的是Hystrix,那么这里使用的工厂就是:
  HystrixCircuitBreakerFactory类public class HystrixCircuitBreakerFactory extends CircuitBreakerFactory {
  泛型参数:Setter就是用来配置Hystrix相关配置信息的(这里主要用来CommandKey与Setter进行绑定),HystrixConfigBuilder用来构建 HystrixCommand.Setter对象。
  当执行HystrixCircuitBreakerFactory#configure方法时:public abstract class AbstractCircuitBreakerFactory> {   private final ConcurrentHashMap configurations = new ConcurrentHashMap<>();   public void configure(Consumer consumer, String... ids) {     for (String id : ids) {       // 构建一个Builder对象       CONFB builder = configBuilder(id);       // 这里通过builder(HystrixConfigBuilder)对象来应用Consumer中编写的配置信息       consumer.accept(builder);       // 构建HystrixCommand.Setter 对象       CONF conf = builder.build();       // 最后将通过id 与 Setter对象绑定key=value存入Map集合中       getConfigurations().put(id, conf);     }   }   // 该方法在子类HystrixCircuitBreakerFactory中实现   protected abstract CONFB configBuilder(String id); }
  断路器具体的子类实现HystrixCircuitBreakerFactory// 子类继承的父类中的泛型:第一个泛型参数:需要构建什么样的一个配置,第二个泛型参数:通过谁来构建第一个泛型参数配置 public class HystrixCircuitBreakerFactory extends CircuitBreakerFactory {   public HystrixConfigBuilder configBuilder(String id) {     return new HystrixConfigBuilder(id);   }   public static class HystrixConfigBuilder extends AbstractHystrixConfigBuilder {     public HystrixConfigBuilder(String id) {       super(id);     }     // 从这里也看出来最终Builder就是用来构建Setter对象用     @Override     public HystrixCommand.Setter build() {       return HystrixCommand.Setter.withGroupKey(getGroupKey())         .andCommandKey(getCommandKey())         .andCommandPropertiesDefaults(getCommandPropertiesSetter());     }   } }
  断路器工厂有了,接下来就是通过工厂创建具体的断路器对象了
  通过上面的代码执行cbf().create("demo-slow")方法时执行了什么?public class HystrixCircuitBreakerFactory extends CircuitBreakerFactory {   private Function defaultConfiguration = id -> HystrixCommand.Setter     .withGroupKey(HystrixCommandGroupKey.Factory.asKey(getClass().getSimpleName()))     .andCommandKey(HystrixCommandKey.Factory.asKey(id));   public HystrixCircuitBreaker create(String id) {     // 通过上面分析最终所有的Hystrix的Setter会与id绑定存入一个Map中     // 这里computeIfAbsent方法先从集合中通过id获取,如果获取不到则将第二个参数存入集合中返回     HystrixCommand.Setter setter = getConfigurations().computeIfAbsent(id, defaultConfiguration);     return new HystrixCircuitBreaker(setter);   } }
  上面创建的是HystrixCircuitBreaker断路器,当执行run方法时:public class HystrixCircuitBreaker implements CircuitBreaker {   private HystrixCommand.Setter setter;   public HystrixCircuitBreaker(HystrixCommand.Setter setter) {     this.setter = setter;   }   @Override   public  T run(Supplier toRun, Function fallback) {     // 最终执行的就是Hystrix的核心 HystrixCommand对象     HystrixCommand command = new HystrixCommand(setter) {       @Override       protected T run() throws Exception {         return toRun.get();       }       @Override       protected T getFallback() {         return fallback.apply(getExecutionException());       }     };     return command.execute();   } }
  完毕!!!
  关注+转发
  Sentinel 与 Hystrix 的对比
  SpringCloud Hystrix实现资源隔离应用
  SpringCloud Gateway 应用Hystrix 限流功能 自定义Filter详解
  Spring Boot Security防重登录及在线总数
  Spring Retry重试框架的应用
  springboot mybatis jpa 实现读写分离
  Spring容器对象BeanFactory与ApplicationContext你都清楚了吗?

RenewableandSustainableEnergyReviews钙钛矿纳米棒前沿(理解和翻译不当之处,恳请各位领导老师前辈同行批评指正)点击文末阅读原文可获得原文链接httpswww。sciencedirect。comsciencearticlepiiS136中国式现代化下的金融科技新使命李南青微众银行党委书记行长马智涛微众银行副行长首席信息官随着中国步入高质量发展的新阶段,以中国式现代化全面推进中华民族伟大复兴成为了全国人民的宏伟目标。基于此,现尝试从数字银行的发孟晚舟又被曝新消息,业内知情人士透露,4月1日身份将有新变化孟晚舟又被曝新消息,业内知情人士透露,4月1日将当值华为董事长熟悉孟晚舟是从她在加拿大被软禁开始。本是再正常不过的一场工作出差转机,结果却被软禁在了加拿大,而且长达1028天。引渡提升CoC电催化剂的氧还原反应性能范壮军教授黄毅超教授任浩副教授,Small观点基于石墨烯量子点配位的缺陷修复策略提升CoNC电催化剂的氧还原反应性能文章信息基于石墨烯量子点配位的缺陷修复策略提升CoNC电催化剂的存钱不需要收入证明!望周知浙江一位女士去银行存5万元现金被要求提供收入证明上了热搜。去银行存现金,需要出示收入证明吗?答案是,不需要。根据各大银行的回应,出现上述情况,银行最多口头询问储户身份,钱的来源和用雄韬股份15GWh锂电和10GWh钠电产业园项目成功签约近日,雄韬股份与京山市人民政府签署了投资框架协议。其合作项目雄韬股份15GWh锂电和10GWh钠电产业园,计划投资总额约105亿元人民币,主要生产锂电池和钠电池等新能源产品,应用于去年我国人民币增发28万亿,为何老百姓没感觉,钱都流向了哪里?2022年,我国全年GDP总量为121。01万亿元,相较于2021年仅增长了6万亿,但你能想象么?过去一年,我国光印钞就达到了28万亿,根据央行最新数据显示,截止到2022年底,我截然相反!元月企业忙贷款百姓忙存钱1月信贷数据发布,从总量和结构两个角度解读,可以看出企业和个人的不同心态。总量角度吹来的是暖风。1月新增贷款4。9万亿元,预期4万亿元,开年首月表内贷款出现创纪录上行。从结构角度看住房公积金自己交1250元,公司交1250元,在我国处于何种水平?买房是居民生活中的一件大事,怎样尽可能节约成本是很多人的重大关切之一。住房公积金制度的推行和使用,为居民买房提供了很多优惠措施,可以节省不少购房花费。有网友提出这样一个疑问,如果自农夫山泉新靠山涨价大包装来源伯虎财经(bohuFN)作者梦得大自然的搬运工要涨价?2月1日,一张农夫山泉杭州区域19升水调价通知在业内流传。根据通知内容,农夫山泉计划提高杭州市19L桶装水的售价,由此前的智联招聘发布春招报告成都餐饮旅游业招聘快速反弹,节后首周平均招聘薪酬9594元月2023年春招季已拉开帷幕,红星新闻记者从智联招聘获悉,近日,智联招聘发布2023年春招市场行情周报。调研数据显示,春节后超7成企业看好经济走势。从人才端看,节后首周求职人数同比增
硬核轻旗舰OPPOK10Pro登场,OPPOK9跌至大米价,无情让路了4月24日正式发布硬核轻旗舰OPPOK10Pro新机索尼IMX766出色的硬件素质给予了用户极大的创作宽容度,4月24日正式发布硬核轻旗舰OPPOK10Pro新机基本上都能一键得到老男人游朝鲜,嘴巴太甜了,会把朝鲜小姑娘带坏吗?很多游客从朝鲜旅游回来后都会对整个行程夸赞一番,这其中导游小姐姐们可谓功不可没,这些漂亮清纯的朝鲜小姑娘,吸引很多本对本地提不起兴趣的小伙伴前往探访,从而对其有个全方位的认知,而不这四类食物适合睡前加餐糖尿病是现在很常见的疾病,对于糖尿病患者来说相信很多人都不陌生,也都知道糖尿病患者在饮食方面有很多的注意事项,有一部分糖尿病患者食欲可能会比较好,而且吃过后很快会饿,所以有一部分糖发微信朋友圈的经典句子1。近知鱼性,近识鸟2。人贵于内涵,物贵于品质3。你需要的永远不是价格而是品质4。早成者未必有成,晚达者未必不达,不可年少而自恃,不可年老而自弃5。你若心里有花,这花早晚都会开放6话题深扒庄里夜市的秘密花渐密,草渐浓,当微风袭来,带着花香和阵阵泥土的芬芳,轻柔的拂过脸庞,我们就意识到,夏天要来了。伴随着夏天一起到来的,有滹沱河凉凉的河水,有冰箱里的冰西瓜,还有夜市上令人垂涎三尺的全球有15死亡与饮食有关,中国居民膳食指南再更新来源健康时报(人民日报健康客户端记者乔靖芳)2018全球营养报告显示,不合理的膳食结构已造成严重的健康负担,全球有15的死亡与饮食有关。4月26日,在中国居民膳食指南(2022)发夏天将至,吃凉皮凉面不如吃它,饱腹感强,酸甜麻辣越吃越上瘾不知不觉马上就要立夏了,随着夏天的脚步越来越近,很多地方的气温都是直线上升,有些地方更是直逼30度的高温!随着天气越来越热,很多朋友都开始抱怨起来,天热了不知道吃啥,厨房整天跟蒸笼俄乌战争最终可能会加速数字货币作为进行国际交易的工具俄乌战争及其后续影响对国际货币体系的最大冲击,在于美国与部分欧洲国家冻结了俄罗斯的外汇储备与黄金储备,这就破坏了迄今为止全球最重要安全资产(美国国债)的安全性。例如,对中国沙特印度人民币贬值超两千点,央行出手,人民币贬值是好是坏?为什么说人民币贬值不是坏事据央行网站4月25日晚间消息,为提升金融机构外汇资金运用能力,中国人民银行决定,自2022年5月15日起,下调金融机构外汇存款准备金率1个百分点,即外汇存电压力锅蛋糕怎么不湿不粘还蓬松,配方和雷点依次总结,值得收藏五一放假时间安排,在家教你用电压锅做蛋糕,柔软香甜,值得收藏。今天4月26日,还有4天就到五一了。五一劳动节,国家都放假,一般都是3天5天假左右,今年五一劳动节放了5天假,比去年前中国数字人民币的进展在过去的几年里,我国一直在稳步推进数字人民币,现在似乎准备成为第一个推出官方央行数字货币(CBDC)的主要经济体。然而现实比这更复杂,尽管中国在数字货币研究方面领先于任何其他主要经潮人新知3。5亿元太空10日游,包来回机票值不值?文克莉斯汀当地时间4月8日早上11点17分,SpaceX载人龙飞船成功发射,在飞行了大约20个小时后,已于北京时间11日凌晨抵达国际空间站。国际空间站首次迎来了4位非现役太空人组成闽山闽水物华新我在福建,找了个看海听风的地方大概没有人不向往大海那抹蓝吧。一眼蔚蓝,潮来潮去,所有的情绪都被漫天漫地的温柔与宏大包容着安抚着,像有一只巨大的手,慢慢抚平心中褶皱,于是渐渐平静,渐渐回归清澈与自由福建就有这样的拉尕山,一生一次必去的地方!拉尕山,神仙喜爱的地方,一方慈悲浸染的山水,被甘南托在掌心,它将湖泊山峰挂在门楣,把藏乡村寨揣在怀里。桦树坪上,格萨尔王的传说栩栩如生,岷山脚下,佐瑞姑娘的歌舞美丽动人。登临拉尕之牡丹花开动京城京城这些地方牡丹开得正好谷雨三朝看牡丹,现在,北京的牡丹正在盛花期。但是,疫情又气势汹汹而来,如果能不出门就还是尽量不要出门参观了。大家可以就浏览浏览,云参观一下。景山公园在京城,景山公园牡丹最有名。这里如果不能吃到这些花食,那就启程去这些地方赏花吧!盼望着,盼望着,东风来了,五颜六色的鲜花装点着大地,为江西增添了一抹别样的春意,但却有这么一批人,看着盛开的鲜花,嘴角流下了不争气的眼泪。其实,鲜花不仅能为春天带来光彩,也能在你的世界上最偏远的邮局正在招聘去南极当企鹅铲屎官,月薪超万元有着世界上最偏远的邮局之称的南极洲洛克罗伊港邮局正在招募中,如果你热爱自然擅长分拣邮件卖邮票和数企鹅,这可能是一份完美的工作。洛克罗伊港邮局位于南极半岛西侧的高迪尔岛上据外媒24日科学家研发原子级超薄材料可提高各种光技术效率相机太阳能面板生物传感器和光纤等技术都依赖光电探测器,或将光转化为电的传感器。随着其组件半导体芯片尺寸的缩小,光电探测器正变得更加高效和实惠。然而,目前的材料和制造方法限制了小型化石墨烯的量子魔法带来了新超导材料超导体是在几乎没有任何电阻的情况下传导电流的材料。这一特性使它们在各种应用中特别有吸引力,其中包括无损耗的电力电缆电动机和发电机以及可用于核磁共振成像和磁悬浮列车的强大电磁铁。现在澳研究人员发现气候变暖正在放大全球水循环2月23日,自然(Nature)发表题为1970年以来观测到的向极地的淡水输送(ObservedPolewardFreshwaterTransportSince1970)的文章指出绣花短裤搭配褶皱衬衫,别致又复古,你学会了吗?绣花短裤搭配褶皱衬衫,别致又复古,我学会了。在常见的服装加入独特的元素就会展现出与众不同的魅力,图中的美女选择了带绣花的短裤,上面的绣花工艺复杂十分精美,高端又大气,充满了复古气息二氧化碳可以做燃料?你相信吗?为了降低火箭的发射成本,降低二氧化碳的排放量。埃隆马斯克提出了一项用空气制造火箭燃料的方案。因为火箭的燃料,不同的火箭,所需要的燃料也是完全不同的,通常都是由二甲肼,乙醇,煤油,甚