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.


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