GRPC แตกต่างจาก REST อย่างไร?


98

ฉันกำลังอ่านคำอธิบายของ GRPCและแผนผังนี้เป็นที่สนใจ:

ป้อนคำอธิบายภาพที่นี่

เลเยอร์การขนส่งทำงานอย่างไร? ถ้ามันผ่านเครือข่าย ... ทำไมถึงเรียกว่า RPC? ที่สำคัญกว่านั้นสิ่งนี้แตกต่างจาก REST ที่ใช้ API สำหรับชั้นบริการอย่างไร (คลาสในไคลเอนต์ที่มีเมธอดที่สร้างคำขอ http)


20
«หากอยู่บนเครือข่าย ... เหตุใดจึงเรียกว่า RPC » - เนื่องจาก RPC เป็นการเรียกขั้นตอนระยะไกลและ 'ระยะไกล' อาจหมายถึง 'บนโฮสต์อื่น' โดยสิ้นเชิง
weirdan

คำตอบ:


107

เลเยอร์การขนส่งทำงานโดยใช้ HTTP / 2 ที่ด้านบนของ TCP / IP ช่วยให้มีการเชื่อมต่อที่มีเวลาแฝงต่ำ (เร็วขึ้น) ซึ่งสามารถใช้ประโยชน์จากการเชื่อมต่อเดียวจากไคลเอนต์ไปยังเซิร์ฟเวอร์ (ซึ่งทำให้ใช้การเชื่อมต่อได้อย่างมีประสิทธิภาพมากขึ้นและส่งผลให้ใช้ทรัพยากรเซิร์ฟเวอร์ได้อย่างมีประสิทธิภาพ

HTTP / 2 ยังรองรับการเชื่อมต่อแบบสองทิศทางและการเชื่อมต่อแบบอะซิงโครนัส ดังนั้นจึงเป็นไปได้ที่เซิร์ฟเวอร์จะติดต่อกับไคลเอนต์เพื่อส่งข้อความได้อย่างมีประสิทธิภาพ (การตอบกลับแบบ async / การแจ้งเตือน ฯลฯ )

ในขณะที่ทั้ง REST และ gRPC สามารถสร้างต้นขั้วไคลเอนต์ / เซิร์ฟเวอร์ได้ (โดยใช้บางอย่างเช่น swagger สำหรับ REST) ​​REST มีชุดการเรียก 'ฟังก์ชัน' หลักที่ จำกัด (หรือคำกริยา):

+ ----------- + ---------------- +
| คำกริยา HTTP | CRUD |
+ ----------- + ---------------- +
| รับ | อ่าน |
| PUT | อัปเดต / แทนที่ |
| แพทช์ | ปรับปรุง / แก้ไข |
| ลบ | ลบ |
+ ----------- + ---------------- +

ในขณะที่ gRPC คุณสามารถกำหนดการเรียกใช้ฟังก์ชันประเภทใดก็ได้รวมทั้งซิงโครนัส / อะซิงโครนัสทิศทางเดียว / สองทิศทาง (สตรีม) เป็นต้น

การใช้ gRPC ไคลเอนต์ทำการโทรไปยังเมธอดท้องถิ่น สำหรับโปรแกรมเมอร์ดูเหมือนว่าคุณกำลังโทรในพื้นที่ แต่เลเยอร์ที่อยู่เบื้องหลัง (ต้นขั้วไคลเอนต์ที่สร้างขึ้นอัตโนมัติ) จะส่งการโทรไปยังเซิร์ฟเวอร์ สำหรับเซิร์ฟเวอร์ดูเหมือนว่าเมธอดถูกเรียกใช้ภายในเครื่อง

gRPC ดูแลระบบประปาพื้นฐานทั้งหมดและลดความซับซ้อนของกระบวนทัศน์การเขียนโปรแกรม อย่างไรก็ตามสำหรับนักบำบัด REST โดยเฉพาะบางคนอาจดูเหมือนเป็นเรื่องที่ซับซ้อนเกินไป YMMV


3
ดังนั้นคำถามด่วน: ใน REST คุณสามารถเรียกใช้ฟังก์ชันประเภทใดก็ได้ ตัวอย่างเช่นใน Rails ฉันสามารถส่งคำขอ GET ไปยังปลายทางที่ไม่ใช่ RESTful และทำอะไรบางอย่างนอกเหนือจากการขอรับทรัพยากร ฉันสามารถเตะฟังก์ชั่นใด ๆ จากจุดสิ้นสุดที่ไม่ใช่ RESTful ได้ ฉันยังสามารถสร้างบริการใน REST ที่ดูเหมือนจะเรียกใช้เมธอดท้องถิ่น แต่จริงๆแล้วภายใต้ประทุนคือการโทร http ไปยังปลายทาง ดังนั้นความแตกต่างจึงไม่มากนัก ... อย่างน้อยก็ในชั้นการขนส่ง หรือพวกเขา?
Jwan622

3
REST / RESTful ทำงานบน HTTP, gRPC ทำงานบน HTTP / 2 (เช่น WebSocket) การใช้ตัวสร้างรหัสจาก Swagger เป็นไปได้ที่จะสร้างไคลเอนต์และเซิร์ฟเวอร์สำหรับ REST, gRPC ใช้ไฟล์โปรโตเพื่อสร้างสตับ (ไม่เหมือนกับวิธี WSDL / SOAP แบบเก่า) ไฟล์โปรโตกำหนดประเภทดังนั้นสตับไคลเอนต์ / เซิร์ฟเวอร์ที่สร้างขึ้นจึงเป็นประเภทที่ปลอดภัย บนอุปกรณ์เคลื่อนที่การเชื่อมต่อ gRPC มีประสิทธิภาพเนื่องจากสามารถแชร์ซ็อกเก็ต HTTP / 2 ที่อยู่ภายใต้เดียวกันกับการเชื่อมต่อพร้อมกันอื่น ๆ จากแอปมือถือ
mmccabe

นี่คือคำแนะนำที่ดีสำหรับ gRPC: medium.com/square-corner-blog/grpc-reaches-1-0-85728518393b นี่คือตัวอย่างของ gRPC: github.com/mmcc007/go
mmccabe

1
Jwan622 และ mmccabe: การใช้ไลบรารี Superglue 2.1 ฉันสามารถสร้างบ้านด้วยแอปเปิ้ลและส้มได้ ในบางประเด็นเราต้องเลือกเครื่องมือที่เหมาะสมกับงานและพยายามลดความซับซ้อนของระบบซอฟต์แวร์ของเราอยู่เสมอ โปรดจำไว้ว่าการลบโค้ดเป็นการเพิ่มประสิทธิภาพเสมอ)
Martin Andersson

