设计模式)
没有Registry的写法// ❌ 你自己手搓CircuitBreakerConfigconfigCircuitBreakerConfig.custom()...build();CircuitBreakerpayCbCircuitBreaker.of(payService,config);CircuitBreakerstockCbCircuitBreaker.of(stockService,config);CircuitBreakersmsCbCircuitBreaker.of(smsService,config);问题是这仨变量放哪 全局变量静态 Map散落在各处别的类怎么用到它 每次都要拿到那一个实例不能 new 新的。想加一个服务怎么办 要改代码。Registry的底层就是Map// 我自己手搓一个 Registry30 行搞定publicclassMyCircuitBreakerRegistry{// 核心一个 Mapkey 是服务名value 是断路器privateMapString,CircuitBreakermapnewConcurrentHashMap();privateCircuitBreakerConfigdefaultConfig;publicMyCircuitBreakerRegistry(CircuitBreakerConfigdefaultConfig){this.defaultConfigdefaultConfig;}// 按名字取有就返回没有就创建一个存进去publicCircuitBreakercircuitBreaker(Stringname){returnmap.computeIfAbsent(name,n-CircuitBreaker.of(n,defaultConfig));}// 看看现在管着哪些断路器publicMapString,CircuitBreakergetAll(){returnmap;}}用起来就是// 第一次取 → 创建并存起来CircuitBreakercb1registry.circuitBreaker(payService);// 第二次取 → 返回同一个CircuitBreakercb2registry.circuitBreaker(payService);System.out.println(cb1cb2);// true同一个对象Registry “按名字取东西的仓库”JDK 里有DriverManager按名字取数据库驱动Spring 里有BeanFactory按名字取 Bean)Resilience4j 里有CircuitBreakerRegistry按名字取断路器BeanpublicCircuitBreakerRegistrycircuitBreakerRegistry(){CircuitBreakerConfigconfigCircuitBreakerConfig.custom().slidingWindowSize(100)// ...一堆参数.build();returnCircuitBreakerRegistry.of(config);// ↑ ↑// Resilience4j 用这份 config 建一个空仓库// 自带的类 以后往里面放的断路器都用这份 config}