2017-08-11 20 views
10

Tôi thấy ngày càng nhiều tổ chức phần mềm sử dụng gRPC trong kiến ​​trúc hướng dịch vụ của họ, nhưng mọi người vẫn đang sử dụng REST. Trong những trường hợp sử dụng nào có ý nghĩa khi sử dụng gRPC, và khi nào sử dụng REST cho giao tiếp giữa các dịch vụ là hợp lý?REST vs gRPC: khi nào tôi nên chọn cái kia?

Thật thú vị, tôi đã bắt gặp các dự án nguồn mở sử dụng cả REST và gRPC. Ví dụ, Kubernetes và Docker Swarm đều sử dụng gRPC ở một mức độ nào đó để điều phối cụm, nhưng cũng đưa ra các API REST để giao tiếp với các nút chính/đầu. Tại sao không sử dụng gRPC lên xuống?

+1

P.s. Tôi nên làm rõ rằng tôi không mong đợi một câu trả lời đúng, chủ yếu là chính xác, mà là một cuộc thảo luận về kinh nghiệm của các nhà phát triển khi tiếp cận những lựa chọn công nghệ này. – nmurthy

Trả lời

2

Tùy thuộc vào số future roadmap của gRPC, mọi người sẽ tiếp tục di chuyển đến nó và cho phép REST (qua HTTP) "yên tĩnh".

gRPC là thuận tiện hơn bằng nhiều cách:

  • thường nhanh chóng (như siêu nhanh)
  • (Hầu như) Không "phân đôi thiết kế" - là những gì cuối điểm quyền sử dụng, có chuyện gì HTTP động từ quyền sử dụng vv
  • Không đối phó với lộn xộn đầu vào/response serialization vớ vẩn như các giao dịch với serialization gRPC - mã hóa dữ liệu hiệu quả hơn và HTTP/2 mà làm những điều đi nhanh hơn với yêu cầu ghép trên một đơn kết nối một nd header compression
  • Xác định/Khai báo đầu vào/phản hồi của bạn và tạo ra các ứng dụng đáng tin cậy cho các ngôn ngữ khác nhau (tất nhiên, những thứ được "hỗ trợ", đây là một lợi thế rất lớn)
  • Tập hợp lỗi chính thức - điều này có thể gây tranh cãi cho đến nay chúng được áp dụng trực tiếp hơn cho các trường hợp sử dụng API so với các mã trạng thái HTTP

Trong mọi trường hợp, bạn sẽ phải đối phó với tất cả các vấn đề về gRPC vì không có gì trong thế giới này là bất khả xâm phạm, nhưng cho đến nay " trông tốt hơn "so với REST - và đã thực sự chứng minh điều đó.

Tôi nghĩ bạn có thể tận dụng tối đa cả hai thế giới. Trong bất kỳ trường hợp nào, gRPC chủ yếu tuân theo ngữ nghĩa HTTP (qua HTTP/2) nhưng rõ ràng cho phép phát song công toàn bộ, phân tách từ các quy ước REST điển hình khi sử dụng các đường dẫn tĩnh tĩnh vì lý do hiệu suất trong khi gửi cuộc gọi. và trọng tải cơ thể thêm độ trễ và độ phức tạp.

3

Lời hứa của REST luôn là uniform interface. Một máy khách REST lý tưởng sẽ có thể nói chuyện với một loạt các tài nguyên RESTful, ngay cả những tài nguyên không tồn tại khi khách hàng được mã hóa.

Thật không may, lý tưởng này chưa bao giờ thực sự được mô tả hóa trừ trường hợp gốc của REST - World Wide Web của các tài liệu có thể đọc được. Tại thời điểm này, hầu hết các giao diện tự gọi là “RESTful” thực sự là một kiểu RPC baroque, nơi dữ liệu yêu cầu và phản hồi được bôi đen trên các phương thức, chuỗi truy vấn, tiêu đề, mã trạng thái, tải trọng, tất cả trong một loạt các mong manh định dạng.

