GRPC khác với REST như thế nào?


98

Tôi đang đọc giải thích này về GRPC và sơ đồ này được quan tâm:

nhập mô tả hình ảnh ở đây

Lớp vận chuyển hoạt động như thế nào? Nếu nó qua mạng ... tại sao nó được gọi là RPC? Quan trọng hơn, điều này khác với REST triển khai API cho lớp dịch vụ như thế nào (lớp trong máy khách có các phương thức thực hiện yêu cầu http)?


20
«Nếu nó qua mạng ... tại sao nó được gọi là RPC» - Bởi vì RPC là một cuộc gọi thủ tục từ xa, và 'từ xa' hoàn toàn có thể có nghĩa là "trên một máy chủ khác".
kỳ lạ

Câu trả lời:


104

Lớp truyền tải hoạt động bằng cách sử dụng HTTP / 2 trên TCP / IP. Nó cho phép các kết nối có độ trễ thấp hơn (nhanh hơn) có thể tận dụng lợi thế của một kết nối duy nhất từ ​​máy khách đến máy chủ (giúp sử dụng kết nối hiệu quả hơn và có thể sử dụng tài nguyên máy chủ hiệu quả hơn.

HTTP / 2 cũng hỗ trợ kết nối hai chiều và kết nối không đồng bộ. Vì vậy, máy chủ có thể liên hệ hiệu quả với máy khách để gửi tin nhắn (phản hồi / thông báo không đồng bộ, v.v.)

Trong khi, cả REST và gRPC đều có thể tạo ra các sơ khai máy khách / máy chủ (sử dụng một cái gì đó như swagger cho REST), REST có một tập hợp giới hạn các lệnh gọi 'chức năng' chính (hoặc động từ):

+ ----------- + ---------------- +
| Động từ HTTP | CRUD |
+ ----------- + ---------------- +
| NHẬN | Đọc |
| ĐẶT | Cập nhật / Thay thế |
| VÁCH | Cập nhật / Sửa đổi |
| XÓA | Xóa |
+ ----------- + ---------------- +

trong khi gRPC bạn có thể xác định bất kỳ loại lệnh gọi hàm nào bao gồm đồng bộ / không đồng bộ, một hướng / hai chiều (luồng), v.v.

Sử dụng gRPC máy khách thực hiện cuộc gọi đến một phương thức cục bộ. Đối với lập trình viên, có vẻ như bạn đang thực hiện một cuộc gọi cục bộ, nhưng lớp bên dưới (gốc máy khách được tạo tự động) sẽ gửi cuộc gọi đến máy chủ. Đối với máy chủ, có vẻ như phương thức của nó đã được gọi cục bộ.

gRPC xử lý tất cả các đường ống dẫn nước bên dưới và đơn giản hóa mô hình lập trình. Tuy nhiên, đối với một số người theo chủ nghĩa REST chuyên dụng, điều này có vẻ như là một sự phức tạp quá mức. YMMV


2
Vì vậy, câu hỏi nhanh: Trong REST, bạn cũng có thể gọi bất kỳ loại hàm nào. Ví dụ, trong Rails, tôi có thể gửi một yêu cầu GET đến một điểm cuối không phải là RESTful và làm điều gì đó ngoài việc chỉ lấy một tài nguyên. Tôi có thể thực hiện bất kỳ chức năng nào từ điểm cuối không RESTful đó. Tôi cũng có thể tạo các dịch vụ trong REST dường như đang gọi một phương thức cục bộ nhưng thực sự ẩn là thực hiện một cuộc gọi http tới một điểm cuối. Vì vậy, sự khác biệt không lớn là chúng ... ít nhất là trên lớp truyền tải. Hoặc là họ?
Jwan622,

2
REST / RESTful chạy trên HTTP, gRPC chạy trên HTTP / 2 (giống như WebSocket). Sử dụng trình tạo mã từ Swagger, có thể tạo ra các bản khai máy khách và máy chủ cho REST, gRPC sử dụng tệp proto để tạo các bản gốc của nó (không giống như cách tiếp cận WSDL / SOAP cũ). Tệp proto xác định kiểu, do đó, các gốc máy khách / máy chủ được tạo là kiểu an toàn. Trên thiết bị di động, kết nối gRPC hiệu quả vì nó có thể chia sẻ cùng một ổ cắm HTTP / 2 bên dưới với bất kỳ kết nối đồng thời nào khác từ ứng dụng di động.
mmccabe

Đây là phần giới thiệu hay về gRPC: medium.com/square-corner-blog/grpc-reaches-1-0-85728518393b Đây là bản demo của gRPC: github.com/mmcc007/go
mmccabe

1
Jwan622 và mmccabe: Sử dụng thư viện Superglue 2.1, tôi có thể xây một ngôi nhà bằng táo và cam. Tại một số điểm, chúng ta phải chọn công cụ phù hợp cho công việc và luôn tìm cách giảm thiểu sự phức tạp của hệ thống phần mềm của chúng ta. Hãy nhớ rằng, xóa mã luôn là cách tối ưu hóa hiệu suất;)
Martin Andersson

