Giới Thiệu
Trong phần này, mình sẽ cung cấp một cái nhìn sâu sắc hơn về Grpc, cùng với việc phân tích các khái niệm nâng cao hơn, cũng như cơ chế hoạt động của Grpc. Để có thể hiểu rõ hơn nội dung của bài viết này, mình khuyến nghị các bạn nên đọc phần giới thiệu về Grpc ở Phần 1. Khi bạn thử code
lại bằng bất kỳ ngôn ngữ nào, hãy quay lại và tiếp tục đọc nhé.
Hãy đặt tay xuống và bắt đầu code
, điều này sẽ giúp bạn tăng cường khả năng hiểu biết lên gấp 10 lần!
Nội Dung
Tổng Quan Về Quy Trình Hoạt Động Của Grpc
Có rất nhiều bài viết đã trình bày về cách sử dụng Grpc. Vì vậy, hôm nay, mình sẽ giúp các bạn nắm được quy trình chạy của Grpc, từ đâu dữ liệu sẽ đi đến đâu và qua những lớp nào.
Đầu tiên, chúng ta hãy nói về client
, nơi khởi tạo Request dưới dạng struct
. Sau đó, Protobuf
sẽ tiến hành chuyển đổi (serialize) nó thành dạng bytes, và sử dụng giao thức http/2.0
để truyền dữ liệu tới server
. Ở phía server
, quá trình sẽ diễn ra ngược lại, chuyển từ bytes (deserialize) về dạng struct
để đưa vào handler
xử lý, và quá trình phản hồi cũng tương tự.
Có một vài điểm có thể khiến bạn thắc mắc:
Protobuf
là gì? Nó thực sự tối ưu đến mức nào?Http/2.0
là gì? Tại sao không sử dụngHttp/1.0
?
Protocol Buffer
Nếu bạn muốn tìm hiểu cách thức hoạt động của protobuf
và cách nó chuyển đổi từ struct
sang bytes
, hãy đọc tài liệu này: Hướng dẫn mã hóa Protobuf. Tuy nhiên, với trình độ của mình, mình vẫn chưa thể nắm bắt đầy đủ nội dung, nên tạm thời sẽ bỏ qua phần này. Có thể trong tương lai, khi cần, mình sẽ viết một bài chi tiết hơn.
Thay vì chỉ đọc hiểu, mình muốn thử áp dụng nó xem có hiệu quả không 😅
go
package main
import (
protobuf "Btc/go-fundamental/grpc/protobuf/code-gen"
"encoding/json"
"fmt"
)
func main() {
req := &protobuf.Request{
Message: "Hello",
Code: 200,
Status: "OK",
Description: "This is a description",
Metadata: "This is a metadata",
Data: "This is a data, ",
}
grpcBytes := []byte(req.String())
fmt.Println("protobuf len", len(grpcBytes))
jsonBytes, _ := json.Marshal(req)
fmt.Println("json len", len(jsonBytes))
}
plaintext
protobuf len 126
json len 140
Nhìn vào kết quả, mình thấy rõ sự hiệu quả của việc sử dụng Protobuf.
Tiếp theo, hãy đến với Http/2.0
. Phần này sẽ thiên về lý thuyết vì mình vẫn chưa tìm ra cách để làm demo 😅. Mình sẽ chỉ trình bày một vài tính năng của Http/2.0
và có thể sẽ viết lại ở một bài khác.
HTTP/2.0
Http/2.0
cung cấp nhiều tính năng mà Http/1.0
không có. Vậy giao thức mà chúng ta thường sử dụng hàng ngày là gì? Có thể là http/1.0
, http/2.0
, hoặc http/3.0
, nhưng hiếm có trang web nào hiện tại còn sử dụng http/1.0
. Thậm chí, hầu hết mọi người vẫn đang dùng http/2.0
và http/3.0
.
Các tính năng nổi bật giúp phân biệt http/2.0
và http/3.0
với http/1.0
bao gồm:
- Multiplexing: Cho phép gửi nhiều request và response trên cùng một kết nối, giúp tiết kiệm tài nguyên.
- Header Compression: Giúp giảm kích thước của header, điều này sẽ rất hữu ích, đặc biệt khi có nhiều dữ liệu cần phải gửi đi.
- Server Push: Thay vì client phải liên tục gửi request để lấy trạng thái từ server, server có thể chủ động gửi thông tin cần thiết đến client.
Mình đang tìm cách để demo các tính năng này, nhưng có vẻ hơi khó 😅, nên mình rất khuyến khích các bạn tự đọc và tìm hiểu sâu hơn tại: Tìm hiểu về HTTP/2. Bài viết đó viết rất hay và dễ hiểu.
Ngoài ra, mình cũng đã có một demo về tính năng multiplexing
, cho phép tạo ra một kênh giao tiếp giữa client và server trong Grpc. Hy vọng các bạn sẽ để lại nhận xét về kiến thức sau khi đọc bài này nhé! 😁
Repo tham khảo: Github Repo
Lưu ý: Theo kinh nghiệm của mình, khi đọc file .proto
, chú ý từng dòng comment
sẽ giúp bạn hiểu rõ hơn về service, sau đó hãy tìm hiểu từng handler trên server và cách mà client gọi đến các method đó.
Tóm Tắt
Tóm lại, trong phần này, mình đã mở rộng kiến thức về Grpc và khám phá những khái niệm nâng cao. Đừng quên thử nghiệm một đoạn code nhỏ để củng cố kiến thức của bạn nhé, điều này thực sự rất cần thiết!
Reference: Hướng Dẫn Grpc - Medium
source: viblo