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 có liên quan. Dữ liệu được sắp xếp theo 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 lắng nghe. Người đăng ký nhận được 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ý

Publish-subscribe 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 các thông báo thành chủ đề và người đăng ký sẽ đăng ký một hoặc nhiều chủ đề liên lạc và chỉ nhận được những thông báo được xuất bản cho các chủ đề đó. Để biết thêm thông tin về mô hình xuất bản-đăng ký, hãy xem phần Mô hình 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 thuê bao

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 khả năng độ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 tên, nơi ứng dụng 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 này tách ý định của lệnh khỏi vị trí thực tế của quá trình triển khai.

Ví dụ sau đây có gói dịch vụ CabinComfort lưu trữ một máy chủ ClimateControl và gói dịch vụ BodyControl được mở rộng để lưu trữ một ứng dụng khách 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"
  }
}

Trong trường hợp:

  • server cho biết gói dịch vụ chứa một máy chủ cung cấp một số dịch vụ RPC (được xác định bằng serviceClimateControl).
  • client cho biết gói dịch vụ chứa một ứng dụng gọi dịch vụ ClimateControl.
  • 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ụ CabinComfort để kiểm soát khí hậu của vùng phía trước trong cabin.

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.