表)設(shè)計(jì)模式)
沒有Registry的寫法// ? 你自己手搓CircuitBreakerConfigconfigCircuitBreakerConfig.custom()...build();CircuitBreakerpayCbCircuitBreaker.of(payService,config);CircuitBreakerstockCbCircuitBreaker.of(stockService,config);CircuitBreakersmsCbCircuitBreaker.of(smsService,config);問題是這仨變量放哪 全局變量靜態(tài) Map散落在各處別的類怎么用到它 每次都要拿到那一個(gè)實(shí)例不能 new 新的。想加一個(gè)服務(wù)怎么辦 要改代碼。Registry的底層就是Map// 我自己手搓一個(gè) Registry30 行搞定publicclassMyCircuitBreakerRegistry{// 核心一個(gè) Mapkey 是服務(wù)名value 是斷路器privateMapString,CircuitBreakermapnewConcurrentHashMap();privateCircuitBreakerConfigdefaultConfig;publicMyCircuitBreakerRegistry(CircuitBreakerConfigdefaultConfig){this.defaultConfigdefaultConfig;}// 按名字取有就返回沒有就創(chuàng)建一個(gè)存進(jìn)去publicCircuitBreakercircuitBreaker(Stringname){returnmap.computeIfAbsent(name,n-CircuitBreaker.of(n,defaultConfig));}// 看看現(xiàn)在管著哪些斷路器publicMapString,CircuitBreakergetAll(){returnmap;}}用起來就是// 第一次取 → 創(chuàng)建并存起來CircuitBreakercb1registry.circuitBreaker(payService);// 第二次取 → 返回同一個(gè)CircuitBreakercb2registry.circuitBreaker(payService);System.out.println(cb1cb2);// true同一個(gè)對(duì)象Registry “按名字取東西的倉庫”JDK 里有DriverManager按名字取數(shù)據(jù)庫驅(qū)動(dòng)Spring 里有BeanFactory按名字取 Bean)Resilience4j 里有CircuitBreakerRegistry按名字取斷路器BeanpublicCircuitBreakerRegistrycircuitBreakerRegistry(){CircuitBreakerConfigconfigCircuitBreakerConfig.custom().slidingWindowSize(100)// ...一堆參數(shù).build();returnCircuitBreakerRegistry.of(config);// ↑ ↑// Resilience4j 用這份 config 建一個(gè)空倉庫// 自帶的類 以后往里面放的斷路器都用這份 config}