Útmutató a Spring Cloud Netflixhez - Hystrix

1. Áttekintés

Ebben az oktatóanyagban a Spring Cloud Netflix Hystrix - a hibatűrő könyvtárat ismertetjük. Használni fogjuk a könyvtárat, és megvalósítjuk a Circuit Breaker vállalati mintát, amely leírja a meghibásodás elleni stratégiát az alkalmazások különböző szintjein.

Az elv analóg az elektronikával: a Hystrix figyeli a kapcsolódó szolgáltatásokhoz intézett hívások sikertelenségének módszereit. Ilyen hiba esetén az áramkör megnyílik, és a hívást egy tartalék módszerre továbbítja.

A könyvtár egy küszöbig elviseli a hibákat. Ezen túl nyitva hagyja az áramkört. Ami azt jelenti, hogy minden későbbi hívást továbbít a tartalék módszerre, a jövőbeli hibák elkerülése érdekében. Ez egy időpuffert hoz létre a kapcsolódó szolgáltatás számára, hogy helyreálljon hibás állapotából.

2. Pihenő Producer

A megszakító mintáját bemutató forgatókönyv létrehozásához először szolgáltatásra van szükségünk. Nevezzük „REST Producer” -nek, mivel a Hystrix-kompatibilis „REST Consumer” -ről nyújt adatokat, amelyet a következő lépésben hozunk létre.

Hozzunk létre egy új Maven projektet a tavasz-boot-starter-web függőség:

 org.springframework.boot spring-boot-starter-web 2.2.6.KÖZLEMÉNY 

Maga a projekt szándékosan egyszerű. Ez egy vezérlő interfészből áll @RequestMapping annotált GET módszer, amely egyszerűen a Húr, a @RestController ennek az interfésznek a megvalósítása és a @SpringBootApplication.

Kezdjük a kezelőfelülettel:

nyilvános felület GreetingController {@GetMapping ("/ greeting / {felhasználónév}") String üdvözlet (@PathVariable ("felhasználónév") String felhasználónév); }

És a megvalósítás:

@RestController public class GreetingControllerImpl implementálja a GreetingController {@Orride public String greeting (@PathVariable ("felhasználónév") String felhasználónév) {return String.format ("Hello% s! \ N", felhasználónév); }}

Ezután felírjuk a fő alkalmazásosztályt:

@SpringBootApplication public class RestProducerApplication {public static void main (String [] args) {SpringApplication.run (RestProducerApplication.class, args); }}

Ennek a szakasznak a teljesítéséhez csak annyit kell tennie, hogy konfiguráljon egy alkalmazás-portot, amelyen hallgatni fogunk. Az alapértelmezett 8080-as portot nem fogjuk használni, mert a portnak a következő lépésben leírt alkalmazás számára kell fenntartva maradnia.

Továbbá meghatározzuk az alkalmazás nevét, hogy a későbbiekben bemutatott ügyfélalkalmazásból megkereshessük a gyártónkat.

Ezután adjuk meg a portot 9090 és a neve pihenő-termelő miénkben alkalmazás.tulajdonságok fájl:

server.port = 9090 spring.application.name = rest-producer

Most tesztelhetjük gyártónkat a cURL használatával:

$> curl // localhost: 9090 / üdvözlet / Cid Hello Cid!

3. Pihenjen a Hystrixszal

Bemutató forgatókönyvünkhöz egy webalkalmazást valósítunk meg, amely az előző lépésből származó REST szolgáltatást használja fel a RestTemplate és Hystrix. Az egyszerűség kedvéért "REST Consumer" -nek hívjuk.

Következésképpen létrehozunk egy új Maven projektet a tavasz-felhő-kezdő-hisztrix, rugós-boot-starter-web és tavaszi-bakancs-indító-timeleaf mint függőségek:

 org.springframework.cloud spring-cloud-starter-hystrix 1.4.7.RELEASE org.springframework.boot spring-boot-starter-web 2.2.6.RELEASE org.springframework.boot spring-boot-starter-thymeleaf 2.2.6. KIADÁS 

A megszakító működése érdekében a Hystix beolvas @Összetevő vagy @Szolgáltatás jegyzetekkel ellátott osztályok @HystixCommand megjegyzéssel ellátott módszereket, valósítson meg egy proxyt hozzá, és figyelje a hívásait.

