ארכיטקטורת שירות מתייחסת לאופן שבו השירותים מורכבים ולאופן שבו הם מתקשרים עם רכיבים אחרים במערכת.
יצירת חבילות שירות
חבילות שירותים מקבצות יחידות שירות קשורות שאפשר לפרוס יחד. המאפיין היחיד שנדרש לחבילת שירותים הוא שם. יחד עם שם החבילה, השם יוצר את השם המוגדר במלואו של חבילת השירות.
חבילות שירות מוגדרות באמצעות קבצים של שפת הגדרת ממשקי שירותים לרכב (VSIDL) (קבצים עם הסיומת .vsidl).
בדוגמה הבאה מוצגים שני חבילות שירותים: חבילת שירותים של TirePressureMonitoring וחבילת שירותים של BodyControl:
package: "com.android.sdv.sample.vsidl"
service_bundle {
name: "TirePressureMonitoring"
}
service_bundle {
name: "BodyControl"
}
כאשר:
-
service_bundleהוא המזהה של המבנה כחבילת שירותים. -
nameהוא שם חבילת השירות.
דפוסי העברת הודעות: Pub/Sub ו-RPC
מסגרת ה-SDV משתמשת בשני דפוסי העברת הודעות עיקריים: פרסום-הרשמה (Pub/Sub) וקריאה לפרוצדורה מרוחקת (RPC).
ב-Pub/Sub, המערכת מגיבה למצב המתפתח של הרכב על ידי סטרימינג של נתונים לכל הרכיבים הרלוונטיים. הנתונים מאורגנים לפי נושאים. בעלי תוכן דיגיטלי שולחים הודעות בנושאים. המוציא לאור שולח הודעות בנושאים בלי לדעת אילו מנויים (או כמה מנויים) מאזינים. המנויים מקבלים הודעות בנושאים בלי לדעת אילו מפרסמים בדיוק שלחו את ההודעות.
לעומת זאת, RPC נועד לפעולה ולתוצאה. היא משמשת כשהמתקשר יוזם בקשה כי חשוב לו לקבל את התוצאה הספציפית או אישור על הפעולה. מבצע הקריאה מפעיל שיטה ספציפית בערוץ.
הדפוסים האלה מיועדים לצרכים תפעוליים שונים, אבל יש להם מאפיין מבני משותף: שניהם מסתמכים על נתיבי תקשורת עם שמות – נושאים ב-Pub/Sub וערוצים ב-RPC – כדי להפריד בין הזהות של השולח לבין הזהות של המקבל.
הצהרה על אפליקציה לשליחת הודעות ואפליקציה רשומה
מודל פרסום והרשמה הוא דפוס העברת הודעות שבו שולחי ההודעות, שנקראים מפרסמים, לא שולחים את ההודעות ישירות לנמענים ספציפיים, שנקראים נרשמים. במקום זאת, בעלי התוכן הדיגיטלי מסווגים את ההודעות לנושאים, והמנויים נרשמים לנושא תקשורת אחד או יותר ומקבלים רק הודעות שפורסמו בנושאים האלה. מידע נוסף על פרסום והרשמה למינוי זמין במאמר בנושא דפוס פרסום והרשמה למינוי.
הוספת מוציא לאור לחבילת שירותים
בדוגמה הבאה מוצג מפרסם שנוסף לחבילת השירות TirePressureMonitoring:
package: "com.android.sdv.sample.vsidl"
service_bundle {
name: "TirePressureMonitoring"
publisher {
message: "TirePressure"
topic: "front-left"
capacity: 10
}
}
service_bundle {
name: "BodyControl"
...
}
כאשר:
- הודעות שירות
publisherמפרסמות הודעות בתור הודעות. messageמבנה הנתונים או סוג ההודעה שמוגדרים ב-protobuf (קובץ עם הסיומת.protobuf).topicמזהה ייחודי של נושא הפרסום. הוא חייב להיות באותיות קטנות עם מקפים.capacityמספר ההודעות שאפשר להכניס לתור של הפרסום. הערך חייב להיות מספר זוגי שגדול מ-2 או שווה לו.
הוספת חבילת מינוי לשירות
בדוגמה הבאה מוצג תוכן שנוסף לחבילת הערוצים של שירות BodyControl:
package: "com.android.sdv.sample.vsidl"
service_bundle {
name: "TirePressureMonitoring"
publisher {
message: "TirePressure"
topic: "front-left"
capacity: 10
}
}
service_bundle {
name: "BodyControl"
subscriber {
message: "com.android.sdv.sample.vsidl.TirePressure"
topic: "front-left"
}
}
כאשר:
- חבילת השירותים נרשמת לנושאים.
subscriber messageמבנה הנתונים או סוג ההודעה שמוגדרים ב-protobuf (קובץ עם הסיומת.protobuf).topicמזהה ייחודי של נושא הפרסום. היא צריכה להתאים לנושא של בעל התוכן הדיגיטלי ולהיות באותיות קטנות עם מקפים.
הגדרת לקוחות ושרתים של RPC
קריאה לפרוצדורה מרוחקת (RPC) מספקת עצמאות מיקום של קריאות לפונקציות. בתבנית הזו, הערוץ משמש כנקודת מפגש עם שם שבה הלקוח והספק נפגשים. על ידי טירגוט הערוץ ולא מופע ספציפי של שירות, המסגרת מפרידה בין הכוונה של הפקודה לבין המיקום הפיזי של ההטמעה.
בדוגמה הבאה, חבילת השירות ClimateControl מוגדרת כשרת וחבילת השירות BodyControl מוגדרת כלקוח:
package: "com.sdv.cc"
service_bundle {
name: "ClimateControl"
server {
service: "SetTemperature"
channel: "climate-control"
}
}
service_bundle {
name: "BodyControl"
client {
service: "SetTemperature"
channel: "climate-control"
}
}
כאשר:
-
serverמציין שחבילת השירות היא שרת שמספק שירות RPC מסוים (מזוהה על ידיserviceכ-SetTemperature). -
clientמציין שחבילת השירות היא לקוח שמפעיל את השירותSetTemperature. -
channelהוא השם של ערוץ ה-RPC. הוא צריך להיות באותיות קטנות עם מקפים, וייחודי לכל שירות.
בדוגמה הזו, חבילת השירותים BodyControl מקבלת הרשאה לבצע קריאות לפרוצדורות מרוחקות בחבילת השירותים ClimateControl כדי להגדיר את הטמפרטורה.
המאמרים הבאים
אחרי שמגדירים את הארכיטקטורה, יוצרים קוד של תוכנת ביניים.