Ratpack עם Hystrix

1. הקדמה

בעבר, הראינו כיצד לבנות יישום בעל ביצועים גבוהים ותגובתי עם Ratpack.

במאמר זה נבחן כיצד לשלב את Netflix Hystrix עם יישום Ratpack.

Netflix Hystrix מסייע בבקרת אינטראקציות בין שירותים מבוזרים על ידי בידוד נקודות גישה למניעת כשלים מדורגים ומספק אפשרויות נפילה לסובלנות תקלות. זה יכול לעזור לנו לבנות יישום גמיש יותר. ראה מבוא שלנו ל- Hystrix לבדיקה מהירה.

וכך, כך נשתמש בזה - אנו נשפר את יישום ה- Ratpack שלנו באמצעות תכונות שימושיות אלה של Hystrix.

2. תלות של Maven

כדי להשתמש ב- Hystrix עם Ratpack, אנו זקוקים לתלות ratpack-hystrix בפרויקט pom.xml:

 io.ratpack ratpack-hystrix 1.4.6 

הגרסה האחרונה של ratpack-hystrix נמצאת כאן. ה- ratpack-hystrix כולל core-core ו- hystrix-core.

כדי להשתמש בתכונות תגובתיות של Ratpack, נצטרך גם ratpack-rx:

 io.ratpack ratpack-rx 1.4.6 

הגרסה האחרונה של ratpack-rx נמצאת כאן.

3. הגשה עם פיקוד Hystrix

בעת שימוש ב- Hystrix, בדרך כלל השירותים הבסיסיים נעטפים HystrixCommand אוֹ HystrixObservableCommand. Hystrix תומכת בביצוע פקודות אלה בדרכים סינכרוניות, אסינכרוניות ותגובות. בין אלה, רק תגובתי אינו חסום ומומלץ רשמית.

בדוגמאות הבאות נבנה כמה נקודות קצה שמביאות פרופיל מ- Github REST API.

3.1. ביצוע פיקודי תגובתי

ראשית, בואו לבנות שירות backend תגובתי עם Hystrix:

מחלקה ציבורית HystrixReactiveHttpCommand מרחיב את HystrixObservableCommand {// ... @Override "Baeldung HttpClient"))) .map (res -> res.getBody (). GetText ())); } @Override מוגן ResumeWithFallback נצפה () {return Observable.just ("פרופיל החזרת תגובתי של eugenp"); }}

הנה רטפאק תגובתי HttpClient משמש לביצוע בקשת GET. ה HystrixReactiveHttpCommand יכול להופיע כמטפל בתגובה:

chain.get ("rx", ctx -> HystrixReactiveHttpCommand חדש (ctx.get (HttpClient.class), eugenGithubProfileUri, פסק זמן) .toObservable (). מנוי (ctx :: render));

ניתן לאמת את נקודת הקצה באמצעות הבדיקה הבאה:

@Test ציבור בטל כאשרFetchReactive_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("rx"), containString ("www.baeldung.com")); }

3.2. ביצוע פיקוד אסינכרוני

ביצוע אסינכרוני של HystrixCommand מעמיד בתור את הפקודה במאגר החוטים ומחזיר a עתיד:

chain.get ("async", ctx -> ctx.render (HystrixAsyncHttpCommand חדש (eugenGithubProfileUri, פסק זמן) .queue () .get ()));

ה HystrixAsyncHttpCommand נראה כמו:

מחלקה ציבורית HystrixAsyncHttpCommand מרחיב את HystrixCommand {// ... @Override מוגן מחרוזת () זורק Exception {return EntityUtils.toString (HttpClientBuilder.create () .setDefaultRequestConfig (requestConfig) .setDefaultHeaders (אוסף -בסיסי) הוא שרת. "," Baeldung Blocking HttpClient "))) .build (). Execute (HttpGet (uri) חדש). GetEntity ()); } @Override מוגן מחרוזת getFallback () {להחזיר "פרופיל נסיגה async של eugenp"; }}

כאן אנו משתמשים בחסימה HttpClient במקום פקודה שאינה חוסמת מכיוון שאנו רוצים שהיסטריקס תשלוט בתפוגה קצובה מהביצוע של הפקודה בפועל, כך שלא נצטרך לטפל בה בעצמנו כשמשיגים תגובה מה- עתיד. זה גם מאפשר ל- Hystrix להחזיר או לשמור במטמון את בקשתנו.

ביצוע האסינכרון מניב גם תוצאה צפויה:

@Test ציבורי בטל כאשר FetchAsync_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("async"), containString ("www.baeldung.com")); }

3.3. ביצוע פיקוד סינכרוני

ביצוע סינכרוני מבצע את הפקודה ישירות בשרשור הנוכחי:

chain.get ("sync", ctx -> ctx.render (HystrixSyncHttpCommand חדש (eugenGithubProfileUri, פסק זמן). execute ()));

ההטמעה של HystrixSyncHttpCommand כמעט זהה ל- HystrixAsyncHttpCommand אלא שאנחנו נותנים לו תוצאה של נפילה אחרת. כאשר לא נופל לאחור, הוא מתנהג בדיוק כמו ביצוע תגובתי ואסינכרוני:

@ מבחן ציבורי בטל כאשר FetchSync_thenGotEugenProfile () {assertThat (appUnderTest.getHttpClient (). GetText ("sync"), containString ("www.baeldung.com")); }

4. מדדים

על ידי רישום מודול Guice - HystrixModule לרישום Ratpack, אנו יכולים להזרים את מדדי היקף הבקשה ולחשוף את זרמי האירועים באמצעות a לקבל נקודת סיום:

serverSpec.registry (Guice.registry (spec -> spec.module (HystrixModule new (). sse ())))) מטפלים (c -> c.get ("hystrix", HystrixMetricsEventStreamHandler חדש)));

ה HystrixMetricsEventStreamHandler עוזר להזרים מדדי Hystrix פנימה טקסט / זרם אירועים פורמט, כך שנוכל לעקוב אחר המדדים ב לוח המחוונים של Hystrix.

אנו יכולים להקים לוח מחוונים עצמאי של Hystrix ולהוסיף את זרם האירועים של Hystrix לרשימת המוניטורים כדי לראות כיצד ביצועי היישום שלנו ב- Ratpack:

לאחר מספר בקשות ליישום Ratpack, אנו יכולים לראות את הפקודות הקשורות ל- Hystrix בלוח המחוונים.

4.1. מתחת למכסת המנוע

ב HystrixModule, אסטרטגיית Concurrency של Hystrix נרשמת ב- Hystrix באמצעות HystrixPlugin כדי לנהל את הקשר של הבקשה באמצעות הרישום Ratpack. זה מסיר את הצורך לאתחל את הקשר בקשת Hystrix לפני שכל בקשה מתחילה.

מחלקה ציבורית HystrixModule מרחיב את ConfigurableModule {// ... @Override מוגן void configure () {try {HystrixPlugins.getInstance (). registerConcurrencyStrategy (HystrixRegistryBackedConcurrencyStrategy () חדש; } לתפוס (IllegalStateException e) {// ...}} // ...}

5. מסקנה

במאמר מהיר זה, הראינו כיצד ניתן לשלב Hystrix ב- Ratpack וכיצד לדחוף את המדדים של יישום Ratpack שלנו אל לוח המחוונים של Hystrix כדי לראות טוב יותר את ביצועי היישום.

כמו תמיד, ניתן למצוא את היישום המלא בפרויקט Github.


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