Létrehozunk egy @Szolgáltatás osztály az első, amelyet befecskendeznek a @Vezérlő. Mivel egy webalkalmazást építünk a Thymeleaf segítségével, HTML-sablonra is szükségünk van, amely megtekintésként szolgálhat.

Ez lesz az injekciónk @Szolgáltatás végrehajtása a @HystrixCommand társított tartalék módszerrel. Ennek a tartaléknak ugyanazt az aláírást kell használnia, mint az eredeti:

@Service public class GreetingService {@HystrixCommand (fallbackMethod = "defaultGreeting") public String getGreeting (String felhasználónév) {return new RestTemplate () .getForObject ("// localhost: 9090 / greeting / {felhasználónév}", String.class, felhasználónév ); } private String defaultGreeting (String felhasználónév) {return "Hello User!"; }}

RestConsumerApplication lesz a fő alkalmazási osztályunk. A @EnableCircuitBreaker az annotáció az osztályútvonalat keresi minden kompatibilis megszakító megvalósításra.

A Hystrix kifejezett használatához ezt az osztályt kell bejegyeznünk @EnableHystrix:

@SpringBootApplication @EnableCircuitBreaker public class RestConsumerApplication {public static void main (String [] args) {SpringApplication.run (RestConsumerApplication.class, args); }}

A mi vezérlőnk segítségével állítjuk be a vezérlőt GreetingService:

@Controller public class GreetingController {@Autowired private GreetingService greetingService; @GetMapping ("/ get-greeting / {felhasználónév}") public String getGreeting (modellmodell, @PathVariable ("felhasználónév") String felhasználónév) {model.addAttribute ("üdvözlet", greetingService.getGreeting (felhasználónév)); visszatér "üdvözlő nézet"; }}

És itt van a HTML sablon:

   Üdvözlet Hystrix-tól 

Annak biztosítására, hogy az alkalmazás egy meghatározott porton hallgasson, a következőket tesszük egy alkalmazás.tulajdonságok fájl:

szerver.port = 8080

Ahhoz, hogy a Hystix megszakító működésben legyen, elindítjuk a fogyasztóinkat, és a böngészőnkre mutatunk // localhost: 8080 / get-greeting / Cid. Normál körülmények között a következők jelennek meg:

Hello Cid!

A gyártó hibájának szimulálása érdekében egyszerűen leállítjuk, és miután befejeztük a böngésző frissítését, meg kell jelenítenünk egy általános üzenetet, amelyet a tartalék módszertől kaptunk vissza a @Szolgáltatás:

Helló felhasználó!

4. REST fogyasztó Hystrix-szal és Feign-nel

Most módosítani fogjuk az előző lépés projektjét, hogy a Spring Netflix Feign-t deklaratív REST kliensként használjuk a Spring helyett RestTemplate.

Előnye, hogy később könnyedén átalakíthatjuk a Feign Client felületünket, hogy a Spring Netflix Eurekát felhasználhassuk a szolgáltatás felfedezéséhez.

Az új projekt megkezdéséhez elkészítjük a fogyasztóink másolatát, és felvesszük a gyártónkat és tavasz-felhő-kezdő-színlelő mint függőségek:

 com.baeldung.spring.cloud spring-cloud-hystrix-rest-producer 1.0.0-SNAPSHOT org.springframework.cloud spring-cloud-starter-feign 1.1.5.KÖZLEMÉNY 

Most már használhatjuk a mi GreetingController egy Feign Client bővítésére. Meg fogjuk valósítani Hystrix tartalék, mint statikus belső osztály @Összetevő.

Alternatív megoldásként meghatározhatnánk a @Bab megjegyzéssel ellátott módszer, amely ennek a tartalék osztálynak egy példányát adja vissza.

A név tulajdonság @FeignClient kötelező. Arra használják, hogy az alkalmazást szolgáltatáskereséssel, Eureka kliensen keresztül vagy URL alapján keresse meg, ha ezt a tulajdonságot megadják:

@FeignClient (name = "rest-producer" url = "// localhost: 9090", fallback = GreetingClient.GreetingClientFallback.class) nyilvános felület A GreetingClient kiterjeszti a GreetingController {@Component public static class GreetingClientFallback implementates GreetingController (Strreetveron PathVariable ("felhasználónév") String felhasználónév) {return "Helló felhasználó!"; }}}

