服務架構是指服務的組成方式,以及服務與系統中其他元件的通訊方式。
建立服務組合
服務套裝組合會將相關的服務單元分組,以便一起部署。服務套件唯一需要的屬性是名稱。這個名稱會與套件名稱一起構成服務套裝組合的完整名稱。
服務套件是使用車輛服務介面定義語言 (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 專為動作和結果而設計。當呼叫端發起要求時,會使用 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發布主題的專屬 ID。必須採用小寫連字號格式。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出版主題的專屬 ID。必須與發布商的主題相符,且為小寫連字號格式。
定義 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 服務套件進行遠端程序呼叫,以設定溫度。
後續步驟
定義架構後,請產生中介軟體程式碼。