Ú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.