+1

[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 image.png

Đầ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ùng http/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.0http/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.0http/3.0 image.png

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 clientserver 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí