Stručný sprievodca pre Spring Cloud Circuit Breaker

1. Prehľad

V tomto návode predstavíme projekt Spring Cloud Circuit Breaker a naučiť sa, ako to môžeme využiť.

Najprv sa pozrieme na to, čo ponúka Spring Cloud Circuit Breaker popri existujúcich implementáciách ističov. Ďalej sa naučíme, ako používať mechanizmus automatickej konfigurácie Spring Boot na integráciu jedného alebo viacerých ističov do našej aplikácie.

Všimnite si, že máme viac informácií o tom, čo je prerušovač obvodu a ako pracujú, v Úvod do Hystrix, Spring Cloud Netflix Hystrix a Sprievodca Resilience4j.

2. Prerušovač jarnej oblačnosti

Spring Cloud nám donedávna poskytoval iba jeden spôsob, ako do našich aplikácií pridať ističe. A to vďaka použitiu služby Netflix Hystrix v rámci projektu Spring Cloud Netflix.

Projekt Spring Cloud Netflix je v skutočnosti iba anotačnou obalovou knižnicou okolo Hystrixu. Preto sú tieto dve knižnice úzko spojené. To znamená, že bez zmeny aplikácie nemôžeme prejsť na inú implementáciu ističa.

Rieši to projekt Spring Cloud Circuit Breaker. Poskytuje abstrakčnú vrstvu naprieč rôznymi implementáciami ističov. Je to zásuvná architektúra. Môžeme teda kódovať proti poskytnutej abstrakcii / rozhraniu a na základe našich potrieb prejsť na inú implementáciu.

Pre naše príklady zameriame sa iba na implementáciu Resilience4J. Tieto techniky však možno použiť pre iné doplnky.

3. Automatická konfigurácia

Aby sme v našej aplikácii mohli použiť konkrétnu implementáciu ističa, musíme pridať vhodný štartér Spring. V našom prípade použijeme spring-cloud-starter-circuitbreaker-resilience4j:

 org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j 1.0.2.RELEASE 

Mechanizmus automatickej konfigurácie konfiguruje potrebné fazule ističa ak vidí jedného zo štartérov v triede.

Ak by sme chceli deaktivovať automatickú konfiguráciu Resilience4J, mohli by sme nastaviť spring.cloud.circuitbreaker.resilience4j.enabled majetok do nepravdivé.

4. Jednoduchý príklad ističa

Poďme si vytvoriť webovú aplikáciu pomocou Spring Boot, ktorá nám umožní preskúmať, ako funguje knižnica Spring Cloud Circuit Breaker.

Vytvoríme jednoduchú webovú službu, ktorá vráti zoznam albumov. Predpokladajme, že prvotný zoznam poskytuje služba tretej strany. Pre zjednodušenie použijeme na načítanie zoznamu externé fiktívne API poskytované spoločnosťou Jsonplaceholder:

//jsonplaceholder.typicode.com/albums

4.1. Vytvorte istič

Vytvorme náš prvý istič. Začneme vložením inštancie súboru CircuitBreakerFactory fazuľa:

