定義服務架構

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

建立服務組合

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

服務套件是使用車輛服務介面定義語言 (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 出版主題的專屬 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) 可讓函式呼叫不受位置限制。在這個模式中,管道會做為具名的會合點,供用戶端和供應商會合。架構會指定管道,而非特定服務執行個體,因此可將指令意圖與實作的實際位置分離。

在下列範例中,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 服務套件發出遠端程序呼叫,以控制車輛前座區域的溫度。

後續步驟

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