Kratki vodič za proljetni prekidač u oblaku

1. Pregled

U ovom vodiču, predstavit ćemo projekt Spring Cloud Circuit Breaker i naučiti kako to možemo iskoristiti.

Prvo ćemo vidjeti što nudi Spring Cloud Circuit Breaker pored postojećih implementacija prekidača. Dalje ćemo naučiti kako koristiti mehanizam za automatsko konfiguriranje Spring Boot za integriranje jednog ili više prekidača u našu aplikaciju.

Imajte na umu da smo dobili više informacija o tome što je prekidač i kako oni rade u Uvodu u Hystrix, Spring Cloud Netflix Hystrix i Vodiču za elastičnost4j.

2. Proljetni prekidač u oblaku

Donedavno nam je Spring Cloud pružao samo jedan način dodavanja prekidača u naše aplikacije. To je bilo korištenjem Netflix Hystrixa kao dijela projekta Spring Cloud Netflix.

Projekt Spring Cloud Netflix zapravo je samo knjižnica omota koja se temelji na napomenama oko Hystrixa. Stoga su ove dvije knjižnice usko povezane. To znači da se ne možemo prebaciti na drugu implementaciju prekidača bez promjene aplikacije.

Projekt Spring Cloud Circuit Breaker to rješava. Pruža sloj apstrakcije na različitim izvedbama prekidača. To je priključljiva arhitektura. Dakle, možemo kodirati ponuđenu apstrakciju / sučelje i prebaciti se na drugu implementaciju na temelju naših potreba.

Za naše primjere, usredotočit ćemo se samo na implementaciju Resilience4J. Međutim, ove se tehnike mogu koristiti za druge dodatke.

3. Automatska konfiguracija

Da bismo koristili određene izvedbe prekidača u našoj aplikaciji, moramo dodati odgovarajući opružni pokretač. U našem slučaju, poslužimo se opruga-oblak-starter-prekidač-elastičnost4j:

 org.springframework.cloud spring-cloud-starter-circuitbreaker-elastičnost4j 1.0.2.OSLOBODI 

Mehanizam automatske konfiguracije konfigurira potrebne grah prekidača ako ugleda nekoga od početnika na stazi.

Ako želimo onemogućiti automatsku konfiguraciju Resilience4J, mogli bismo postaviti proljeće.krov.prekidač sklopki.odpornost4j.omogućeno svojstvo da lažno.

4. Primjer jednostavnog prekidača

Stvorimo web aplikaciju pomoću Spring Boota kako bi nam omogućili da istražimo kako funkcionira Spring Cloud Circuit Breaker knjižnica.

Izgradit ćemo jednostavnu web uslugu koja vraća popis albuma. Pretpostavimo da sirovi popis pruža usluga treće strane. Radi jednostavnosti, za dohvaćanje popisa koristit ćemo vanjski lažni API koji nudi Jsonplaceholder:

//jsonplaceholder.typicode.com/albums

4.1. Stvorite prekidač

Stvorimo svoj prvi prekidač. Počet ćemo ubrizgavanjem instance CircuitBreakerFactory grah:

@Service javna klasa AlbumService {@Autowired private CircuitBreakerFactory circuitBreakerFactory; // ...}

Sada lako možemo stvoriti prekidač pomoću CircuitBreakerFactory # stvaranje metoda. Kao argument uzima identifikator prekidača:

CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("osigurač sklopke");

4.2. Zamotajte zadatak u prekidač

Da bismo umotali i pokrenuli zadatak zaštićen prekidačem, moramo nazvati run metoda koja traje a Dobavljač kao argument.

javni String getAlbumList () {CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("circuitbreaker"); URL adresa niza = "//jsonplaceholder.typicode.com/albums"; povratni krugBreaker.run (() -> restTemplate.getForObject (url, String.class)); }

Prekidač pokreće našu metodu umjesto nas i pruža toleranciju kvarova.

Ponekad bi našoj vanjskoj usluzi trebalo predugo da odgovori, izbaci neočekivanu iznimku ili vanjska usluga ili domaćin ne postoje. U tom slučaju, možemo pružiti zamjenski kao drugi argument trčanje metoda:

javni String getAlbumList () {CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("circuitbreaker"); URL adresa niza = "// localhost: 1234 / not-real"; povratni krugBreaker.run (() -> restTemplate.getForObject (url, String.class), bacanje -> getDefaultAlbumList ()); }

Lambda za rezervni sustav prima Bacljivo kao ulaz, opisujući pogrešku. To znači pozivatelju možemo pružiti različite rezervne rezultate, ovisno o vrsti iznimke koji je pokrenuo rezervni.

U ovom slučaju nećemo uzeti u obzir iznimku. Vratit ćemo samo predmemorirani popis albuma.

Ako se vanjski poziv završi iznimkom i nije osiguran zamjenski, a NoFallbackAvailableException baci Proljeće.

4.3. Izgradite kontroler

Završimo sada naš primjer i stvorimo jednostavan kontroler koji poziva metode usluge i prikazuje rezultate putem preglednika:

@RestController kontroler javne klase {@Autowired private service service; @GetMapping ("/ albums") javni nizovi albumi () {return service.getAlbumList (); }}

Na kraju, nazovimo REST službu i vidjet ćemo rezultate:

[GET] // localhost: 8080 / albumi

5. Globalna prilagođena konfiguracija

Obično zadana konfiguracija nije dovoljna. Iz tog razloga moramo stvoriti prekidače s prilagođenim konfiguracijama na temelju naših slučajeva korištenja.

Da bismo nadjačali zadanu konfiguraciju, moramo odrediti vlastite grah i svojstva u a @Konfiguracija razred.

Ovdje ćemo definirati globalnu konfiguraciju za sve prekidače. Zbog ovog razloga, moramo definirati a Prilagoditelj grah. Pa iskoristimo Otpornost4JCircuitBreakerFactory provedba.

Prvo ćemo definirati klase konfiguracije prekidača i vremenskog ograničenja prema vodiču Resilience4j:

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

Dalje, ugradimo konfiguraciju u Prilagoditelj grah pomoću Resilience4JCircuitBreakerFactory.configureDefault metoda:

@Configuration javna klasa Resilience4JConfiguration {@Bean public Customizer globalCustomConfiguration () {//. )); }}

6. Specifična prilagođena konfiguracija

Naravno, u našoj aplikaciji možemo imati više prekidača. Stoga nam je u nekim slučajevima potrebna posebna konfiguracija za svaki prekidač.

Slično tome, možemo definirati jednog ili više njih Prilagoditelj grah. Zatim, za svaki možemo pružiti različitu konfiguraciju pomoću Resilience4JCircuitBreakerFactory.configure metoda:

@Bean public Customizer specificCustomConfiguration1 () {// the circuitBreakerConfig and timeLimiterConfig objects return factory -> factory.configure (builder -> builder.circuitBreakerConfig (circuitBreakerConfig) .timeLimiterConfig ("LimiterConfig "). }

Ovdje pružamo drugi parametar, ID prekidača koji konfiguriramo.

Također možemo postaviti više prekidača s istom konfiguracijom davanjem popisa ID-ova prekidača za istu metodu:

@Bean public Customizer specificCustomConfiguration2 () {// the circuitBreakerConfig and timeLimiterConfig objects return factory -> factory.configure (builder -> builder.circuitBreakerConfig (circuitBreakerConfig) .timeLimiterConfig (timeLimiterConfig1 ",", ". "circuitBreaker3"); }

7. Alternativne provedbe

Vidjeli smo kako se koristi Otpornost4j implementacija za stvaranje jednog ili više prekidača s prekidačem Spring Cloud Circuit Breaker.

Međutim, postoje i druge implementacije koje podržava Spring Cloud Circuit Breaker koje možemo iskoristiti u našoj aplikaciji:

  • Hystrix
  • Sentinel
  • Proljetni pokušaj

Vrijedno je spomenuti da možemo kombinirati i prilagoditi različite izvedbe prekidača u našoj prijavi. Nismo ograničeni samo na jednu knjižnicu.

Gore navedene knjižnice imaju više mogućnosti nego što smo ovdje istraživali. Međutim, opružni prekidač Spring Cloud apstrakcija je samo na dijelu prekidača. Na primjer, Resilience4j nudi i druge module poput RateLimiter, Pregrada, Pokušaj ponovo uz to Osigurač i TimeLimiter moduli korišteni u ovom članku.

8. Zaključak

U ovom smo članku otkrili projekt Spring Cloud Circuit Breaker.

Prvo smo naučili što je Spring Cloud Circuit Breaker i kako nam omogućuje da dodamo prekidače u našu aplikaciju.

Dalje, iskoristili smo mehanizam za automatsko konfiguriranje Spring Boot kako bismo pokazali kako definirati i integrirati prekidače. Također smo demonstrirali kako Spring Cloud Circuit Breaker djeluje putem jednostavne REST usluge.

Konačno, naučili smo konfigurirati sve prekidače zajedno, kao i pojedinačno.

Kao i uvijek, izvorni kod za ovu lekciju dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found