@Service verejná trieda AlbumService {@Autowired private CircuitBreakerFactory circuitBreakerFactory; // ...}

Teraz môžeme ľahko vytvoriť istič pomocou CircuitBreakerFactory # vytvoriť metóda. Identifikátor ističa sa berie ako argument:

CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("istič");

4.2. Zabalte úlohu do ističa

Aby sme mohli zabaliť a spustiť úlohu chránenú ističom, musíme zavolať run metóda, ktorá vyžaduje a Dodávateľ ako argument.

public String getAlbumList () {CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("circuitbreaker"); Reťazec url = "//jsonplaceholder.typicode.com/albums"; návrat circuitBreaker.run (() -> restTemplate.getForObject (url, String.class)); }

Istič používa našu metódu za nás a poskytuje odolnosť proti chybám.

Niekedy môže naša externá služba trvať príliš dlho, kým odpovie, vyhodí neočakávanú výnimku alebo externá služba alebo hostiteľ neexistuje. V tom prípade, môžeme poskytnúť rezervu ako druhý argument k bežať metóda:

public String getAlbumList () {CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("circuitbreaker"); Reťazec url = "// localhost: 1234 / not-real"; návrat circuitBreaker.run (() -> restTemplate.getForObject (url, String.class), hoditeľný -> getDefaultAlbumList ()); }

Lambda na záchranu dostane Hoditeľné ako vstup popisujúci chybu. To znamená môžeme volajúcemu poskytnúť rôzne záložné výsledky na základe typu výnimky ktoré spustili núdzový postup.

V takom prípade nebudeme brať do úvahy výnimku. Vrátime iba zoznam albumov uložený v pamäti.

Ak externé volanie končí s výnimkou a nie je k dispozícii záložné riešenie, a NoFallbackAvailableException hodí jar.

4.3. Zostavte ovládač

Teraz dokončime náš príklad a vytvorme jednoduchý radič, ktorý volá metódy služby a prezentuje výsledky prostredníctvom prehľadávača:

@RestController verejná trieda Controller {@Autowired private Service service; @GetMapping ("/ albumy") public String albums () {return service.getAlbumList (); }}

Nakoniec zavoláme službu REST a pozrieme si výsledky:

[GET] // localhost: 8080 / albumy

5. Globálna vlastná konfigurácia

Predvolená konfigurácia zvyčajne nestačí. Z tohto dôvodu musíme na základe našich prípadov použitia vytvoriť ističe s vlastnými konfiguráciami.

Ak chcete prepísať predvolenú konfiguráciu, musíme zadať vlastné fazule a vlastnosti v a @ Konfigurácia trieda.

Tu budeme definovať globálnu konfiguráciu pre všetky ističe. Pre tento dôvod, musíme definovať a Prispôsobovač fazuľa. Použime teda Resilience4JCircuitBreakerFactory implementácia.

Najskôr definujeme konfiguračné triedy ističov a časových obmedzovačov podľa tutoriálu Resilience4j:

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom () .failureRateThreshold (50) .waitDurationInOpenState (Duration.ofMillis (1000)) .slidingWindowSize (2) .build (); TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom () .timeoutDuration (Duration.ofSeconds (4)) .build ();

Ďalej vložíme konfiguráciu do a Prispôsobovač fazuľa pomocou Resilience4JCircuitBreakerFactory.configureDefault metóda:

@Configuration verejná trieda Resilience4JConfiguration {@Bean public Customizer globalCustomConfiguration () {// objekty circuitBreakerConfig a timeLimiterConfig vrátia továreň -> factory.configureDefault (id -> nový Resilience4JConfigBuilder (id) .timeLimiterConfig (timeLimiterConfig) )); }}

6. Špecifická vlastná konfigurácia

Samozrejme, v našej aplikácii môžeme mať viac ističov. Preto v niektorých prípadoch potrebujeme pre každý istič špecifickú konfiguráciu.

Podobne môžeme definovať jeden alebo viac Prispôsobovač fazuľa. Potom môžeme poskytnúť inú konfiguráciu pomocou príkazu Resilience4JCircuitBreakerFactory.configure metóda:

@Bean public Customizer specificCustomConfiguration1 () {// objekty circuitBreakerConfig a timeLimiterConfig vrátia podnik factory -> factory.configure (builder -> builder.circuitBreakerConfig (circuitBreakerConfig) .timeLimiterConfig (timeLimiterConfig) .build) }

Tu uvádzame druhý parameter, id ističa, ktorý konfigurujeme.

Môžeme tiež nastaviť viac ističov s rovnakou konfiguráciou tým, že poskytneme zoznam ID ističov rovnakou metódou:

@Bean public Customizer specificCustomConfiguration2 () {// objekty circuitBreakerConfig a timeLimiterConfig vracajú factory -> factory.configure (builder -> builder.circuitBreakerConfig (circuitBreakerConfig) .timeLimiterConfig (timeLimiterConfig), "Circuit",) „circuitBreaker3“); }

7. Alternatívne implementácie

Už sme videli, ako používať Resilience4j implementácia na vytvorenie jedného alebo viacerých ističov s Spring Cloud Circuit Breaker.

Existujú však aj ďalšie implementácie podporované Spring Cloud Circuit Breaker, ktoré môžeme v našej aplikácii využiť:

  • Hystrix
  • Sentinel
  • Jarný pokus

Za zmienku stojí, že môžeme kombinovať rôzne implementácie ističov v našej aplikácii. Nie sme obmedzený iba na jednu knižnicu.

Vyššie uvedené knižnice majú viac funkcií, ako sme tu preskúmali. Spring Cloud Circuit Breaker je však abstrakciou iba nad časťou ističa. Napríklad Resilience4j poskytuje aj ďalšie moduly ako RateLimiter, Prepážka, Skúsiť znova navyše k Istič a TimeLimiter použité v tomto článku.

8. Záver

V tomto článku sme objavili projekt Spring Cloud Circuit Breaker.

Najprv sme sa dozvedeli, čo je Spring Cloud Circuit Breaker a ako nám umožňuje pridať do našej aplikácie ističe.

Ďalej sme využili mechanizmus automatickej konfigurácie Spring Boot, aby sme ukázali, ako definovať a integrovať ističe. Tiež sme demonštrovali, ako funguje Spring Cloud Circuit Breaker prostredníctvom jednoduchej služby REST.

Nakoniec sme sa naučili konfigurovať všetky ističe spoločne, aj jednotlivo.

Ako vždy, zdrojový kód tohto tutoriálu je k dispozícii na GitHub.