gRPC – Bước tiến mới cho Microservices của bạn
Khi hệ thống chuyển sang mô hình Microservices, các lần gọi API ngày càng nhiều, dẫn đến hệ quả là hiệu suất giảm do gánh nặng truyền tải dữ liệu. gRPC ra đời được xem là giải pháp tiềm năng cho vấn đề này.
Bài viết sẽ cung cấp các khái niệm cũng như lý thuyết vận hành cơ bản của gRPC, giúp các bạn hiểu được cách hoạt động, những ưu nhược điểm mà nó mang lại và tính áp dụng trong tương lai.
1. Giới thiệu về gRPC
gRPC là framework mã nguồn mở hỗ trợ giao tiếp từ xa (RPC: Remote Procedure Call) hiệu quả giữa các dịch vụ trong hệ thống phân tán.
Nền tảng này được phát triển bởi Google và sử dụng giao thức HTTP/2 để truyền tải dữ liệu, mang đến nhiều ưu điểm vượt trội so với các phương thức truyền thống như RESTful API.
Với gRPC, bạn có thể viết code như cách gọi một hàm trên máy tính cục bộ, mặc dù hàm này thực tế nằm trên một máy tính khác.
2. Cách thức hoạt động của gRPC
gRPC sử dụng protobuf để mô tả các dịch vụ và phương thức có thể được gọi từ xa.
Ảnh minh họa từ trang web gRPC
Protobuf hay Protocols Buffer là IDL (Interface Definition Language) là một ngôn ngữ định nghĩa giao diện giao tiếp, dùng để mô tả các cấu trúc dữ liệu.
Chúng ta có thể xác định cấu trúc cho dữ liệu và các phương thức của service trong tệp proto.
Sau đó dùng protoc để biên dịch thành mã nguồn của các ngôn ngữ lập trình khác nhau, có chức năng serialize và deserialize các cấu trúc dữ liệu này thành dạng binary stream.
So với dạng XML hoặc JSON thì dữ liệu được tạo ra nhỏ gọn gấp 3-10 lần và được xử lý rất nhanh.
Kiến trúc gRPC
gRPC cung cấp các công cụ để tạo mã stub cho máy chủ và máy khách từ định nghĩa dịch vụ.
Máy khách sử dụng stub để gọi các phương thức trên máy chủ.
Dữ liệu được truyền tải giữa máy chủ và máy khách dưới dạng nhị phân.
3. Ưu điểm của gRPC
- Hiệu suất cao: gRPC sử dụng protobuf để mã hóa dữ liệu nhị phân, giúp giảm kích thước dữ liệu truyền tải và tăng tốc độ xử lý so với JSON/XML.
Protobuf vượt trội về tốc độ và kích thước so với JSON. Tham khảo link bài viết (1)
- Tiết kiệm tài nguyên: gRPC sử dụng HTTP/2 hiệu quả hơn HTTP/1.1, giúp giảm tải CPU và bộ nhớ cho máy chủ và máy khách. HTTP/2 cho phép gửi nhiều request/response trong cùng một connection. Hơn nữa, mọi thứ trong HTTP/2 đều được mã hóa trước khi gửi, bao gồm cả header. Còn nhiều thứ hay ho khác, các bạn hãy tìm hiểu thêm về HTTP/2.
- Hỗ trợ đa ngôn ngữ: gRPC hỗ trợ nhiều ngôn ngữ lập trình phổ biến như Java, Python, Go, C++, PHP, Ruby, v.v… Các ứng dụng cũng có thể được viết bằng các ngôn ngữ khác nhau và gRPC có nhiều thư viện để hỗ trợ điều đó.
- Tính linh hoạt: gRPC có thể sử dụng cho nhiều trường hợp khác nhau, từ Microservices đến IoT và Streaming media.
- Hỗ trợ đa nền tảng: gRPC có thể chạy trên nhiều hệ điều hành và kiến trúc khác nhau, giúp tăng khả năng tương thích cho hệ thống.
- Bảo mật: gRPC hỗ trợ các giao thức bảo mật như TLS/SSL giúp bảo vệ dữ liệu truyền tải.
- Quản lý kết nối hiệu quả: gRPC cung cấp các tính năng quản lý kết nối hiệu quả như HTTP/2 multiplexing, giúp giảm thiểu số lượng kết nối cần thiết và cải thiện hiệu suất.
- Khả năng mở rộng: gRPC có thể dễ dàng mở rộng để hỗ trợ số lượng lớn kết nối và xử lý lượng truy cập cao.
4. Nhược điểm của gRPC
- Mức độ cần tìm hiểu cao: gRPC sử dụng protobuf để mô tả dịch vụ, đòi hỏi người dùng phải có kiến thức về protobuf. Việc này có thể tạo ra rào cản cho những người mới bắt đầu, nhất là khi so sánh với RESTful API, vốn đã phổ biến và dễ tiếp cận hơn.
- Hỗ trợ cộng đồng chưa rộng bằng RESTful API: Do RESTful API đã được sử dụng rộng rãi từ lâu, nên cộng đồng hỗ trợ cho nó cũng lớn và mạnh mẽ hơn so với gRPC. Điều này có thể gây khó khăn cho người dùng gRPC khi gặp vấn đề và cần tìm kiếm trợ giúp.
- Khó khăn trong việc debug: gRPC sử dụng mã nhị phân để truyền tải dữ liệu, khiến việc theo dõi thông tin trở nên khó khăn hơn so với RESTful API, vốn sử dụng định dạng JSON hoặc XML dễ đọc hơn.
- Phụ thuộc vào HTTP/2: gRPC phụ thuộc vào HTTP/2 để hoạt động. Do đó, nó không thể sử dụng trong các môi trường không hỗ trợ HTTP/2, điều này có thể hạn chế tính linh hoạt của nó.
- Hạn chế về trình duyệt: Khác với RESTful API, gRPC không được hỗ trợ đầy đủ bởi tất cả các trình duyệt web. Việc này có thể gây khó khăn cho việc phát triển các ứng dụng web sử dụng gRPC, vì nó đòi hỏi việc sử dụng các giải pháp thay thế như gRPC Gateway.
Tuy nhiên, cần lưu ý rằng những hạn chế này đang dần được cải thiện. Các framework đang dần tích hợp gRPC. Cộng đồng gRPC cũng đang phát triển nhanh chóng, hứa hẹn sẽ cung cấp nhiều tài nguyên hỗ trợ hơn trong tương lai.
5. So sánh gRPC với RESTful API
gRPC và RESTful API là hai phương thức giao tiếp từ xa phổ biến được sử dụng để truyền tải dữ liệu giữa các dịch vụ trong hệ thống phân tán. Mỗi phương thức đều có những ưu điểm và nhược điểm riêng.
Ngoài sự giống nhau của RESTful API và gRPC ở khả năng mở rộng, hỗ trợ đa ngôn ngữ, đa nền tảng, tính linh hoạt, tính bảo mật thì còn có các điểm khác nhau như sau:
Tính năng | gRPC | RESTful API |
Hiệu suất | Cao | Trung bình |
Tiết kiệm tài nguyên | Cao | Trung bình |
Mức độ học tập | Cao | Trung bình |
Hỗ trợ cộng đồng | Trung bình | Cao |
Quản lý kết nối | Hiệu quả | Trung bình |
Hỗ trợ trình duyệt | Hạn chế | Hỗ trợ tốt |
6. Ứng dụng của gRPC
- Microservices: gRPC là lựa chọn lý tưởng cho việc giao tiếp giữa các dịch vụ trong kiến trúc Microservices.
- IoT: gRPC có thể được sử dụng để kết nối các thiết bị IoT với nhau và với các dịch vụ khác.
- Streaming media, game: gRPC có thể được sử dụng để truyền tải video và âm thanh trực tuyến, có thể được sử dụng để phát triển các trò chơi multiplayer.
7. Giải pháp chuyển đổi và phát triển
Trong hệ thống không phải ứng dụng nào cũng hỗ trợ giao thức gRPC. Trong quá trình chuyển đổi, vẫn sẽ có những ứng dụng sử dụng RESTful API. Vậy làm sao để các ứng dụng này giao tiếp với nhau. Có 2 cách giải quyết vấn đề này là:
- gRPC Gateway: gRPC Gateway đóng vai trò là service proxy, giúp chuyển đổi các yêu cầu HTTP sang gRPC và ngược lại. Cho phép sử dụng gRPC với các ứng dụng không hỗ trợ gRPC trực tiếp.
Nhược điểm của việc này là dữ liệu sẽ phải đi qua thêm một bước nữa, điều này có thể làm tăng độ trễ khi truyền tải.
Ảnh minh họa Cloud Endpoints của Google sử dụng gRPC
- Xây dựng một service hỗ trợ cả hai đầu gRPC và RESTful API: Nhược điểm làm tăng thêm độ phức tạp của project. Nhưng đối với một số framework có hỗ trợ thì việc này có thể thực hiện dễ dàng. Tham khảo link bài viết (2) ở phần tài liệu tham khảo.
8. Tài liệu tham khảo
Bài viết chỉ cung cấp thông tin cơ bản về gRPC. Bạn có thể vào các đường dẫn dưới đây để có thêm thông tin chi tiết.
- Trang chủ gRPC:
gRPC Homepage - Tài liệu liên quan gRPC:
gRPC Document
freeCodeCamp - gRPC – Java Example:
Baeldung gRPC Introduction - gRPC – Go Example (1):
Giới thiệu về RPC
Building High Performance APIs In Go Using gRPC And Protocol Buffers - Service cung cấp gRPC và HTTP API bằng Spring (2):
Xây dựng Service cung cấp gRPC và Http API bằng Spring - Test performance:
Benchmarking Protocol Buffers, JSON and XML in Go - Deep Dive gRPC: Protobuf & HTTP/2.0:
Deep Dive gRPC: Protobuf & HTTP/2.0
Kết luận
gRPC là một framework mạnh mẽ và hiệu quả cho phép thực hiện giao tiếp từ xa.
Nền tảng này mang đến nhiều ưu điểm vượt trội so với các phương thức truyền thống như RESTful API. Giúp nâng cao hiệu suất và tiết kiệm tài nguyên cho hệ thống. Tuy nhiên, gRPC cũng có một số nhược điểm cần lưu ý trước khi sử dụng.
Một vài lời khuyên được đưa ra trước khi bắt đầu áp dụng gRPC để bạn tham khảo như sau:
- Nên sử dụng gRPC cho các hệ thống phân tán cần hiệu suất cao và tiết kiệm tài nguyên.
- Cần cân nhắc kỹ lưỡng trước khi sử dụng gRPC cho các ứng dụng web.
- Khi trong phát triển chúng ta nên sử dụng thêm các công cụ hỗ trợ gRPC để đơn giản hóa việc phát triển và gỡ lỗi.
Chúc bạn thành công!
Phạm Trịnh Minh Triết Java Developer |