Ha többet szeretne megtudni a Spring Netflix Eureka szolgáltatás felfedezéséhez történő felhasználásáról, tekintse meg ezt a cikket.

Ban,-ben RestConsumerFeignApplication, egy további kommentárral bővítjük a Feign integrációt, valójában @EnableFeignClients, a fő alkalmazási osztályba:

@SpringBootApplication @EnableCircuitBreaker @EnableFeignClients public class RestConsumerFeignApplication {public static void main (String [] args) {SpringApplication.run (RestConsumerFeignApplication.class, args); }}

Módosítani fogjuk a vezérlőt, hogy a korábban injektált helyett automatikusan vezetékes Feign klienst használjon @Szolgáltatás, üdvözletünk letöltéséhez:

@Controller public class GreetingController {@Autowired private GreetingClient greetingClient; @GetMapping ("/ get-greeting / {felhasználónév}") public String getGreeting (modellmodell, @PathVariable ("felhasználónév") String felhasználónév) {model.addAttribute ("üdvözlet", greetingClient.greeting (felhasználónév)); visszatér "üdvözlő nézet"; }}

Hogy megkülönböztessük ezt a példát az előzőtől, megváltoztatjuk az alkalmazásfigyelő portot a alkalmazás.tulajdonságok:

szerver.port = 8082

Végül teszteljük ezt a Feign-kompatibilis fogyasztót, mint az előző szakaszban. A várt eredménynek azonosnak kell lennie.

5. Cache Fallback With Hystrix

Most hozzáadjuk a Hystrixet a Spring Cloud projektünkhöz. Ebben a felhőprojektben van egy minősítési szolgáltatásunk, amely beszél az adatbázissal és megkapja a könyvek értékelését.

Tegyük fel, hogy adatbázisunk igény szerinti erőforrás, válaszreakciójának késleltetése időben változó lehet, vagy időnként nem elérhető. Ezt a forgatókönyvet úgy kezeljük, hogy a Hystrix megszakító visszaáll az adatok gyorsítótárába.

5.1. Beállítás és konfigurálás

Adjuk hozzá a tavasz-felhő-kezdő-hisztrix minősítési modulunktól való függőség:

 org.springframework.cloud tavasz-felhő-indító-hisztrix 

Ha az értékeléseket beillesztik / frissítik / törlik az adatbázisban, akkor a Redis gyorsítótárban ugyanezt megismételjük a-val Adattár. Ha többet szeretne megtudni a Redisről, nézze meg ezt a cikket.

Frissítsük a RatingService hogy az adatbázis-lekérdezési módszereket egy Hystrix-parancsba csomagolja @HystrixCommand és konfigurálja egy tartalék lehetőséggel a Redis olvasására:

@HystrixCommand (commandKey = "ratingsByIdFromDB", fallbackMethod = "findCachedRatingById", ignoreExceptions = {RatingNotFoundException.class}) public Rating findRatingById (Long ratingId) {return Optional.ofNullable (ratingRepository.f () új RatingNotFoundException ("A minősítés nem található. ID:" + ratingId)); } public Rating findCachedRatingById (Long ratingId) {return cacheRepository.findCachedRatingById (ratingId); }

Ne feledje, hogy a tartalék módszernek ugyanazzal az aláírással kell rendelkeznie, mint egy becsomagolt módszer, és ugyanabban az osztályban kell lennie. Most, amikor a findRatingById egy adott küszöbértéknél többet nem sikerül vagy késik, Hystrix visszaesik findCachedRatingById.

Mivel a Hystrix képességeit átláthatóan adják be AOP tanácsokként, módosítanunk kell a tanácsok halmozási sorrendjét, arra az esetre, ha más tanácsokkal rendelkeznénk, például Spring tranzakciós tanácsaihoz. Itt módosítottuk a tavaszi tranzakciós AOP tanácsokat, hogy alacsonyabb prioritásúak legyenek, mint a Hystrix AOP tanácsok:

@EnableHystrix @EnableTransactionManagement (rendelés = Rendelt.LOWEST_PRECEDENCE, mód = AdviceMode.ASPECTJ) nyilvános osztály RatingServiceApplication {@Bean @Primary @Order (érték = Rendezett.HIGHEST_PRECEDENCE) public HystrixCommspAspect hystrixAspectAspect } // egyéb bab, konfigurációk}