4
Theo quan điểm của tôi, những thứ như API RESTful luôn là một thứ "hack" để sử dụng trên các giao thức cũ. Nếu điều gì đó đi kèm cho phép tôi sử dụng một ngăn xếp phù hợp hơn với các ngôn ngữ hiện đại và vẫn không xác định được ngôn ngữ cụ thể nào đang được khách hàng sử dụng VÀ tăng hiệu suất một cách đáng kể, thì tôi sẽ là người đầu tiên nhảy vào nhóm!
Martin Andersson

42

REST không yêu cầu JSON hoặc HTTP / 1.1

Bạn có thể dễ dàng xây dựng một dịch vụ RESTful gửi tin nhắn protobuf (hoặc bất cứ thứ gì) qua HTTP / 2

Bạn có thể xây dựng các dịch vụ RESTful gửi JSON qua HTTP / 2

Bạn có thể xây dựng các dịch vụ RESTful gửi tin nhắn protobuf qua HTTP / 1.1

Các dịch vụ RESTful không phải là "hack" trên HTTP / xx, chúng là các dịch vụ tuân theo các nguyên tắc kiến ​​trúc cơ bản đã làm cho bất kỳ phiên bản HTTP nào thành công (như khả năng lưu trong bộ nhớ cache của các yêu cầu GET và khả năng phát lại các yêu cầu PUT).

gRPC, SOAP, et. al giống như hack - hack trên HTTP để tạo đường hầm cho các dịch vụ kiểu RPC qua HTTP, để định tuyến xung quanh các hạn chế của tường lửa và hộp trung gian. Đó không hẳn là một điều xấu. Đôi khi bạn có thể muốn một dịch vụ kiểu RPC thay vì một dịch vụ REST, và chúng ta phải sống trong một thế giới mà các hộp trung gian rất khó thay thế.

Nếu bạn không có thời gian để đọc định nghĩa thực tế của REST: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

Luôn có TLDR; phiên bản trên wikipedia:

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

Nếu bạn cần một dịch vụ kiểu RPC, chắc chắn, gRPC rất tuyệt. Nếu bạn muốn sống trên web, hoặc bạn muốn tất cả những lợi ích đi kèm với dịch vụ theo phong cách RESTful, thì hãy xây dựng một dịch vụ theo phong cách RESTful. Và nếu quá chậm để tuần tự hóa / giải mã hóa dữ liệu ở định dạng JSON trong dịch vụ yên tĩnh của bạn, bạn hoàn toàn có thể sử dụng protobuf hoặc bất cứ thứ gì.

Nếu gRPC là phiên bản 2 của bất kỳ thứ gì, thì đó là phiên bản 2 của SOAP. Một thứ không khủng khiếp, như SOAP.

Và, không, bạn không thể chỉ "gọi bất kỳ chức năng nào" trong yêu cầu GET của mình và có một dịch vụ RESTful.

Một điều cuối cùng: nếu bạn định sử dụng protobufs qua một dịch vụ RESTful, hãy làm đúng, sử dụng tiêu đề loại nội dung, v.v. Với điều đó, bạn có thể dễ dàng hỗ trợ cả JSON VÀ protobuf.

Bước xuống từ hộp SOAP của tôi bây giờ ..;)


Bạn có ngụ ý rằng một dịch vụ RESTful không thể được tạo bằng gRPC không?
Kevin S,

1
RTFM trích dẫn luận văn của Fielding là quá mức cần thiết, nhưng nếu không thì phản hồi rất tốt.
rmharrison

4

Ưu điểm lớn nhất của gRPC so với REST là hỗ trợ HTTP / 2 so với HTTP 1.1 của ông nội. Sau đó, lợi thế lớn nhất của HTTP / 2 so với HTTP 1.1 là, 'HTTP / 2 cho phép máy chủ "đẩy" nội dung' ...


1
Đẩy máy chủ không cần HTTP / 2.
Robin Green

Bạn có thể đặc sắc hơn không? Đây là wiki nói về HTTP / 2 Server Đẩy: en.wikipedia.org/wiki/HTTP/2_Server_Push
Denis Wang

2
Xin lỗi, ý tôi không phải là đẩy máy chủ HTTP 2, tôi có nghĩa là trả lời trực tuyến. Có những cách khác để thực hiện trả lời trực tuyến, chẳng hạn như bỏ phiếu dài đáng kính hoặc cổng kết nối web, chẳng hạn.
Robin Green

1
gRPC máy chủ không gửi HTTP / 2 "đẩy và gRPC bỏ qua của khách hàng HTTP / 2 "đẩy" lợi thế Vì vậy gRPC của thừa hưởng từ HTTP / 2 không nên bao gồm. "push".
user675693
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.