חיפוש
  • יניב אור

מערכת מבוססת microservices - חלק 0 - הקדמה

עודכן ב: אפר 2

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


היה לי ברור שבשלב מסוים ארצה לבנות את האתר מחדש, מאפס, עם מכונות משלי ושליטה מלאה - כמו שאני יודע ואוהב לעשות. מעבר לזה, יש לי רצון לקחת את המכשירים שבניתי, תכנתתי, קניתי וכו' - מדובר על MindWave, Polargraph, CBGB ושאר התוכנות והשירותים שכתבתי - וליצור ביניהם תקשורת.


לאחרונה הקמתי סביבה בסיסית מבוססת Docker. עם docker עבדתי בעבר, כך שהיה צורך רק בריענון קצר. תוך כדי התעסקות בנושא, יצא לי להכיר את ה-ecosystem התומך: Gitlab, CI-CD, Kubernetes וכן האלה.


אני חייב לציין שהיתה לי חוויה לא טובה עם Kubernetes בגוגל. הקמתי cluster ושיחקתי איתו קצת. שלושה ימים לאחר מכן נכנסתי למצב חשבון וחטפתי שוק. 170 ש"ח לבינתיים כשהצפי לסוף החודש, סביבות 1800 ש"ח. מיד כיביתי את המכונות וסגרתי את החשבון - לא מתאים כרגע. ברור שאם הייתי קורא על העלויות וכו' זה לא היה מפליא אותי. בכל מקרה, יש פה משהו לא תקין.


כרגע אני עובד עם Dockerfile ו-docker-compose. בהמשך אכנס יותר לעומק לסביבות התומכות שציינתי ואצור pipeline נוח לעבודה. מבחינת ענן, עשיתי מנוי של 5$ לחודש ב-Digital Ocean. מכונת אובונטו עם docker מותקן מראש. נוח לעבודה ומחירים מעולים.


התהליך עבודה כרגע הוא כזה. אני עובד בסביבה מקומית, על הלפטופ שלי, משתדל לא להריץ את התוכנות ישירות - למשל עם npm start - אלא רק ב-container. מה שאומר שאני מריץ את:

docker-compose up --build

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

אני, כמובן, משתמש ב-git. ה-repos נמצאים ב-Github ובהמשך אעבור ל-Gitlab שבנוסף לניהול ה-repos, עוזר לניהול תהליך ה-CI-CD.

בענן, במכונת אובונטו שמריצה את ה-docker, יש תיקיה לכל אחד מהפרויקטים - לפי ה-git repos. ברגע שאני מעלה גירסה, אני עושה pull בתיקיית הפרויקט הרלוונטי ומריץ מחדש את docker-compose.


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


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


בתכנון מערכת מונוליטית - שבה כל השירותים והרכיבים נכתבים כתוכנה אחת או שתיים (backend/frontend) - סביר להניח שהייתי מתחיל בתכנון ובניית שרת API והקמת בסיס נתונים. השרת API היה מנהל את שתי הישויות שהזכרתי ועוד רבות אחרות ובנוסף הייתי יוצר יחסים ביניהן - בשאילתות (join ב-SQL, למשל) ובקוד, בשרת שמעבד את הנתונים.


במערכת מבוססת מיקרו-שירותים, הישויות חיות לרוב במרחב פרטי יותר. יש דרכים רבות ומגוונות למימוש מערכת מסוג כזה. המערכת שלי, בכל אופן, בנויה בצורה כזאת שיש שרת API נפרד לכל ישות - בקונטיינר נפרד, שעובד מול בסיס נתונים mongo שנמצא בקונטיינר אחר. כרגע, בסיס נתונים אחד לכולן אבל התכנון הוא כזה שתהיה אפשרות להפריד בקלות ישויות לבסיסי נתונים נפרדים, אולי על שרתים אחרים או שירותי ענן. כמו שנראה בהמשך, אני מריץ container של mongo. זאת לא הדרך האידיאלית ל-production ורצוי בד"כ להשתמש בשירותי ענן קיימים, כמו למשל MongoDB Atlas ואחרים.


מבחינת ה-UI, הפרונטאנד - אפרט עליו בהרחבה בהמשך. כרגע, חשוב לדעת שאת הדפים המוכנים - שעברו build - ישרת שרת Nginx בקונטיינר נפרד משלו. אני אציין שבתחילת התהליך, נהגתי לבנות את הפרויקט (npm run build) מקומית ובאמצעות git לעשות deploy רק לתיקיית build, dist וכו' - ב- repo נפרד. בהמשך למדתי ליצור קונטיינר שבתוכו נעשה תהליך הבניה, כך שאין צורך לעשות את כל התהליך הזה. למעשה, כשעובדים נכון, אין צורך לעשות npm install מקומית בכלל וכל התהליך נעשה ב-docker.



יש פרט מאוד חשוב שלא נראה בשרטוט ועדיין לא דובר עליו. רישום וכניסה למערכת (Authentication) כמשתמשים מסוגים שונים (Roles) וביצוע פעולות במערכת לפי הרשאות (Authorization).


על כך בחלק הבא:

מערכת מבוססת microservices - חלק 1 - אימות משתמשים


© 2023 by DO IT YOURSELF. Proudly created with Wix.com