Hiện tại thì mình thấy 1 số product họ sẽ endcode Json Data sang Binary Data xong gửi đi,
và họ dụng proto buf để support cho việc endcode.
1) Setup gRPC + Golang environment.
Đầu tiên bạn cần setup môi trường:
Dưới này là slide:
https://docs.google.com/presentation/d/19zCPlujW2NIvUzG5NZFKqCIJmfyINoTasNtpsFSiQKo/edit#slide=id.p
2) Coding
2.1) Create proto file.
mình tạo file message.proto

syntax = "proto3";
package nim;
option go_package="./nim-proto";
message YourMessage {
string example_field = 1;
int32 another_field = 2;
// Add other fields as needed
}
Sau đó mình chạy lệnh:
protoc --go_out=. message.proto go get -u google.golang.org/protobuf/cmd/protoc-gen-go protoc --go_out=. message.proto
Lúc này nó sẽ tạo ra file:

Bạn tạo 1 file main.go
package main
import (
"fmt"
"google.golang.org/protobuf/proto"
"log"
"proto-binary-msg/nim-proto" // replace with actual path
)
func main() {
// Create an original message with a larger field value
msg := &nim_proto.YourMessage{
ExampleField: "This is a longer string that will make the original message larger",
AnotherField: 123,
}
// Serialize to binary
binaryData, err := proto.Marshal(msg)
if err != nil {
log.Fatalf("Failed to encode message: %v", err)
}
// Calculate the size of the original message
originalMessageSize := proto.Size(msg)
fmt.Printf("Original Message: %+v\n", msg)
fmt.Println("Size of Original Message: ", originalMessageSize)
// Print the binary data (as a byte slice)
fmt.Println("Binary Data: ", binaryData)
binaryDataSize := len(binaryData)
fmt.Println("Size of Binary Data: ", binaryDataSize)
// Check if binary data size is smaller than original message size
if binaryDataSize < originalMessageSize {
fmt.Println("Binary Data is smaller than Original Message")
} else if binaryDataSize > originalMessageSize {
fmt.Println("Binary Data is larger than Original Message")
} else {
fmt.Println("Binary Data size is equal to Original Message size")
}
// Prepare a buffer for the decoded data
msgDecoded := &nim_proto.YourMessage{}
// Unmarshal the binary data into the protobuf message struct
err = proto.Unmarshal(binaryData, msgDecoded)
if err != nil {
log.Fatalf("Failed to decode message: %v", err)
}
// Print the decoded message
fmt.Printf("Decoded Message: %+v\n", msgDecoded)
}
Và đây là result của