Hầu hết tính đồng nhất trong giao diện “RESTful” ngày nay đều nằm trong phần đầu của nhà phát triển. Họ “biết” rằng POST /orders/ có thể sẽ thêm một đơn đặt hàng mới. Nhưng họ vẫn phải lập trình cho khách hàng của mình “biết” điều đó, đối với mỗi API họ nói chuyện, thường gây ra nhiều lỗi.

Tuy nhiên, có một số tính đồng nhất có thể thực sự hữu ích trong mã.Ví dụ, nếu bạn có một API "RESTful", thì bạn thường có thể thêm một lớp bộ đệm trong suốt, có thể điều chỉnh tinh vi vào nó gần như miễn phí. Điều này là có thể vì thông điệp HTTP (ngữ nghĩa chính xác) đã mang tất cả thông tin chuẩn hóa cần thiết cho bộ nhớ đệm: phương thức yêu cầu, URL, mã trạng thái, Cache-Control, Vary và tất cả những điều đó. Trong gRPC, bạn phải cuộn bộ nhớ đệm của riêng mình.

Nhưng lý do thực sự cho sự thống trị hiện tại của “REST” không phải là loại trợ cấp nhỏ này. Đó thực sự chỉ là sự thành công của World Wide Web. Tại một thời điểm nào đó trong lịch sử, nó đã transpired rằng tất cả mọi người đã có một máy chủ HTTP linh hoạt, hoạt động (để phục vụ trang web của họ) và một máy khách HTTP rắn (để xem trang web), vì vậy khi mọi người bắt đầu thêm tài nguyên có thể đọc được, nó chỉ đơn giản là dễ dàng hơn và rẻ hơn để dính vào cùng một cách HTTP. Họ đã sử dụng các phương thức HTTP và các tiêu đề và mã trạng thái vì đó là những gì các máy chủ Web của họ đã hiểu và đã đăng nhập. Các công cụ như PHP cho phép họ thực hiện điều này với chi phí triển khai bằng không trên các trang web thông thường của họ.

Nếu tính đồng nhất và liên kết với World Wide Web không quan trọng đối với bạn, thì RPC là một sự lựa chọn kiến ​​trúc thực sự và cố gắng, và gRPC là một thực hiện vững chắc có thể giúp bạn giải quyết một số rắc rối, như ɥɔɐɯuıɥɔɐɯ giải thích.

6

Khi được thực hiện đúng, REST cải thiện khả năng phát triển và khả năng mở rộng lâu dài với chi phí hiệu suất và độ phức tạp thêm. REST là lý tưởng cho các dịch vụ phải được phát triển và duy trì độc lập, giống như bản thân Web. Khách hàng và máy chủ có thể được kết nối lỏng lẻo và thay đổi mà không phá vỡ lẫn nhau.

Dịch vụ RPC có thể đơn giản hơn và hoạt động tốt hơn, với chi phí linh hoạt và độc lập. Các dịch vụ RPC là lý tưởng cho các trường hợp mà máy khách và máy chủ được kết hợp chặt chẽ và tuân theo cùng một chu kỳ phát triển.

Tuy nhiên, hầu hết các dịch vụ REST không thực sự tuân theo REST, vì REST trở thành một từ thông dụng cho bất kỳ loại API HTTP nào. Trên thực tế, hầu hết các API REST được kết hợp chặt chẽ đến mức chúng không mang lại lợi thế nào so với thiết kế RPC.

Cho rằng, câu trả lời có phần hoài nghi của tôi cho câu hỏi của bạn là:

  1. Một số người đang áp dụng gRPC với cùng lý do họ thông qua nghỉ ngơi một vài năm trước đây: Thiết kế-by-từ thông dụng.

  2. Nhiều người đang nhận ra cách họ triển khai số tiền REST cho RPC, vậy tại sao không đi với khung RPC chuẩn hóa và triển khai đúng cách, thay vì nhấn mạnh vào việc triển khai REST kém?

  3. REST là giải pháp cho các sự cố xuất hiện trong các dự án trải rộng một số tổ chức và có mục tiêu dài hạn. Có thể mọi người đang nhận ra rằng họ không thực sự cần REST và tìm kiếm các lựa chọn tốt hơn.

Các vấn đề liên quan