4
จากมุมมองของฉันสิ่งต่างๆเช่น RESTful APIs เป็น "แฮ็ก" ที่ใช้ร่วมกับโปรโตคอลเก่า หากมีบางอย่างเกิดขึ้นซึ่งช่วยให้ฉันใช้สแต็กที่เหมาะกับภาษาสมัยใหม่มากขึ้นและยังคงไม่เชื่อเรื่องพระเจ้าว่าลูกค้าใช้ภาษาใดโดยเฉพาะและเพิ่มประสิทธิภาพอย่างมากฉันจะเป็นคนแรกที่ก้าวขึ้นสู่ bandwagon!
Martin Andersson

44

REST ไม่ต้องการ JSON หรือ HTTP / 1.1

คุณสามารถสร้างบริการ RESTful ที่ส่งข้อความ protobuf (หรืออะไรก็ได้) ผ่าน HTTP / 2

คุณสามารถสร้างบริการ RESTful ที่ส่ง JSON ผ่าน HTTP / 2

คุณสามารถสร้างบริการ RESTful ที่ส่งข้อความ protobuf ผ่าน HTTP / 1.1

บริการ RESTful ไม่ใช่ "แฮ็ก" ที่อยู่เหนือ HTTP / xx แต่เป็นบริการตามหลักการสถาปัตยกรรมพื้นฐานที่ทำให้ HTTP เวอร์ชันใด ๆ ประสบความสำเร็จ (เช่นความสามารถในการแคชของคำขอ GET และความสามารถในการเล่นซ้ำของคำขอ PUT)

gRPC, SOAP และอื่น ๆ เป็นเหมือนแฮ็ก - แฮ็กที่อยู่ด้านบนของ HTTP เพื่ออุโมงค์บริการรูปแบบ RPC ผ่าน HTTP เพื่อกำหนดเส้นทางไปยังข้อ จำกัด ของไฟร์วอลล์และมิดเดิลแวร์ นั่นไม่จำเป็นต้องเป็นเรื่องเลวร้าย บางครั้งคุณอาจต้องการบริการรูปแบบ RPC แทนที่จะเป็น REST และเราต้องอยู่ในโลกที่มิดเดิลบ็อกซ์ยากที่จะแทนที่

หากคุณไม่มีเวลาอ่านคำจำกัดความที่แท้จริงของ REST: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

มี TLDR อยู่เสมอ เวอร์ชันบนวิกิพีเดีย:

https://en.wikipedia.org/wiki/Representational_state_transfer

