Ratpack s Hystrixom

1. Úvod

Predtým sme si ukázali, ako vytvoriť vysokovýkonnú a reaktívnu aplikáciu s Ratpackom.

V tomto článku sa pozrieme na to, ako integrovať Netflix Hystrix s aplikáciou Ratpack.

Netflix Hystrix pomáha riadiť interakcie medzi distribuovanými službami tým, že izoluje prístupové body, aby zastavil kaskádové zlyhania a poskytuje záložné možnosti pre odolnosť proti chybám. Môže nám pomôcť vytvoriť odolnejšiu aplikáciu. V krátkosti si prečítajte náš úvod do Hystrixu.

Takto to teda použijeme - vylepšíme našu aplikáciu Ratpack o tieto užitočné funkcie od spoločnosti Hystrix.

2. Závislosť od Maven

Aby sme mohli použiť Hystrix s Ratpack, potrebujeme v projekte závislosť ratpack-hystrix pom.xml:

 io.ratpack ratpack-hystrix 1.4.6 

Najnovšiu verziu ratpack-hystrix nájdete tu. Ratpack-hystrix obsahuje ratpack-core a hystrix-core.

Aby sme mohli využiť reaktívne vlastnosti Ratpacku, potrebovali by sme tiež ratpack-rx:

 io.ratpack ratpack-rx 1.4.6 

Najnovšiu verziu ratpack-rx nájdete tu.

3. Podávame s príkazom Hystrix

Pri použití systému Hystrix sú základné služby zvyčajne zabalené do HystrixCommand alebo HystrixObservableCommand. Hystrix podporuje vykonávanie týchto príkazov synchrónnym, asynchrónnym a reaktívnym spôsobom. Z nich iba reaktívne je neblokujúce a oficiálne sa odporúča.

V nasledujúcich príkladoch zostavíme niektoré koncové body, ktoré načítajú profil z GITHUB REST API.

3.1. Reaktívne vykonávanie príkazov

Najprv si vytvorme reaktívnu backendovú službu s Hystrix:

public class HystrixReactiveHttpCommand extends HystrixObservableCommand {// ... @Override protected Observable construct () {return RxRatpack.observe (httpClient .get (uri, r -> r.headers (h -> h.add ("User-Agent", "Baeldung HttpClient"))) .map (res -> res.getBody (). GetText ())); } @Override protected Observable resumeWithFallback () {return Observable.just ("reaktívny záložný profil eugenp"); }}

Tu Ratpack reaktívny HttpClient sa používa na zadanie požiadavky GET. The HystrixReactiveHttpCommand môže fungovať ako reaktívny manipulátor:

chain.get ("rx", ctx -> nový HystrixReactiveHttpCommand (ctx.get (HttpClient.class), eugenGithubProfileUri, časový limit) .toObservable () .subscribe (ctx :: render));

Koncový bod je možné overiť pomocou nasledujúceho testu:

@Test public void whenFetchReactive_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("rx"), containsString ("www.baeldung.com")); }

3.2. Asynchrónne vykonávanie príkazov

Asynchrónne vykonávanie HystrixCommand zaradí príkaz do fondu vlákien a vráti a Budúcnosť:

chain.get ("async", ctx -> ctx.render (nový HystrixAsyncHttpCommand (eugenGithubProfileUri, časový limit) .queue () .get ()));

The HystrixAsyncHttpCommand vyzerá ako:

verejná trieda HystrixAsyncHttpCommand rozširuje HystrixCommand {// ... @Override chránený reťazec run () vyvolá výnimku {return EntityUtils.toString (HttpClientBuilder.create () .setDefaultRequestConfig (requestConfig) .setDefaultHeadon (Collections.ext. "," Baeldung Blocking HttpClient "))) .build (). Execute (new HttpGet (uri)). GetEntity ()); } @Override chránený reťazec getFallback () {return "asynchrónny záložný profil eugenp"; }}

Tu používame blokovanie HttpClient namiesto neblokujúceho, pretože chceme, aby Hystrix riadil časový limit vykonania skutočného príkazu, aby sme ho pri odpovedi od príkazu nemuseli zvládnuť sami. Budúcnosť. To tiež umožňuje spoločnosti Hystrix záložné riešenie alebo uložiť našu požiadavku do pamäte cache.

Vykonanie asynchronizácie tiež prináša očakávaný výsledok:

@Test public void whenFetchAsync_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("async"), containsString ("www.baeldung.com")); }

3.3. Synchrónne vykonávanie príkazov

Synchrónne vykonanie vykoná príkaz priamo v aktuálnom vlákne:

chain.get ("sync", ctx -> ctx.render (nový HystrixSyncHttpCommand (eugenGithubProfileUri, časový limit) .execute ()));

Vykonávanie HystrixSyncHttpCommand je takmer totožný s HystrixAsyncHttpCommand až na to, že mu dáme iný záložný výsledok. Ak neklesne späť, chová sa rovnako ako reaktívne a asynchrónne vykonávanie:

@Test public void whenFetchSync_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("sync"), containsString ("www.baeldung.com")); }

4. Metriky

Registráciou modulu Guice - HystrixModule do registra Ratpack, môžeme streamovať metriky s rozsahom požiadaviek a vystavovať prúdy udalostí cez a ZÍSKAJTE koncový bod:

serverSpec.registry (Guice.registry (spec -> spec.module (new HystrixModule (). sse ()))) .handlers (c -> c.get ("hystrix", new HystrixMetricsEventStreamHandler ()));

The HystrixMetricsEventStreamHandler pomáha streamovať metriky Hystrixu do text / stream udalostí formáte, aby sme mohli sledovať metriky v Hystrix Dashboard.

Môžeme nastaviť samostatný riadiaci panel Hystrix a pridať náš prúd udalostí Hystrix do zoznamu monitorov, aby sme zistili, ako funguje naša aplikácia Ratpack:

Po niekoľkých požiadavkách na našu aplikáciu Ratpack môžeme na prístrojovej doske vidieť príkazy súvisiace s Hystrixom.

4.1. Pod kapotou

V HystrixModule„Hystrix Concurrency Strategy is registered with Hystrix via HystrixPlugin to manage the request context with Ratpack registry. To eliminuje potrebu inicializácie kontextu požiadaviek Hystrix pred začiatkom každej žiadosti.

verejná trieda HystrixModule rozširuje ConfigurableModule {// ... @Override protected void configure () {try {HystrixPlugins.getInstance (). registerConcurrencyStrategy (new HystrixRegistryBackedConcurrencyStrategy ()); } catch (IllegalStateException e) {// ...}} // ...}

5. Záver

V tomto rýchlom článku sme si ukázali, ako možno Hystrix integrovať do Ratpacku a ako poslať metriky našej aplikácie Ratpack do Hystrix Dashboard, aby ste získali lepší prehľad o výkone aplikácie.

Úplnú implementáciu nájdete ako vždy v projekte Github.


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