Ratpack Hystrixszel
1. Bemutatkozás
Korábban bemutattuk, hogyan lehet nagy teljesítményű és reaktív alkalmazást létrehozni a Ratpack segítségével.
Ebben a cikkben megvizsgáljuk, hogyan lehet integrálni a Netflix Hystrix-et egy Ratpack alkalmazással.
A Netflix Hystrix segíti az elosztott szolgáltatások közötti interakciók ellenőrzését azáltal, hogy elkülöníti a hozzáférési pontokat a lépcsőzetes hibák megállításához, és tartalék lehetőségeket kínál a hibatűrésre. Ez segíthet nekünk egy rugalmasabb alkalmazás felépítésében. A gyors áttekintést lásd a Hystrix bevezetésében.
Így fogjuk használni - a Hystrix ezen hasznos funkcióival tovább fogjuk fejleszteni a Ratpack alkalmazást.
2. Maven-függőség
A Hystrix és Ratpack együttes használatához szükségünk van a projektre a ratpack-hystrix függőségre pom.xml:
io.ratpack ratpack-hystrix 1.4.6
A ratpack-hystrix legújabb verziója itt található. A ratpack-hisztrix magában foglalja a ratpack-magot és a hisztrix-magot.
A Ratpack reaktív tulajdonságainak kiaknázásához szükségünk lesz a ratpack-rx-re is:
io.ratpack ratpack-rx 1.4.6
A ratpack-rx legújabb verziója itt található.
3. Szolgálás Hystrix paranccsal
A Hystrix használatakor az alapul szolgáló szolgáltatások általában be vannak csomagolva HystrixCommand vagy HystrixObservableCommand. A Hystrix támogatja a parancsok végrehajtását szinkron, aszinkron és reaktív módon. Ezek közül csak a reaktív nem blokkoló és hivatalosan ajánlott.
A következő példákban felépítünk néhány végpontot, amelyek lekérdeznek egy profilt a Github REST API-ból.
3.1. Reaktív parancs végrehajtása
Először hozzunk létre egy reaktív háttérszolgáltatást a Hystrix segítségével:
public class HystrixReactiveHttpCommand kiterjeszti a HystrixObservableCommand {// ... @Orride védett Megfigyelhető konstrukció () {return RxRatpack.observe (httpClient .get (uri, r -> r.headers (h -> h.add ("User-Agent", "Baeldung HttpClient"))) .map (res -> res.getBody (). GetText ())); } @Orride protected Observable resumeWithFallback () {return Observable.just ("az eugenp reaktív tartalékprofilja"); }}
Itt egy Ratpack reaktív HttpClient GET-kérelem készítésére szolgál. A HystrixReactiveHttpCommand reaktív kezelőként teljesíthet:
chain.get ("rx", ctx -> új HystrixReactiveHttpCommand (ctx.get (HttpClient.class), eugenGithubProfileUri, timeout) .toObservable () .subscribe (ctx :: render));
A végpont a következő teszttel ellenőrizhető:
@Test public void whenFetchReactive_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("rx"), tartalmazString ("www.baeldung.com")); }
3.2. Aszinkron parancs végrehajtása
Aszinkron végrehajtása HystrixCommand sorba állítja a parancsot a szálkészleten, és visszaadja a Jövő:
chain.get ("async", ctx -> ctx.render (új HystrixAsyncHttpCommand (eugenGithubProfileUri, timeout) .queue () .get ()));
A HystrixAsyncHttpCommand úgy néz ki, mint a:
public class HystrixAsyncHttpCommand kiterjeszti a HystrixCommand parancsot {// ... @Orride védett karakterláncfutás () dobja a (z) {return EntityUtils.toString (HttpClientBuilder.create () .setDefaultRequestConfig (requestConfig) "setDealDefaultHeaders (setHozzáférés) (setHozzáférés) (SetDefaultLeader) (setDealDefaultLeader) (setDefaultHeaders) (setDefaultHeaders) (setDefaultHeaders) "," Baeldung Blocking HttpClient "))) .build (). Végrehajt (új HttpGet (uri)). GetEntity ()); } @Orride védett karakterlánc getFallback () {return "az eugenp async tartalékprofilja"; }}
Itt blokkolást használunk HttpClient nem blokkoló helyett, mert azt akarjuk, hogy a Hystrix vezérelje a tényleges parancs végrehajtásának időkorlátját, hogy ne kelljen egyedül kezelnünk, amikor választ kapunk a Jövő. Ez lehetővé teszi a Hystrix számára, hogy tartalékolja vagy tárolja a kérésünket.
Az aszinkron végrehajtás a várt eredményt is megadja:
@Test public void whenFetchAsync_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("async"), tartalmazString ("www.baeldung.com")); }
3.3. Szinkron parancsfuttatás
A szinkron végrehajtás a parancsot közvetlenül az aktuális szálban hajtja végre:
chain.get ("sync", ctx -> ctx.render (új HystrixSyncHttpCommand (eugenGithubProfileUri, timeout) .execute ()));
A HystrixSyncHttpCommand szinte azonos a HystrixAsyncHttpCommand kivéve, hogy más esési eredményt adunk neki. Ha nem esik vissza, akkor ugyanúgy viselkedik, mint a reaktív és aszinkron végrehajtás:
@Test public void whenFetchSync_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("sync"), tartalmazString ("www.baeldung.com")); }
4. Metrika
A Guice modul regisztrálásával - HystrixModule a Ratpack nyilvántartásba streamelhetjük a kérelem hatókörébe tartozó mutatókat, és az a KAP végpont:
serverSpec.registry (Guice.registry (spec -> spec.module (új HystrixModule (). sse ()))) .handlers (c -> c.get ("hystrix", új HystrixMetricsEventStreamHandler ()));
A HystrixMetricsEventStreamHandler segíti a Hystrix-mutatók beáramlását szöveg / eseményfolyam formátumban, oly módon, hogy a metrikákat követni tudjuk Hystrix műszerfal.
Beállíthatunk egy önálló Hystrix műszerfalat, és hozzáadhatjuk a Hystrix eseményfolyamot a monitor listához, hogy lássuk, hogyan teljesít Ratpack alkalmazásunk:
A Ratpack alkalmazásunkhoz intézett több kérés után láthatjuk a Hystrix-szal kapcsolatos parancsokat az irányítópulton.
4.1. A motorháztető alatt
Ban ben HystrixModule, a Hystrix Concurrency stratégiát a HystrixPlugin segítségével regisztrálja a Hystrix a kérelemkörnyezet Ratpack nyilvántartással történő kezelésére. Ez feleslegessé teszi a Hystrix kérelmek kontextusának inicializálását az egyes kérelmek megkezdése előtt.
public class HystrixModule kiterjeszti a ConfigurableModule {// ... @Orride protected void configure () {try {HystrixPlugins.getInstance (). registerConcurrencyStrategy (new HystrixRegistryBackedConcurrencyStrategy ()); } catch (IllegalStateException e) {// ...}} // ...}
5. Következtetés
Ebben a rövid cikkben bemutattuk, hogyan lehet a Hystrixet integrálni a Ratpack-be, és hogyan lehet a Ratpack alkalmazásunk mutatóit a Hystrix Dashboardra tolni, hogy jobban lássa az alkalmazás teljesítményét.
Mint mindig, a teljes megvalósítás megtalálható a Github projektben.