定義服務架構

服務架構是指服務的組成方式,以及服務與系統中其他元件的通訊方式。

建立服務組合

服務套裝組合會將相關的服務單元分組,以便一起部署。服務套件唯一需要的屬性是名稱。這個名稱會與套件名稱一起構成服務套裝組合的完整名稱。

服務套件是使用車輛服務介面定義語言 (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 服務套件進行遠端程序呼叫,以設定溫度。

後續步驟

定義架構後,請產生中介軟體程式碼