หากคุณต้องการบริการสไตล์ RPC แน่นอนว่า gRPC นั้นยอดเยี่ยมมาก หากคุณต้องการใช้งานบนเว็บหรือต้องการประโยชน์ทั้งหมดที่มาพร้อมกับบริการสไตล์ RESTful ให้สร้างบริการสไตล์ RESTful และถ้าช้าเกินไปที่จะทำให้ข้อมูลเป็นอนุกรม / deserialize ข้อมูลในรูปแบบ JSON ในบริการพักผ่อนของคุณคุณสามารถใช้ protobuf หรืออะไรก็ได้

หาก gRPC เป็นเวอร์ชัน 2 ก็จะเป็น SOAP เวอร์ชัน 2 สิ่งที่ไม่น่ากลัวเช่น SOAP

และไม่คุณไม่สามารถ "เรียกใช้ฟังก์ชันใด ๆ " ในคำขอ GET ของคุณและมีบริการ RESTful ได้

สิ่งสุดท้าย: หากคุณจะใช้ protobufs กับบริการ RESTful โปรดทำให้ถูกต้องโดยใช้ส่วนหัวประเภทเนื้อหา ฯลฯ ด้วยเหตุนี้คุณจึงสามารถรองรับทั้ง JSON และ protobuf ได้อย่างง่ายดาย

ก้าวลงจากกล่อง SOAP ของฉันตอนนี้ .. ;)


คุณหมายความว่าไม่สามารถสร้างบริการ RESTful โดยใช้ gRPC ได้หรือไม่?
Kevin S

1
RTFM ที่อ้างถึงวิทยานิพนธ์ของ Fielding นั้นมากเกินไป แต่ก็เป็นการตอบสนองที่ยอดเยี่ยม
rmharrison

4

ข้อได้เปรียบที่ใหญ่ที่สุดของ gRPC เหนือ REST คือการรองรับ HTTP / 2 ผ่านปู่ HTTP 1.1 ข้อได้เปรียบที่ใหญ่ที่สุดของ HTTP / 2 บน HTTP 1.1 คือ 'HTTP / 2 อนุญาตให้เซิร์ฟเวอร์ "พุช" เนื้อหา "...


1
การพุชเซิร์ฟเวอร์ไม่จำเป็นต้องใช้ HTTP / 2
Robin Green

คุณสามารถเจาะจงมากขึ้นได้ไหม นี่คือวิกิที่พูดถึง HTTP / 2 Server Push: en.wikipedia.org/wiki/HTTP/2_Server_Push
Denis Wang

2
ขออภัยฉันไม่ได้หมายถึงการพุชเซิร์ฟเวอร์ HTTP 2 ฉันหมายถึงการตอบกลับแบบสตรีมมิ่ง มีวิธีอื่น ๆ ในการตอบกลับแบบสตรีมมิงเช่นการโพลแบบยาวที่เคารพนับถือหรือ websockets เป็นต้น
Robin Green

1
เซิร์ฟเวอร์ gRPC ไม่ส่ง HTTP / 2 "push และ gRPC ไคลเอ็นต์ละเว้น HTTP / 2" push "ดังนั้นข้อดีของ gRPC ที่รับมาจาก HTTP / 2 ไม่ควรรวม" push "
user675693

HTTP / 1.1 และ HTTP / 2 ไม่อยู่ในหัวข้อนี้ gRPC ใช้ HTTP / 2 เช่นเดียวกับกลไกการขนส่งความหมายของแอปพลิเคชันทั้งหมดใน HTTP / 2 ไม่มีประโยชน์ใน gRPC โปรโตคอลใหม่จำนวนมากที่ใช้ HTTP เป็นเพียงเพราะมันเป็นมิตรกับไฟร์วอลล์ดู SOAP, gRPC, websocket ...
tangxinfa

0

ฉันรู้สึกเสมอว่า gRPC และ REST เป็นสองสิ่งที่แตกต่างกันอย่างสิ้นเชิง

REST ดีที่สุดสำหรับบริการที่เน้นทรัพยากร มิฉะนั้นเราสามารถใช้ gRPC เพื่อประสิทธิภาพสูง

REST คือระดับอินเทอร์เน็ตสำหรับการพูดคุยของผู้ใช้ปลายทางด้วยบริการของเรา gRPC เป็นระดับอินทราเน็ตสำหรับบริการภายในที่พูดคุยกัน

REST มีความหมายของแอปพลิเคชันสำหรับการติดตาม gRPC ไม่มีอะไรให้คุณควรสร้างทุกอย่างตั้งแต่เริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.