Hurtig guide til Spring Cloud Circuit Breaker

1. Oversigt

I denne vejledning Vi introducerer Spring Cloud Circuit Breaker-projektet og lær hvordan vi kan gøre brug af det.

Først skal vi se, hvad Spring Cloud Circuit Breaker tilbyder ud over eksisterende strømafbryderimplementeringer. Derefter lærer vi, hvordan vi bruger den automatiske konfigurationsmekanisme til Spring Boot til at integrere en eller flere afbrydere i vores applikation.

Bemærk, at vi har flere oplysninger om, hvad en afbryder er, og hvordan de fungerer i Introduktion til Hystrix, Spring Cloud Netflix Hystrix og Guide til Resilience4j.

2. Spring Cloud-afbryder

Indtil for nylig gav Spring Cloud os kun en måde at tilføje afbrydere i vores applikationer. Dette var gennem brugen af ​​Netflix Hystrix som en del af Spring Cloud Netflix-projektet.

Spring Cloud Netflix-projektet er egentlig bare et annotationsbaseret indpakningsbibliotek omkring Hystrix. Derfor er disse to biblioteker tæt koblet. Dette betyder, at vi ikke kan skifte til en anden implementering af afbryder uden at ændre applikationen.

Spring Cloud Circuit Breaker-projektet løser dette. Det giver et abstraktionslag på tværs af forskellige afbryderimplementeringer. Det er en stikbar arkitektur. Så vi kan kode mod den medfølgende abstraktion / interface og skifte til en anden implementering baseret på vores behov.

For vores eksempler vi fokuserer kun på implementeringen af ​​Resilience4J. Disse teknikker kan dog bruges til andre plugins.

3. Automatisk konfiguration

For at kunne bruge en bestemt afbryderimplementering i vores applikation er vi nødt til at tilføje den relevante Spring starter. I vores tilfælde, lad os bruge spring-cloud-starter-circuitbreaker-resilience4j:

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

Den automatiske konfigurationsmekanisme konfigurerer de nødvendige afbryderbønner hvis det ser en af ​​starterne i klassestien.

Hvis vi ville deaktivere Resilience4J-autokonfigurationen, kunne vi indstille spring.cloud.circuitbreaker.resilience4j.enabled ejendom til falsk.

4. Et simpelt afbrydereksempel

Lad os oprette en webapplikation ved hjælp af Spring Boot, så vi kan undersøge, hvordan Spring Cloud Circuit Breaker-biblioteket fungerer.

Vi bygger en simpel webservice, der returnerer en liste over album. Lad os antage, at rå listen leveres af en tredjepartstjeneste. For enkelheds skyld bruger vi en ekstern dummy API leveret af Jsonplaceholder til at hente listen:

//jsonplaceholder.typicode.com/albums

4.1. Opret en afbryder

Lad os oprette vores første afbryder. Vi starter med at indsprøjte en forekomst af CircuitBreakerFactory bønne:

@Service offentlig klasse AlbumService {@Autowired private CircuitBreakerFactory circuitBreakerFactory; // ...}

Nu kan vi nemt oprette en afbryder ved hjælp af CircuitBreakerFactory # Opret metode. Det tager afbryderidentifikatoren som et argument:

CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("kredsløbsbryder");

4.2. Pak en opgave i en afbryder

For at pakke og køre en opgave, der er beskyttet af afbryderen, skal vi ringe til run metode, der tager en Leverandør som et argument.

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

Afbryderen kører vores metode for os og giver fejltolerance.

Nogle gange kan vores eksterne service tage for lang tid at svare, kaste en uventet undtagelse, ellers eksisterer den eksterne tjeneste eller vært ikke. I det tilfælde, vi kan give et tilbagefald som et andet argument til løb metode:

public String getAlbumList () {CircuitBreaker circuitBreaker = circuitBreakerFactory.create ("circuitbreaker"); String url = "// localhost: 1234 / not-real"; return circuitBreaker.run (() -> restTemplate.getForObject (url, String.class), kastbar -> getDefaultAlbumList ()); }

Lambda til tilbagebetaling modtager Kan kastes som input, der beskriver fejlen. Det betyder Vi kan give forskellige tilbagevendende resultater til den, der ringer op, baseret på typen af ​​undtagelse der udløste reserven.

I dette tilfælde tager vi ikke hensyn til undtagelsen. Vi returnerer bare en cache-liste over album.

Hvis det eksterne opkald slutter med en undtagelse, og der ikke gives tilbageførsel, skal a NoFallbackAvailableException kastes af Spring.

4.3. Byg en controller

Lad os nu afslutte vores eksempel og oprette en simpel controller, der kalder servicemetoderne og præsenterer resultaterne gennem en browser:

@RestController offentlig klasse controller {@Autowired privat servicetjeneste; @GetMapping ("/ albums") offentlige strengealbum () {return service.getAlbumList (); }}

Lad os endelig ringe til REST-tjenesten og se resultaterne:

[GET] // localhost: 8080 / albums

5. Global brugerdefineret konfiguration

Normalt er standardkonfigurationen ikke nok. Af denne grund er vi nødt til at oprette afbrydere med brugerdefinerede konfigurationer baseret på vores brugssager.

For at tilsidesætte standardkonfigurationen skal vi angive vores egne bønner og egenskaber i en @Konfiguration klasse.

Her skal vi definere en global konfiguration for alle afbrydere. Af denne grund, vi er nødt til at definere en Tilpasning bønne. Så lad os bruge Resilience4JCircuitBreakerFactory implementering.

Først definerer vi konfigurationsklasser for afbryder og tidsbegrænsning i henhold til Resilience4j-selvstudiet:

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

Lad os derefter integrere konfigurationen i en Tilpasning bønne ved hjælp af Resilience4JCircuitBreakerFactory.configureDefault metode:

@Configuration public class Resilience4JConfiguration {@Bean public Customizer globalCustomConfiguration () {// the CircuitBreakerConfig and timeLimiterConfig objects returnere fabrik -> factory.configureDefault (id -> ny Resilience4JConfigBuilder (id) .timeLimiterConfigConfig (konfiguration) (time). )); }}

6. Specifik brugerdefineret konfiguration

Selvfølgelig, vi kan have flere afbrydere i vores applikation. Derfor har vi i nogle tilfælde brug for en specifik konfiguration for hver afbryder.

På samme måde kan vi definere en eller flere Tilpasning bønner. Derefter kan vi tilbyde en anden konfiguration for hver enkelt ved hjælp af Resilience4JCircuitBreakerFactory.configure metode:

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

Her giver vi en anden parameter, id for den afbryder, vi konfigurerer.

Vi kan også oprette flere afbrydere med samme konfiguration ved at give en liste over afbryder-id'er til samme metode:

@Bean public Customizer specificCustomConfiguration2 () {// circuitBreakerConfig og timeLimiterConfig objekter returnerer fabrik -> factory.configure (builder -> builder.circuitBreakerConfig (circuitBreakerConfig) .timeLimiterConfig (timeLimiterConfig, "circuitBreaker)" "circuitBreaker3"); }

7. Alternative implementeringer

Vi har set, hvordan man bruger Modstandsdygtighed4j implementering for at oprette en eller flere afbrydere med Spring Cloud Circuit Breaker.

Der er dog andre implementeringer understøttet af Spring Cloud Circuit Breaker, som vi kan udnytte i vores applikation:

  • Hystrix
  • vagtpost
  • Spring igen

Det er værd at nævne, at vi kan blande og matche forskellige implementeringer af afbryder i vores ansøgning. Vi er ikke kun begrænset til et bibliotek.

Ovenstående biblioteker har flere muligheder, end vi har udforsket her. Spring Cloud Circuit Breaker er dog en abstraktion over kun afbryderdelen. For eksempel leverer Resilience4j også andre moduler som f.eks RateLimiter, Skot, Prøve igen ud over Afbryder og TimeLimiter moduler, der bruges i denne artikel.

8. Konklusion

I denne artikel opdagede vi Spring Cloud Circuit Breaker-projektet.

Først lærte vi, hvad Spring Cloud Circuit Breaker er, og hvordan det giver os mulighed for at tilføje afbrydere til vores applikation.

Dernæst udnyttede vi den automatiske konfigurationsmekanisme for Spring Boot for at vise, hvordan man definerer og integrerer afbrydere. Vi demonstrerede også, hvordan Spring Cloud Circuit Breaker fungerer gennem en simpel REST-service.

Endelig lærte vi at konfigurere alle afbrydere sammen såvel som individuelt.

Som altid er kildekoden til denne tutorial tilgængelig på GitHub.


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