معماری سرویس به نحوهی ترکیب سرویسها و نحوهی ارتباط آنها با سایر اجزای سیستم اشاره دارد.
ایجاد بستههای خدماتی
بستههای سرویس، واحدهای سرویس مرتبط را که میتوانند با هم مستقر شوند، گروهبندی میکنند. تنها ویژگی مورد نیاز برای یک بسته سرویس، نام است. این نام به همراه نام بسته، نام کامل بسته سرویس را تشکیل میدهد.
بستههای خدماتی با فایلهای زبان تعریف رابط خدمات خودرو (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تعداد پیامهایی که صف انتشار میتواند در خود نگه دارد. این عدد باید زوج و بزرگتر یا مساوی ۲ باشد.
افزودن اشتراک به بسته خدماتی
مثالهای زیر یک ناشر اضافه شده به بسته سرویس 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) استقلال مکانی فراخوانیهای تابع را فراهم میکند. در این الگو، کانال به عنوان نقطه ملاقات نامگذاری شده عمل میکند که در آن کلاینت و ارائه دهنده با هم ملاقات میکنند. با هدف قرار دادن کانال به جای یک نمونه سرویس خاص، این چارچوب، هدف دستور را از مکان فیزیکی پیادهسازی جدا میکند.
مثال زیر شامل بسته سرویس CabinComfort است که میزبان یک سرور ClimateControl است و بسته سرویس BodyControl برای میزبانی یک کلاینت ClimateControl توسعه داده شده است:
package: "com.sdv.cc"
service_bundle {
name: "CabinComfort"
server {
service: "ClimateControl"
channel: "front-climate-control"
}
}
service_bundle {
name: "BodyControl"
client {
service: "ClimateControl"
channel: "front-climate-control"
}
subscriber {
message: "com.android.sdv.sample.vsidl.TirePressure"
topic: "front-left"
}
}
کجا:
-
serverنشان میدهد که بسته سرویس شامل سروری است که نوعی سرویس RPC ارائه میدهد (که توسطserviceبا عنوانClimateControlشناسایی میشود). -
clientنشان میدهد که بسته سرویس شامل کلاینتی است که سرویسClimateControlرا فراخوانی میکند. -
channelنام کانال RPC است. باید با حروف کوچک و خط تیره نوشته شود و برای هر سرویس منحصر به فرد باشد.
این مثال به بسته سرویس BodyControl اجازه میدهد تا از راه دور با بسته سرویس CabinComfort تماس برقرار کند تا دمای قسمت جلوی کابین را کنترل کند.
قدم بعدی چیست؟
پس از تعریف معماری خود، کد میانافزار را تولید کنید .