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

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你都清楚了吗?

物流成本核算方法统计方法统计方式的物流成本核算不要求设置完整的凭证账户报表体系,而主要是在不影响当前财务会计核算体系的基础上,通过对有关物流业务的原始凭证和单据进行再次归类整理,对企业现行成本核算资料进行每次10分钟跟我学Python(第九十五次课)大家好!我是幻化意识流,今天继续跟我学Python。那天,我在头条上看了一篇文章,文章说的是关于咱们大脑的事情,文章是这样说的,他说,我们的大脑是被设计出来的,至于谁设计的不知道,免费一款乐播投屏v5。2。12纯净免费版软件介绍乐播投屏下载安装后就可以和电脑电视进行投屏了,当然,电脑和电视上也必须安装了对应的客户端。作为一个强大的手机投屏软件,乐播投屏功能方面还是很全面的,可以投视频音乐图片文档等明星艺术签名设计v4。7免费版明星艺术签名设计免费版是一款为用户朋友们打造的签名设计app,很多用户都非常的羡慕明星能够拥有自己的签名,使用这款明星艺术签名设计免费版人人都能拥有自己的专属签名,虽然现在是互联网操作简单功能强大,哪里酸痛点哪里甫士筋膜枪评测Part1前言运动后我们很多时候都会肌肉酸痛的现象,而对于运动恢复我们会采用拉伸的方式,这样简单方便效果还可以。不过在运动圈流行了一款运动恢复神器筋膜枪。筋膜枪这个词听着比较陌生,华为新机上架,搭载麒麟990处理器,价格便宜500华为是大家非常关注的品牌。就在本月22日,华为发布了一款折叠屏手机,这就是mateX2,这也是华为旗下第三款折叠屏手机。华为mateX2自从发布之后,就引起了众多用户的兴趣。虽然m迪丽热巴同款唱吧K歌宝小巨蛋G2MAX深度体验哈喽大家好,我是你们的校长!今天给大家带来的是唱吧K歌宝小巨蛋G2MAX!疫情期间不好约朋友去KTV唱歌,所以我就在家里准备了小巨蛋G2MAX,这样就可以远程连麦达到KTV的音效啦每次10分钟跟我学Python(第二十二次课)大家好!我是幻化意识流。今天继续跟我学Python。我们有时候想知道当前变量中所存储的值的数据类型是什么,我们该怎么做呢?来我们做个试验a1b1。0c1type(a)type(b)每次10分钟跟我学Python(第十一次课)大家好!我是幻化意识流。今天继续跟我学Python。看过我发布课的同学一定能感觉到,我的课程里没有太多的理论,上来就是实践。是的,经过我以往学习的经历经验,我觉得实践是硬道理。如果颈椎呵护绽放新生P。Health碧荷U型枕评测P。Health包装非常简洁,靛蓝色为主色调。标签写有产品信息和概念图。DesignedintheNetherlands字样,荷兰设计。全家福U型枕收纳袋以及厂家赠送的眼罩耳罩。细Orico奥睿科显示器增高架体验救救孩子的颈椎颜值正面有Orico奥睿科的品牌LOGO。Orico奥睿科作为国内领先的存储品牌之一,其在硬件周边领域也有不少有意思的产品。就比如这款笔记本托架,当然,它不仅是用于笔记本电脑的增高
老师为什么很反感毕业设计做管理系统?这是现在的情况,早期的毕设,大量的各种管理系统。现在的管理系统,已经可以被严格定义成几个模块,权限,基础档案,单据,单据列表,报表。每个模块都有现成的方案,现在还写管理系统论文,纯小米手机的地震预警要打开!关键时刻用途很大大家好,我是那个技术性博主老卢科技,欢迎收看我的视频。小米手机有一项功能,苹果手机都没有,它就是地震预警功能,你听说过吗?你知道如何打开它吗?今天这一视频我就教你快速的打开小米手机WWDC2021前瞻除了操作系统硬件新品外,或还有彩蛋?在两个月前,苹果就已经对外宣布今年的WWDC大会将在当地时间6月7日至11日召开,由于疫情这只黑天鹅的持续影响,今年仍会选择线上的方式举办。作为普通消费者,对于WWDC2021最关国内销量增速第一,出道仅2年的realme的底气在哪里?如果你一直关注着智能手机市场,那么一定会发现在经历了2020年的低迷之后,2021年中国手机销量开始呈现回暖的趋势。确实,从上半年各大厂商陆陆续续举办的发布会在当微博上各种评测用户微型新能源汽车大比拼,谁才是最打动年轻人的那一款车?随着国内的新能源汽车大发展,售价较低的微型新能源汽车开始走入了广大年轻人的视野。这些微型新能源汽车主打颜值,续航一般能够满足市内代步需要,加上较低的购买成本和持有成本,成为了打动年夸克APP发布5。0版个性化产品设计引年轻人青睐一款年轻人喜爱的搜索APP应该长什么样?答案是长得不一样。5月22日,智能搜索APP夸克正式推出5。0版,让产品体验更加简洁高效的同时,新版产品玩起了变脸,在首页推出了个性化的快捷京东国际上架芬兰原装进口诺基亚塞班手机IT之家5月21日消息有网友发现,京东国际上一些店铺上架了芬兰原装进口诺基亚塞班手机。其中诺基亚N95咖啡色售价3200元,诺基亚N91黑色售价2800元,诺基亚N8银色售价188请问联想r9000p3060和魔霸新锐3060怎么选?拯救者可以等25号上新,有首发价格。但是ROG魔霸新锐处理器R95900HX比拯救者R9000P5800H大概强6左右,屏幕240Hz。机器外观各有所爱,尺寸相差不大,剩下的是看价飞机上不打开飞行模式会被发现吗?现在坐飞机不会强求手机打开飞行模式,但是空姐会提醒乘客调到飞行模式。如果不调到飞行模式,空姐也不会发现,但是飞行过程中没有信号,起飞和降落会影响飞行信号接收,为了自身安全,还是调整磷酸铁锂电池省钱效应立竿见影电动车装车量占比一年大涨6成经济观察报记者周菊在近日小鹏汽车召开的2021年Q1财报电话会上,磷酸铁锂电池作为提升公司毛利率的功臣之一被多次提及。小鹏汽车管理层在回答投资者提问时表示,公司毛利率提升的原因之一虚拟代币超级骗局虚拟代币能给中国(世界)带来什么?一虚拟代币可以正向促使世界经济发展?能让财富真正增值?不能。本质上一段无实际意义的数据能发展经济?笑话。如果有一天,人人都持有使用炒作虚拟代币,你