Tiếp nối series về DDD, tôi xin phép được giới thiệu với bạn đọc một series nữa, lần này không phải về DDD mà là về Micro-service.
Trong series này tôi muốn chia sẻ với bạn đọc cách xây dựng micro-service bằng giao thức gRPC thông qua một project nho nhỏ. Về cơ bản series sẽ gồm các bài viết như sau:
Bài 1. Tổng quan về gRPC.
Bài 2. Giới thiệu về cấu trúc project.
Bài 3,4,5. Triển khai các services.
Bài 6. Tổng kết.
Rất mong được bạn đọc đón nhận nồng nhiệt. Không chần chừ nữa, sau đây tôi sẽ đi vào bài đầu tiên đó là "Tổng quan về gRPC".
RPC là gì?
RPC là tên viết tắt của "Remote Procedure Call" - lời gọi thủ tục từ xa. Có thể hiểu nó giống như việc gọi một hàm của server từ phía client.
RPC chỉ sử dụng POST và GET method. Tương tác giữa client và server sẽ thông qua Server-side Interface
và Client-side stub
.
Khác biệt giữa RPC và REST
REST được thiết kế hướng "tài nguyên" - tức là mọi thao tác của REST (thêm mới, sửa, xoá) đều tác động lên tài nguyên (resource).
Và đương nhiên kết quả mà REST sẽ trả về đó là "resource"
Còn RPC sẽ chỉ thực hiện việc gọi một hàm với 1 chức năng nhất định của phía server và dữ liệu RPC trả về chỉ tuần tuý là giá trị trả về của hàm phía server.
Lấy ví dụ:
- Với REST ta có:
- GET
/posts/1
- POST
/posts/1
- PUT
/posts/1
- Với RPC ta có:
/posts/1/calculate_score
/posts/1/average_score
Trong thực tế thì RPC sẽ được triển khai dựa trên REST nên ta có khái niệm RPC-base APIs.
gRPC là gì? Nó có gì khác biệt
gRPC là một open source remote procedure call (RPC) framework có thể chạy ở bất kì đâu. Nó cho phép client và server app có thể tương tác một cách "minh bạch".
gRPC là một framework được phát triển bởi Google. Giống như các hệ thống RPCm gRPC cũng định nghĩa interface - bản thân interface này cũng định nghĩa các methods mà client có thể truy cập.
Mặc định gRPC sử dụng protocol buffers như một Interface Definition Language
& data exchange format. gRPC hỗ trợ các format như JSON.
File Interface Defintiion Language
trong gRPC được định nghĩa bởi file có extension là .prot
.
Chúng ta hoàn toàn có thể quản lí file này dựa theo version.
Các loại RPC mà gRPC hỗ trợ gồm:
- Unary: Single request từ client - Single response từ server.
- Server streaming: Single request từ client, stream messages trả về từ server.
- Client Streaming: Stream messages từ client và trả về single response từ server.
- Bidirectional streaming: Cả client và server đều gửi stream messages.
gRPC được áp dụng trong thực tế như thế nào
Với hệ thống microservices với nhiều service liên lạc với nhau, việc sử dụng REST sẽ phát sinh một vấn đề đó là encoding/ decoding dữ liệu (JSON data), còn RPC thì không cần phải encoding hay decoding dữ liệu.
Do đó gRPC thường được sử dụng trong các hệ thống microservice cần chịu tải lớn.
Hơn nữa gRPC được xây dựng trên nền tảng HTTP/2 hỗ trợ stream nên nó sẽ thích hợp cho việc stream event trong event sourcing, việc HTTP/2 sử dụng binary data thay vì text cũng sẽ làm tăng tốc độ cho việc liên lạc giữa các services với nhau.
HTTP/2 sử dụng một kiểu dữ liệu do Google phát minh đó là Protobuf - Protocol Buffer
, tốc độ encoding/ decoding của nó khi so với text hay JSON sẽ như sau:
Một chú ý khác đó là gRPC nên dùng cho giao tiếp giữa backend - backend
thay vì backend-frontend
do việc giao tiếp stateful giữa backend-frontend
sẽ gây ra các vấn đề "scale tải" hoặc "HOL"
Kết phần 1
Trong phần này tôi đã trình bày với bạn đọc:
- Khái niệm về RPC
- Sự khác biệt giữa RPC và REST
- Tổng quan về gRPC framework
- Áp dụng gRPC trong thực tế
Hi vọng bạn đọc đã hiểu được phần nào về gRPC để có thể tiếp tục theo dõi các phần tiếp theo trong series lần này. Hẹn gặp lại.