מבוא לאוצרת אפאצ'י

1. הקדמה

אפאצ'י אוצר הוא לקוח ג'אווה של אפאצ'י זואיפר, שירות התיאום הפופולרי ליישומים מבוזרים.

במדריך זה נציג כמה מהתכונות הרלוונטיות ביותר המסופקות על ידי אוצר:

  • ניהול חיבורים - ניהול חיבורים ונסיונות מדיניות חוזרים
  • Async - שיפור לקוח קיים על ידי הוספת יכולות async ושימוש ב- Java 8 lambdas
  • ניהול תצורה - בעל תצורה מרכזית למערכת
  • מודלים מסוגים חזקים - עובדים עם מודלים שהוקלדו
  • מתכונים - ביצוע בחירות למנהיגים, מנעולים מבוזרים או דלפקים

2. תנאים מוקדמים

ראשית, מומלץ להעיף מבט מהיר על ה- Apache Zookeeper ותכונותיו.

להדרכה זו, אנו מניחים שכבר פועל מופע Zookeeper עצמאי 127.0.0.1:2181; להלן הוראות כיצד להתקין ולהפעיל אותו, אם אתה רק מתחיל לעבוד.

ראשית, נצטרך להוסיף את התלות של האוצר-x-async לשלנו pom.xml:

 org.apache.curator אוצר-x-async 4.0.1 org.apache.zookeeper zookeeper 

לגרסה האחרונה של Apache Curator 4.X.X יש תלות קשה ב- Zookeeper 3.5.X שנמצא עדיין בגרסת בטא כרגע.

וכך, במאמר זה, אנו נשתמש במקום זאת ב- Zookeeper 3.4.11 היציב האחרון.

אז עלינו לא לכלול את תלות ה- Zookeeper ולהוסיף את התלות עבור גרסת ה- Zookeeper שלנו pom.xml:

 org.apache.zookeeper גן החיות 3.4.11 

למידע נוסף על תאימות, אנא עיין בקישור זה.

3. ניהול חיבורים

מקרה השימוש הבסיסי של Apache Curator הוא התחברות למופע Apache Zookeeper פועל.

הכלי מספק מפעל לבניית חיבורים ל- Zookeeper באמצעות מדיניות ניסיון חוזר:

int sleepMsBetweenRetries = 100; int maxRetries = 3; RetryPolicy retryPolicy = RetryNTimes חדש (maxRetries, sleepMsBetweenRetries); לקוח CuratorFramework = CuratorFrameworkFactory .newClient ("127.0.0.1:2181", retryPolicy); client.start (); assertThat (client.checkExists (). forPath ("/")). isNotNull ();

בדוגמה מהירה זו, ננסה שוב 3 פעמים ונמתין 100 אלפיות בין ניסיון חוזר במקרה של בעיות קישוריות.

לאחר התחברות ל- Zookeeper באמצעות ה- אוצר מסגרת לקוח, אנו יכולים כעת לדפדף בנתיבים, לקבל / להגדיר נתונים ובעצם לתקשר עם השרת.

4. אסינכרון

מודול האוצר סינכרון אוצר את האמור לעיל אוצר מסגרת הלקוח לספק יכולות שאינן חוסמות באמצעות ה- API 8 של CompletionStage Java 8.

בואו נראה איך נראית הדוגמה הקודמת באמצעות עטיפת Async:

int sleepMsBetweenRetries = 100; int maxRetries = 3; RetryPolicy retryPolicy = RetryNTimes חדש (maxRetries, sleepMsBetweenRetries); לקוח CuratorFramework = CuratorFrameworkFactory .newClient ("127.0.0.1:2181", retryPolicy); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (לקוח); AtomicBoolean קיים = AtomicBoolean חדש (שקר); async.checkExists () .forPath ("/") .thenAcceptAsync (s -> exist.set (s! = null)); המתן (). עד (() -> assertThat (exist.get ()). isTrue ());

עכשיו ה checkExists () הפעולה פועלת במצב אסינכרוני, ולא חוסמת את השרשור הראשי. אנו יכולים גם לשרשר פעולות זו אחר זו באמצעות ה- thenAcceptAsync () במקום זאת, המשתמשת ב- API של CompletionStage.

5. ניהול תצורה

בסביבה מבוזרת, אחד האתגרים הנפוצים ביותר הוא ניהול תצורה משותפת בין יישומים רבים. אנו יכולים להשתמש ב- Zookeeper כחנות נתונים בה ניתן לשמור את התצורה שלנו.

בואו נראה דוגמה באמצעות אוצר אפאצ'י כדי להשיג ולהגדיר נתונים:

לקוח CuratorFramework = newClient (); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (לקוח); מפתח מחרוזת = getKey (); מחרוזת צפויה = "my_value"; client.create (). forPath (מפתח); async.setData (). forPath (מפתח, expect.getBytes ()); AtomicBoolean isEquals = חדש AtomicBoolean (); async.getData (). forPath (מפתח) .thenAccept (נתונים -> isEquals.set (מחרוזת חדשה (נתונים). שווה (צפוי))); המתן (). עד (() -> assertThat (isEquals.get ()). isTrue ());

בדוגמה זו, אנו יוצרים את נתיב הצומת, מגדירים את הנתונים ב- Zookeeper ואז משחזרים אותו ובודקים שהערך זהה. ה מַפְתֵחַ שדה יכול להיות נתיב צומת כמו / config / dev / my_key.

5.1. צופים

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

בואו נראה איך נראית הדוגמא לעיל בעת שימוש בצופים:

לקוח CuratorFramework = newClient () client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (לקוח); מפתח מחרוזת = getKey (); מחרוזת צפויה = "my_value"; async.create (). forPath (מפתח); שינויים ברשימה = ArrayList חדש (); async.watch () .getData (). forPath (מפתח). event () .thenAccept (watchEvent -> {נסה {changes.add (מחרוזת חדשה (client.getData (). forPath (watchEvent.getPath ()))) ;} לתפוס (חריג e) {// נכשל ...}}); // הגדר ערך נתונים עבור המפתח שלנו async.setData (). ForPath (מפתח, expect.getBytes ()); לחכות (). עד (() -> לטעון כי (שינויים. גודל ()). isEqualTo (1));

אנו מגדירים את הצופה, מגדירים את הנתונים ואז מאשרים שהאירוע שנצפה הופעל. אנו יכולים לצפות בצומת אחד או בקבוצת צמתים בבת אחת.

6. מודלים שהוקלדו חזק

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

כדי לעזור כאן, אוצר מוסיף את הרעיון של מודלים מודפסים אשר מאציל את הסידור / הסרת הערוץ ומאפשר לנו לעבוד ישירות עם הסוגים שלנו. בואו נראה איך זה עובד.

ראשית, אנו זקוקים למסגרת סדרתית. אוצר ממליץ להשתמש ביישום ג'קסון, אז בואו נוסיף את התלות בג'קסון pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.9.4 

עכשיו, בואו ננסה להתמיד בכיתה המותאמת אישית שלנו HostConfig:

מחלקה ציבורית HostConfig {שם מארח פרטי מחרוזת; נמל אינטר פרטי; // גטרים וקובעים}

עלינו לספק את מיפוי מפרט המודל מה- HostConfig בכיתה לנתיב, והשתמש בעטיפת המסגרת המודל המסופקת על ידי אוצרת אפאצ'י:

ModelSpec mySpec = ModelSpec.builder (ZPath.parseWithIds ("/ config / dev"), JacksonModelSerializer.build (HostConfig.class)) .build (); לקוח CuratorFramework = newClient (); client.start (); AsyncCuratorFramework async = AsyncCuratorFramework.wrap (לקוח); ModeledFramework modeledClient = ModeledFramework.wrap (async, mySpec); modeledClient.set (HostConfig חדש ("שם המארח", 8080)); modeledClient.read () .whenComplete ((value, e) -> {if (e! = null) {fail ("Can not read host config", e);} else {assertThat (value) .isNotNull (); assertThat ( value.getHostname ()). isEqualTo ("שם מארח"); assertThat (value.getPort ()). isEqualTo (8080);}});

ה מתי השלמה () שיטה בעת קריאת הנתיב / config / dev יחזיר את HostConfig למשל ב- Zookeeper.

7. מתכונים

Zookeeper מספק הנחיה זו ליישום פתרונות או מתכונים ברמה גבוהה כמו בחירת מנהיג, מנעולים מבוזרים או דלפקים משותפים.

אוצרת אפאצ'י מספקת יישום לרוב המתכונים הללו. כדי לראות את הרשימה המלאה, בקר בתיעוד מתכוני האוצרות.

כל המתכונים הללו זמינים במודול נפרד:

 org.apache.curator אוצרים-מתכונים 4.0.1 

בואו נקפוץ ישר פנימה ונתחיל להבין אותם בעזרת כמה דוגמאות פשוטות.

7.1. בחירת מנהיג

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

כך נראה השימוש במתכון הבחירות של מנהיג באוצר:

לקוח CuratorFramework = newClient (); client.start (); LeaderSelector leaderSelector = LeaderSelector חדש (לקוח, "/ mutex / select / leader / for / job / A", LeaderSelectorListener חדש () {@ ביטול מצב ריק בטל ציבורי Change (לקוח CuratorFramework, ConnectionState newState) {} @ ביטול ציבורי בטל ריק מבטל (לקוח CuratorFramework) ) זורק חריג {}}); // הצטרף למנהיג הקבוצה החברים Selector.start (); // המתן עד שעבודה A תעשה בקרב כל החברים leaderSelector.close ();

כשאנחנו מתחילים את בורר המנהיגים, הצומת שלנו מצטרף לקבוצת חברים בתוך הנתיב / mutex / select / leader / עבור / job / A. ברגע שהצומת שלנו הופך למנהיג, ה- לקחת מנהיגות השיטה תופעל, ואנחנו כמנהיגים יכולים לחדש את העבודה.

7.2. מנעולים משותפים

המתכון לנעילה משותפת עוסק בקיום נעילה המופצת במלואה:

לקוח CuratorFramework = newClient (); client.start (); InterProcessSemaphoreMutex sharedLock = InterProcessSemaphoreMutex חדש (לקוח, "/ mutex / process / A"); sharedLock.acquire (); // לעשות תהליך של sharedLock.release ();

כאשר אנו רוכשים את המנעול, Zookeeper מבטיח כי אין יישום אחר שרוכש את אותו מנעול בו זמנית.

7.3. מונים

המתכון Counters מרכז תיאום משותף מספר שלם בין כל הלקוחות:

לקוח CuratorFramework = newClient (); client.start (); מונה SharedCount = SharedCount חדש (לקוח, "/ counters / A", 0); counter.start (); counter.setCount (counter.getCount () + 1); assertThat (counter.getCount ()). isEqualTo (1);

בדוגמה זו, Zookeeper מאחסן את מספר שלם ערך בנתיב / דלפקים / א ומאתחל את הערך ל- 0 אם הדרך עדיין לא נוצרה.

8. מסקנה

במאמר זה, ראינו כיצד להשתמש באוצרת Apache כדי להתחבר ל- Apache Zookeeper ולנצל את התכונות העיקריות שלו.

הצגנו גם כמה מהמתכונים העיקריים באוצר.

כרגיל, ניתן למצוא מקורות באתר GitHub.


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