Xác định cấu trúc dịch vụ

Cấu trúc dịch vụ đề cập đến cách các dịch vụ được tạo thành và cách chúng giao tiếp với các thành phần khác trong hệ thống.

Tạo gói dịch vụ

Gói dịch vụ nhóm các đơn vị dịch vụ có liên quan mà bạn có thể triển khai cùng nhau. Thuộc tính duy nhất bắt buộc đối với một gói dịch vụ là tên. Cùng với tên gói, tên này tạo thành tên đủ điều kiện của gói dịch vụ.

Các gói dịch vụ được xác định bằng các tệp Ngôn ngữ định nghĩa giao diện dịch vụ dành cho ô tô (VSIDL) (các tệp có đuôi .vsidl).

Ví dụ sau đây cho thấy 2 gói dịch vụ: một gói dịch vụ TirePressureMonitoring và một gói dịch vụ BodyControl:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"
}

service_bundle {
  name: "BodyControl"
}

Trong trường hợp:

  • service_bundle xác định cấu trúc là một gói dịch vụ.
  • name là tên của gói dịch vụ.

Mô hình nhắn tin: Pub/Sub và RPC

Khung SDV sử dụng hai mẫu nhắn tin chính: Xuất bản-Đăng ký (Pub/Sub) và lệnh gọi quy trình từ xa (RPC).

Trong Pub/Sub, hệ thống phản ứng với trạng thái đang thay đổi của xe bằng cách truyền trực tuyến dữ liệu đến mọi thành phần liên quan. Dữ liệu được sắp xếp thành các chủ đề. Nhà xuất bản gửi thông báo về các chủ đề. Nhà xuất bản gửi thông báo về các chủ đề mà không cần biết có bao nhiêu người đăng ký đang nghe. Người đăng ký nhận thông báo về các chủ đề mà không biết chính xác nhà xuất bản nào đã gửi thông báo.

Ngược lại, RPC được thiết kế cho hành động và kết quả. Phương thức này được dùng khi người gọi bắt đầu một yêu cầu vì họ quan tâm đến kết quả cụ thể hoặc xác nhận của hành động đó. Người gọi sẽ gọi một phương thức cụ thể trên một kênh.

Mặc dù các mẫu này phục vụ những nhu cầu vận hành khác nhau, nhưng chúng có một thuộc tính cấu trúc chung: cả hai đều dựa vào các chủ đề và kênh giao tiếp được đặt tên cho Pub/Sub và RPC để tách biệt danh tính của người gửi với người nhận.

Khai báo nhà xuất bản và người đăng ký

Xuất bản-đăng ký là một mẫu nhắn tin, trong đó người gửi tin nhắn (gọi là nhà xuất bản) không gửi trực tiếp tin nhắn đến những người nhận cụ thể (gọi là người đăng ký). Thay vào đó, nhà xuất bản phân loại tin nhắn thành chủ đề và người đăng ký đăng ký một hoặc nhiều chủ đề giao tiếp và chỉ nhận những tin nhắn được xuất bản cho các chủ đề đó. Để biết thêm thông tin về mẫu xuất bản-đăng ký, hãy xem Mẫu xuất bản-đăng ký.

Thêm nhà xuất bản vào gói dịch vụ

Ví dụ sau đây cho thấy một nhà xuất bản được thêm vào gói dịch vụ TirePressureMonitoring:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"

  publisher {
    message: "TirePressure"
    topic: "front-left"
    capacity: 10
  }

}

service_bundle {
  name: "BodyControl"

  ...
}

Trong trường hợp:

  • Dịch vụ publisher sẽ xuất bản các thông báo vào một hàng đợi thông báo.
  • message Cấu trúc dữ liệu hoặc loại thông báo được xác định trong protobuf (tệp có đuôi .protobuf).
  • topic Giá trị nhận dạng riêng biệt của chủ đề xuất bản. Tên này phải ở dạng chữ thường có dấu gạch ngang.
  • capacity Số lượng thư mà hàng đợi xuất bản có thể chứa. Đây phải là một số chẵn lớn hơn hoặc bằng 2.

Thêm gói dịch vụ để đăng ký

Ví dụ sau đây cho thấy một nhà xuất bản được thêm vào gói dịch vụ 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"
  }
}

Trong trường hợp:

  • subscriber Gói dịch vụ đăng ký các chủ đề.
  • message Cấu trúc dữ liệu hoặc loại thông báo được xác định trong protobuf (tệp có đuôi .protobuf).
  • topic Giá trị nhận dạng riêng biệt của chủ đề xuất bản. Giá trị này phải khớp với chủ đề của nhà xuất bản và phải ở dạng chữ thường có dấu gạch ngang.

Xác định máy khách và máy chủ RPC

Lệnh gọi quy trình từ xa (RPC) cung cấp tính độc lập về vị trí của các lệnh gọi hàm. Trong mẫu này, kênh đóng vai trò là điểm hẹn có tên nơi máy khách và nhà cung cấp gặp nhau. Bằng cách nhắm đến kênh thay vì một phiên bản dịch vụ cụ thể, khung sẽ tách rời ý định của lệnh khỏi vị trí thực của quá trình triển khai.

Ví dụ sau đây chỉ định gói dịch vụ ClimateControl làm máy chủ và gói dịch vụ BodyControl làm ứng dụng khách:

package: "com.sdv.cc"

service_bundle {
  name: "ClimateControl"

  server {
    service: "SetTemperature"
    channel: "climate-control"
  }
}

service_bundle {
  name: "BodyControl"

  client {
    service: "SetTemperature"
    channel: "climate-control"
  }
}

Trong trường hợp:

  • server cho biết gói dịch vụ là một máy chủ cung cấp một số dịch vụ RPC (được xác định bằng serviceSetTemperature).
  • client cho biết gói dịch vụ là một ứng dụng gọi dịch vụ SetTemperature.
  • channel là tên của kênh RPC. Tên này phải ở dạng chữ thường có dấu gạch ngang và là duy nhất cho mỗi dịch vụ.

Ví dụ này cho phép gói dịch vụ BodyControl thực hiện các lệnh gọi quy trình từ xa đến gói dịch vụ ClimateControl để đặt nhiệt độ.

Các bước tiếp theo

Sau khi xác định cấu trúc, hãy tạo mã phần mềm trung gian.