Itt módosítottuk a Spring tranzakciós AOP tanácsát, hogy alacsonyabb prioritású legyen, mint a Hystrix AOP tanácsok.

5.2. Hystrix Fallback tesztelése

Most, hogy konfiguráltuk az áramkört, tesztelhetjük azzal, hogy hozzuk le a H2 adatbázist, amellyel a tárház interakcióba lép. De először futtassuk a H2 példányt külső folyamatként, ahelyett, hogy beágyazott adatbázisként futtatnánk.

Másoljuk át a H2 könyvtárat (h2-1.4.193.jar) egy ismert könyvtárba, és indítsa el a H2 szervert:

> java -cp h2-1.4.193.jar org.h2.tools.Server -tcp TCP szerver fut a tcp: //192.168.99.1: 9092 (csak helyi kapcsolatok)

Frissítsük most modulunk adatforrásának URL-jét minősítés-szolgáltatás.tulajdonságok hogy rámutasson erre a H2 szerverre:

spring.datasource.url = jdbc: h2: tcp: // localhost / ~ / ratings

Elindíthatjuk szolgáltatásainkat a Spring Cloud sorozat előző cikkében megadottak szerint, és tesztelhetjük az egyes könyvek besorolását az általunk futtatott külső H2 példány lehúzásával.

Láthattuk, hogy amikor a H2 adatbázis nem érhető el, Hystrix automatikusan visszaesik Redishez, hogy elolvassa az egyes könyvek értékeléseit. Az ezt a felhasználási esetet bemutató forráskód itt található.

6. A hatókörök használata

Normális esetben a @HytrixCommand az annotált metódus szálkészlet-környezetben kerül végrehajtásra. De néha helyi szinten kell futnia, például a @SessionScope vagy a @RequestScope. Ezt úgy tehetjük meg, hogy argumentumokat adunk a parancs annotációjához:

@HystrixCommand (fallbackMethod = "getSomeDefault", commandProperties = {@HystrixProperty (név = "végrehajtás.izoláció.strategy", érték = "SEMAPHORE")})

7. A Hystrix műszerfal

A Hystrix jó opcionális tulajdonsága, hogy figyelemmel kíséri állapotát egy műszerfalon.

Engedélyezéséhez feltesszük tavasz-felhő-kezdő-hisztrix-műszerfal és rugós-csomagtartó-indító-működtető ban,-ben pom.xml fogyasztóink:

 org.springframework.cloud spring-cloud-starter-hystrix-dashboard 1.4.7.RELEASE org.springframework.boot spring-boot-starter-actuator 2.2.6.RELEASE 

Az előbbit engedélyezni kell az a jelölésekkel @ Konfiguráció val vel @EnableHystrixDashboard és ez utóbbi automatikusan engedélyezi a szükséges mutatókat webes alkalmazásunkon belül.

Miután befejeztük az alkalmazás újraindítását, a böngészőre mutatunk // localhost: 8080 / hisztrix, adja meg a Hystrix-adatfolyam mutató URL-jét, és kezdje el figyelemmel kísérni.

Végül valami ilyesmit kellene látnunk:

A Hystrix-adatfolyam figyelése valami rendben van, de ha több Hystrix-kompatibilis alkalmazást kell néznünk, az kellemetlenné válik. Erre a célra a Spring Cloud biztosítja a Turbine nevű eszközt, amely összesítheti a Hystrix műszerfalon megjelenítendő adatfolyamokat.

A turbina konfigurálása meghaladja ezen írás kereteit, de itt meg kell említeni a lehetőséget. Tehát az adatfolyamokat üzenetküldés útján is össze lehet gyűjteni a Turbine stream segítségével.

8. Következtetés

Amint eddig láthattuk, most már a tavaszi Netflix Hystrix használatával megvalósíthatjuk az áramkör-megszakító mintát bármelyik tavasszal együtt RestTemplate vagy tavaszi Netflix Feign.

Ez azt jelenti, hogy az alapértelmezett adatok felhasználásával képesek vagyunk szolgáltatásokat fogyasztani a mellékelt tartalékokkal, és figyelemmel kísérhetjük ezen adatok felhasználását.

Szokás szerint a GitHubon megtalálhatjuk a forrásokat.


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