สถาปัตยกรรมบริการ หมายถึงวิธีที่บริการต่างๆ ประกอบขึ้นและวิธีที่บริการเหล่านั้นสื่อสารกับคอมโพเนนต์อื่นๆ ในระบบ
สร้างกลุ่มบริการ
กลุ่มบริการจะจัดกลุ่มหน่วยบริการที่เกี่ยวข้องซึ่งสามารถติดตั้งใช้งานร่วมกันได้ พร็อพเพอร์ตี้เดียวที่จำเป็นสำหรับกลุ่มบริการคือชื่อ ชื่อจะรวมกับชื่อแพ็กเกจเพื่อสร้างชื่อที่สมบูรณ์ในตัวเองของกลุ่มบริการ
กลุ่มบริการจะกำหนดด้วยไฟล์ Vehicle Services Interface Definition Language (VSIDL) (ไฟล์ที่มีนามสกุล .vsidl)
ตัวอย่างต่อไปนี้แสดงกลุ่มบริการ 2 กลุ่ม ได้แก่ กลุ่มบริการ TirePressureMonitoring และกลุ่มบริการ BodyControl
package: "com.android.sdv.sample.vsidl"
service_bundle {
name: "TirePressureMonitoring"
}
service_bundle {
name: "BodyControl"
}
โดยที่
service_bundleระบุโครงสร้างเป็นกลุ่มบริการnameคือชื่อของกลุ่มบริการ
รูปแบบการรับส่งข้อความ: Pub/Sub และ RPC
เฟรมเวิร์ก SDV ใช้รูปแบบการรับส่งข้อความหลัก 2 รูปแบบ ได้แก่ Publish-Subscribe (Pub/Sub) และ Remote Procedure Call (RPC)
ใน Pub/Sub ระบบจะตอบสนองต่อสถานะที่เปลี่ยนแปลงไปของยานพาหนะโดยการสตรีมข้อมูลไปยังคอมโพเนนต์ที่สนใจ ระบบจะจัดระเบียบข้อมูลเป็นหัวข้อ ผู้เผยแพร่จะส่งข้อความในหัวข้อ ผู้เผยแพร่จะส่งข้อความในหัวข้อโดยไม่ต้องทราบว่ามีผู้สมัครรับข้อมูลรายใด (หรือมีจำนวนเท่าใด) ที่กำลังฟังอยู่ ผู้สมัครรับข้อมูลจะได้รับข้อความในหัวข้อโดยไม่ทราบว่าผู้เผยแพร่รายใดเป็นผู้ส่งข้อความ
ในทางตรงกันข้าม RPC ได้รับการออกแบบมาเพื่อการดำเนินการและผลลัพธ์ โดยจะใช้เมื่อผู้เรียกเริ่มคำขอเนื่องจากต้องการผลลัพธ์หรือการยืนยันที่เฉพาะเจาะจงของการดำเนินการนั้น ผู้เรียกจะเรียกใช้เมธอดที่เฉพาะเจาะจงในแชแนล
แม้ว่ารูปแบบเหล่านี้จะตอบสนองความต้องการในการดำเนินงานที่แตกต่างกัน แต่ก็มีพร็อพเพอร์ตี้โครงสร้างร่วมกัน นั่นคือ ทั้ง 2 รูปแบบอาศัยเส้นทางการสื่อสารที่มีชื่อ ได้แก่ หัวข้อสำหรับ Pub/Sub และแชแนลสำหรับ RPC เพื่อแยกข้อมูลประจำตัวของผู้ส่งออกจากผู้รับ
ประกาศผู้เผยแพร่และผู้สมัครรับข้อมูล
Publish-Subscribe เป็นรูปแบบการรับส่งข้อความที่ผู้ส่งข้อความซึ่งเรียกว่า ผู้เผยแพร่ จะไม่ส่งข้อความไปยังผู้รับที่เฉพาะเจาะจงซึ่งเรียกว่า ผู้สมัครรับข้อมูล โดยตรง แต่ผู้เผยแพร่จะจัดหมวดหมู่ข้อความเป็น หัวข้อ และผู้สมัครรับข้อมูลจะสมัครรับข้อมูลหัวข้อการสื่อสารอย่างน้อย 1 หัวข้อและจะได้รับเฉพาะข้อความที่เผยแพร่ในหัวข้อเหล่านั้น ดูข้อมูลเพิ่มเติมเกี่ยวกับ Publish-Subscribe ได้ที่ รูปแบบ Publish-Subscribe
เพิ่มผู้เผยแพร่ลงในกลุ่มบริการ
ตัวอย่างต่อไปนี้แสดงผู้เผยแพร่ที่เพิ่มลงในกลุ่มบริการ 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
Remote Procedure Call (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บ่งชี้ว่ากลุ่มบริการมีไคลเอ็นต์ที่เรียกใช้บริการClimateControlchannelคือชื่อของแชแนล RPC ต้องอยู่ในรูปแบบตัวพิมพ์เล็กคั่นด้วยขีดกลางและไม่ซ้ำกันต่อบริการ
ตัวอย่างนี้ช่วยให้กลุ่มบริการ BodyControl สามารถเรียกใช้ Remote Procedure Call ไปยังกลุ่มบริการ CabinComfort เพื่อควบคุมสภาพอากาศของโซนด้านหน้าของห้องโดยสาร
ขั้นตอนถัดไป
หลังจากกำหนดสถาปัตยกรรมแล้ว ให้สร้างโค้ดมิดเดิลแวร์