环境:Springboot2.3.12.RELEASE+cloud-netflix-hystrix2.2.10.RELEASE简介SpringCloudCircuitbreaker(断路器)提供了跨不同断路器实现的抽象。它为跨应用程序的使用提供了一致的API,允许开发人员选择最适合应用程序需求的断路器实现。支持的断路器类型:NetfixHystrixResilience4JSentinelSpringRetry核心概念要在代码中创建断路器,您可以使用断路器工厂API。当您在类路径中包含SpringCloudCircuitBreaker启动器时,会自动创建实现此API的bean。下面给出了使用此API的一个非常简单的示例:@ServicepublicstaticclassDemoService{privateRestTemplaterest;privateCircuitBreakerFactorycbFactory;publicDemoService(RestTemplaterest,CircuitBreakerFactorycbFactory){this.rest=rest;this.cbFactory=cbFactory;}publicStringslow(){//默认情况下CircuitBreakerFactory工厂createsacircuitbreakerwithaspecifiedid(name)//run方法是实际执行你的业务方法,第二个参数throwable是当异常发生或者执行超时时//执行fallback(降级)过程returncbFactory.create("slow").run(()->rest.getForObject("/slow",String.class),throwable->"fallback");}}项目配置通过引入以下不同的依赖Hystrix来决定具体的断路器-org.springframework.cloud:spring-cloud-starter-netflix-hystrixResilience4J-org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4jReactiveResilience4J-org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4jSpringRetry-org.springframework.cloud:spring-cloud-starter-circuitbreaker-spring-retrySentinal-org.springframework.cloud:spring-cloud-starter-circuitbreaker-sentinal以上五种断路器是不同的实现方式,可以根据需要引入例子这里以Hystrix为例,引入依赖org.springframework.cloudspring-cloud-starter-netflix-hystrix2.2。10.RELEASE定义一个带有熔断功能的服务@ServicepublicclassDemoService{privateRestTemplaterest;//注入系统的默认实现privateCircuitBreakerFactorycbFactory;publicDemoService(RestTemplaterest,CircuitBreakerFactorycbFactory){this.rest=rest;this.cbFactory=cbFactory;})publicStringslow({//使用系统默认实现创建断路器进行业务处理returncbFactory.create("slow").run(()->rest.getForObject("http://localhost:8080/demos/slow",String.class),throwable->"fallback");}publicStringslow2(){//业务使用自定义断路器工厂处理returncbf().create("demo-slow").run(()->rest.getForObject("http://localhost:8080/demos/slow",String.class),throwable->"fallback");}//这个可以定义为Bean来覆盖系统默认实现,在系统默认实现中有条件地限制privateCircuitBreakerFactorycbf(){HystrixCircuitBreakerFactorycbf=newHystrixCircuitBreakerFactory();//配置线程池HystrixThreadPoolProperties.SetterthreadPoolProperties=HystrixThreadPoolProperties.Setter();threadPoolProperties.withCoreSize(5).withKeepAliveTimeMinutes(5).withMaxQueueSize(Integer.MAX_VALUE).withQueueSizeRejectionThreshold(1000);//配置默认执行行为属性HystrixCommandProperties.SettercommandProperties=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.Settersetter=HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("demo"))//服务分组,largemodule.andCommandKey(HystrixCommandKey.Factory.asKey("demo-slow"))//服务标识(具体服务分组中的子服务),submodule.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("demo-pools"))//线程池名称.andThreadPoolPropertiesDefaults(threadPoolProperties)//线程池相关配置.andCommandPropertiesDefaults(commandProperties);//执行时相关属性配置returnsetter;});returncbf;}}Controller接口@RestController@RequestMapping("/demos")公开icclassDemoController{@ResourceprivateDemoServicedemoService;@GetMapping("/index")publicObjectindex(){returndemoService.slow2();}@GetMapping("/slow")publicObjectslow(){try{TimeUnit.SECONDS.sleep(5);}catch(InterruptedExceptione){e.printStackTrace();}return"slow";}}原理CircuitBreakerFactory#create方法根据当前的创建CircuitBreaker实例我们Hystrix使用的CLASSPATH,所以这里使用的工厂是:HystrixCircuitBreakerFactory类publicclassHystrixCircuitBreakerFactoryextendsCircuitBreakerFactory{泛型参数:Setter用于配置Hystrix相关的配置信息(这里Setter主要用于绑定CommandKeyfor),HystrixConfigBuilder用于构建HystrixCommand.Setter对象执行HystrixCircuitBreakerFactory#configure方法时:publicabstractclassAbstractCircuitBreakerFactory>{privatefinalConcurrentHashMapconfigurations=newConcurrentHashMap<>();publicvoidconfigure(Consumerconsumer,String...ids){for(:ids){//构建一个Builder对象CONFBbuilder=configBuilder(id);//这里使用builder(HystrixConfigBuilder)对象应用Consumer中写入的配置信息consumer.accept(builder);//构建HystrixCommand.SetterobjectCONFconf=builder.build();//最后将key=value通过id绑定到Setter对象上,存入Map集合getConfigurations().put(id,conf);}}//这个方法是子类HystrixCircuitBreakerFactory中实现protectedabstractCONFBconfigBuilder(Stringid);}CircuitbreakerspecificsubclassimplementsHystrixCircuitBreakerFactory//子类继承的父类中的泛型:第一个泛型参数:what需要构建的种类配置,第二个泛型参数:通过whom构建第一个泛型参数配置ystrixConfigBuilder(id);}publicstaticclassHystrixConfigBuilderextendsAbstractHystrixConfigBuilder{publicHystrixConfigBuilder(Stringid){super(id);}//从这里也可以看出,最终的Builder是使用@OverridepublicHystrixCommand.Setterbuild(){CommandnHystrixSet.withGroupKey(getGroupKey()).andCommandKey(getCommandKey()).andCommandPropertiesDefaults(getCommandPropertiesSetter());}}}有了断路器工厂,接下来就是通过工厂创建具体的断路器对象.执行cbf().create("demo-slow")方法?publicclassHystrixCircuitBreakerFactoryextendsCircuitBreakerFactory{privateFunctiondefaultConfiguration=id-Fix.KeywithGroup.KeySetter(asKey(getClass().getSimpleName())).andCommandactKey(HystrixCommand(HystrixCommand)));publicHystrixCircuitBreakercreate(Stringid){//通过上面的分析,所有的HystrixSetters都会绑定id并存储在一个Map中//这里是computeIfAbsent方法先从集合中获取id,如果获取不到,则将第二个参数存入集合中,返回HystrixCommand.Settersetter=getConfigurations().computeIfAbsent(id,defaultConfiguration);returnnewHystrixCircuitBreaker(setter);}}上面创建的是一个HystrixCircuitBreaker断路器。run方法执行时:publicclassHystrixCircuitBreakerimplementsCircuitBreaker{privateHystrixCommand.Settersetter;publicHystrixCircuitBreaker(HystrixCommand.Settersetter){this.setter=setter;}@OverridepublicTrun(SuppliertiontoRun,Funcfallback){//最终执行的是核心HystrixCommand对象HystrixCommandcommand=newHystrixCommand(setter){@OverrideprotectedTrun()throwsException{returntoRun.get();}@OverrideprotectedTgetFallback(){returnfallback.apply(getExecutionException());}};returncommand.execute();}}