定义服务架构

服务架构是指服务的组成方式以及服务如何与系统中的其他组件通信。

创建服务软件包

服务软件包将可以一起部署的相关服务单元分组。服务软件包唯一必需的属性是名称。该名称与软件包名称一起构成服务软件包的完全限定名称。

服务软件包使用车辆服务接口定义语言 (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 发布主题的唯一标识符。它必须采用小写短划线形式。
  • 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 服务软件包进行远程过程调用以设置温度。

后续步骤

定义架构后,生成中间件代码