[Phần 2] Deep dive Grpc by Golang
Giới thiệu
Phần này mình sẽ giải thích một vài khái niệm nâng cao hơn, và sâu hơn, cũng như tìm hiểu cơ chế cách thức hoạt động của Grpc. Để nắm rõ được nội dung của bài này mình khuyến khích các bạn đọc về phần giới thiệu về Grpc của mình ở Phần 1. Khi nào bạn tự code
lại bằng bất kì ngôn ngữ nào thì hãy quay lại đây và đọc tiếp.
Hãy đặt tay xuống và code
nó giúp bạn x10 sự hiểu biết
Nội dung
Tổng quan về flow của Grpc
Có khá nhiều bài viết nói về cách dùng Grpc rồi, nên hôm nay chủ yếu mình sẽ giúp các bạn nắm được flow chạy của Grpc. Dữ liệu sẽ đi từ đâu về đâu thông qua những layer nào
Đầu tiên hãy nói về client
là nơi khởi tạo Request dưới dạng struct
, sau đó Protobuf
mới chuyển (serialized) nó sang dạng bytes, và dùng protocol http/2.0
để chuyển dữ liệu qua server
. Ở phía server
thì ngược lại từ bytes (deserialized) về dạng struct
để tiếp tục đưa vào handler
để xử lý và quá trình response cũng tương tự.
Có một vài điểm hơi mơ hồ ở đây là:
protobuf
là cái gì? nó có thật sự tối ưu chưa?http/2.0
là cái gì? sao không dùnghttp/1.0
?
Protocol buffer
Nếu thật sự muốn tìm hiểu cách thức vận hành của protobuf
cách nó chuyển từ struct
sang bytes
thì hãy đọc document này https://protobuf.dev/programming-guides/encoding/. OKE nhưng với level của mình thì chưa đủ trình để đọc hiểu nên mình tạm thời bỏ qua phần này. Có thể ở những phần sau khi mình cần lượng kiến thức này mình sẽ viết một bài chi tiết về nó.
OKE thế ở phần này thay vì mình đọc hiểu thì mình thử áp dụng nó, thật sự nó có hiệu quả không 😅
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))
}
protobuf len 126
json len 140
Nhìn vào kết quả cũng đủ thấy sự hiệu quả ha
Tiếp theo đi đến http/2.0
, phần này khá là lý thuyết vì mình cũng chưa nghĩ ra cách code demo như nào 😅. Tạm thời mình chỉ nói sơ một vài tính chất của http/2.0
sau này mình sẽ đào sâu và viết lại ở một bài khác vì mình thấy kiến thức này khá hấp dẫn 😁
HTTP/2.0
Http/2.0
cung cấp một số tính năng mà Http/1.0
không có. Vậy giao thức hiện tại mà chúng ta vẫn thường hay sử dụng hằng ngày là giao thức nào 😅. Tùy vào request
mà sẽ là http/1.0
, http/2.0
và http/3.0
nhưng mà mình vẫn chưa tìm ra thông tin một trang web nào đang dùng http/1.0
😁 đa số là http/2.0
và http/3.0
Toàn h2
, h3
Thì sau khi mình tìm hiểu thì mình thấy có 3 chức năng tạo nên sự khác biệt giữa http/2.0
, http/3.0
với http/1.0
là có khả năng multiplexing
(cho phép gửi nhiều request và response trên 1 connection) nghe giống như stream. Khả năng thứ hai là header compression
nghĩ xem nếu header của bạn có chứa cookie
và phải gửi qua, gửi lại rất nhiều lần thật sự compress
là cần thiết nên mình sẽ không đề cập. Khả năng thứ 3 là server push
giả sử trong một trường hợp client
vừa thực hiện một thao tác và cần status từ server
giải pháp là client
sẻ query liên tục xuống server
(pooling), để giải quyết bài toán này thì server push
là cần thiết để server
có thể gửi status lên cho client
(sau này mình sẽ làm một phần riêng cho phần ứng dụng server push
này 😁).
Mình đang nghĩ cách để demo những tính năng này mà coi bộ hơi khó 😅, nên mình rất khuyến khích các bạn tự mình đọc hiểu và hiểu ha https://web.dev/articles/performance-http2. Mình thấy bài này viết cũng hay nè. Sau này mình có thời gian mình sẽ quay lại đào sâu hơn vào vấn đề này 😅. Các bạn cứ tạm hiểu 3 tính năng trên là đã rất OKE rồi
OKE thì mình cũng có Code demo dựa vào tính multiplexing
cho phép mình tạo một channel giao tiếp giữa client
và server
trong grpc. Trong này có một số kiến thức về grpc
hi vọng bạn nào đọc xong có thể comment lại kiến thức đó 😁😁
Repo: https://github.com/phanquocky/go-fundamental/tree/main/grpc/grpc-tutorial
Chú ý: theo kinh nghiệm của mình thì bạn đọc thẳng vào file .proto
chú ý từng dòng comment
thì bạn sẽ hiểu sơ bộ về service
sau đó mới đi vào đọc từng handler
trên server
và cách client
call method đó
Tóm tắt
Tóm lại ở phần này mình cũng đã mở rộng và đi sâu hơn một chút về grpc
các bạn đừng quên code demo một cái nhỏ nhỏ nhé x10 uy tín đó
Ref: https://medium.com/@lchang1994/deep-dive-grpc-protobuf-http-2-0-74e6295f1d38
All rights reserved