依赖本文源码分析pom依赖如下版本 3.1.0dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-circuitbreaker-resilience4j/artifactId version3.1.0/version /dependency自动装配入口org.springframework.cloud.openfeign.FeignAutoConfiguration .CircuitBreakerPresentFeignTargeterConfiguration.circuitBreakerFeignTargeter详细配置代码Configuration(proxyBeanMethodsfalse)ConditionalOnClass(CircuitBreaker.class)ConditionalOnProperty(valuespring.cloud.openfeign.circuitbreaker.enabled, havingValuetrue)protected static class CircuitBreakerPresentFeignTargeterConfiguration{Bean ConditionalOnMissingBean(CircuitBreakerFactory.class)public TargeterdefaultFeignTargeter(){returnnew DefaultTargeter();}Bean ConditionalOnMissingBean(CircuitBreakerNameResolver.class)ConditionalOnProperty(valuespring.cloud.openfeign.circuitbreaker.alphanumeric-ids.enabled, havingValuefalse)public CircuitBreakerNameResolvercircuitBreakerNameResolver(){returnnew DefaultCircuitBreakerNameResolver();}Bean ConditionalOnMissingBean(CircuitBreakerNameResolver.class)ConditionalOnProperty(valuespring.cloud.openfeign.circuitbreaker.alphanumeric-ids.enabled, havingValuetrue, matchIfMissingtrue)public CircuitBreakerNameResolveralphanumericCircuitBreakerNameResolver(){returnnew AlphanumericCircuitBreakerNameResolver();}SuppressWarnings(rawtypes)Bean ConditionalOnMissingBean ConditionalOnBean(CircuitBreakerFactory.class)public Targeter circuitBreakerFeignTargeter(CircuitBreakerFactory circuitBreakerFactory, Value(${spring.cloud.openfeign.circuitbreaker.group.enabled:false})boolean circuitBreakerGroupEnabled, CircuitBreakerNameResolver circuitBreakerNameResolver){returnnew FeignCircuitBreakerTargeter(circuitBreakerFactory, circuitBreakerGroupEnabled, circuitBreakerNameResolver);}static class DefaultCircuitBreakerNameResolver implements CircuitBreakerNameResolver{Override public String resolveCircuitBreakerName(String feignClientName, Target?target, Method method){returnFeign.configKey(target.type(), method);}}static class AlphanumericCircuitBreakerNameResolver extends DefaultCircuitBreakerNameResolver{Override public String resolveCircuitBreakerName(String feignClientName, Target?target, Method method){returnsuper.resolveCircuitBreakerName(feignClientName, target, method).replaceAll([^a-zA-Z0-9],);}}}circuitBreakerFeignTargeter 方法会返回一个ATargeter对象 依赖的参数是CircuitBreakerFactory circuitBreakerFactory这个CircuitBreakerFactory 参数是在 org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JAutoConfiguration中定义的配置如下Bean ConditionalOnMissingBean(CircuitBreakerFactory.class)public Resilience4JCircuitBreakerFactory resilience4jCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry, TimeLimiterRegistry timeLimiterRegistry, Autowired(requiredfalse)Resilience4jBulkheadProvider bulkheadProvider, Resilience4JConfigurationProperties resilience4JConfigurationProperties){Resilience4JCircuitBreakerFactory factorynew Resilience4JCircuitBreakerFactory(circuitBreakerRegistry, timeLimiterRegistry, bulkheadProvider, resilience4JConfigurationProperties);customizers.forEach(customizer -customizer.customize(factory));returnfactory;}上文提到的ATargeter对象 是一个FeignCircuitBreakerTargeter实例这个类主要作用是在org.springframework.cloud.openfeign.FeignClientFactoryBean#getObject起作用创建OpenFeign代理对象最终执行的代码是feign.ReflectiveFeign#newInstance(feign.Target, C)publicTT newInstance(TargetTtarget, C requestContext){ReflectiveFeign.TargetSpecificationVerifier.verify(target);MapMethod, InvocationHandlerFactory.MethodHandlermethodToHandlerthis.targetToHandlersByName.apply(target, requestContext);InvocationHandler handlerthis.factory.create(target, methodToHandler);T proxy(T)Proxy.newProxyInstance(target.type().getClassLoader(), new Class[]{target.type()}, handler);for(InvocationHandlerFactory.MethodHandler methodHandler:methodToHandler.values()){if(methodHandler instanceof DefaultMethodHandler){((DefaultMethodHandler)methodHandler).bindTo(proxy);}}returnproxy;}从这个方法就能看出openfeign的乾坤了说实话这细节太多 记也记不住调用入口feign调用CircuitBreaker栈org.springframework.cloud.openfeign.FeignCircuitBreakerInvocationHandler.invoke → org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory.create ↓ org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreaker.run ↓ org.springframework.cloud.circuitbreaker.resilience4j.Resilience4jBulkheadProvider.run如果要细细研究就只能打断点跟踪了todo~~