返回
Featured image of post gRPC - 高性能分散系統跨語言溝通

gRPC - 高性能分散系統跨語言溝通

用Protocol Buffers定義溝通介面,雙向溝通及身份驗證HTTP/2

Protocol Buffers是Google所提供的跨語言資料結構協定,系統與系統溝通,會有資料型態的不同。
安裝 Protocol Buffers

// v3.12.3
brew install protobuf

專案架構

Project
|-- proto
  |-- myproto.proto
|-- go-grpc
  |-- pro
  |-- server
    |-- main.go
  |-- client
    |-- main.go
  |-- go.mod
|-- node-grpc
  |-- pro
  |-- server
    |-- index.js
  |-- client
    |-- index.js
  |-- pacakge.json

GoLang 環境設定

確認 protobuf 插件

官方文件要細看,這邊有一個比較大的坑,在攥寫這篇文章時,官方的protobuf,go的部分還在整合,可以查看這篇Issues

  • 預設的 protobuf 插件 - protoc-gen-gobrew install protobuf 已安裝
  • 需安裝 protobuf 插件 - protoc-gen-go-grpcbrew install protobuf 安裝

安裝 protoc-gen-go-grpc

git clone https://github.com/grpc/grpc-go
cd cmd/protoc-gen-go-grpc
go install .

如何使用 protoc-gen-go

protoc --go_out=go-grpc \
       --proto_path=proto proto/myproto.proto 

會在 go-grpc/pro 底下產出 myproto.pb.go

如何使用 protoc-gen-go-grpc

protoc --go-grpc_out=go-grpc \
       --proto_path=proto proto/myproto.proto

會在 go-grpc/pro 底下產出 myproto_grpc.pb.go

確認 golang grpc 套件版本 go-grpc/go.mod

module go-grpc

require (
    github.com/golang/protobuf v1.4.2
    google.golang.org/grpc v1.30.0
    google.golang.org/protobuf v1.25.0
)

延伸閱讀:gRPC - ProtoBuf 轉譯後使用 golang 篇


Node 環境設定

知道其實gprc_out 指令相關的Tools要另外安裝,只是要翻找一波就是了…
重點來了,並不是使用 protoc 去產出 gprc file,而是使用npm plugin…。

Github: grpc/grpc-node

官方文件介紹了幾款gRPC的套件,快速篩選一下所需要的包

  • grpc-native-core - 2021 4月 棄用掰 (包含了C++語法)
  • grpc-js - 完全Javascript gRPC包 (完全捨棄C++,目前文檔不足)
  • proto-loader - 可直接閱讀 .proto
  • grpc-tools - 產出gRPC的js檔案,官方範例所使用的插件!!!
  • grpc-health-check - 顧名思義 Health Cheak

以上的套件只好全略過了,直接看官方範例,使用其中一個套件grpc。(2020-07-30 紀錄)

node-grpc/package.json

{
  "name": "node-grpc",
  "version": "1.0.0",
  "description": "learn for grpc",
  "scripts": {
    "proto": "npx grpc_tools_node_protoc -I=../proto ../proto/*.proto --js_out=import_style=commonjs,binary:./pro --grpc_out=./pro"
  },
  "keywords": [
    "gPRC"
  ],
  "author": "Hifounder",
  "license": "ISC",
  "devDependencies": {
    "grpc-tools": "^1.9.1"
  },
  "engines": {
    "node": ">=12.0"
  },
  "dependencies": {
    "grpc": "^1.24.3"
  }
}

NodeJSProto是使用npx grpc_tools_node_protoc 去產生資料的pd.jsgcp_pd.js

延伸閱讀:gRPC - ProtoBuf 轉譯後使用 Node 篇


Web 環境設定

到底什麼是Web環境設定…,我必須先擱置這個項目,簡單瞭解一張圖片即可知道畫面本身。

grpc_web
grpc_web
系統架構溝通來自於不同,一般來說前後端分離用RESTful溝通,這種溝通方式可以切割工作項目以及微服務設計,當全都以gRPC溝通時,狀態會改變成上方圖片中的左方。

文章參考: gRPC-Web发布,REST又要被干掉了?

大概講解連線做法:

[ Web APP ] --- [ Envoy ] --- [ gRPC Server ]

根據上方幾次的經驗就是,沒錯grpc的部分要自己安裝

git clone https://github.com/grpc/grpc-web.git
cd grpc-web
sudo make install-plugin

如何生產pd.jsweb_pd.js

protoc -I=./proto ./proto/*.proto \
  --js_out=import_style=commonjs,binary:. \
  --grpc-web_out=import_style=commonjs,mode=grpcwebtext:.

在如果我沒遇到上方那張圖片的時候,我確實被搞混了,坑很深很多,以web app的部分暫以RESTful方式…。


小結

只能說"複雜",環境的部分就耗掉了我非常多的精氣神,非常不建議對RESTful不熟悉的人直上這個怪物環境,甚至對於網路層的理解需要有一定的知識,還有多程式語言(最少2個)的掌握,web app就先用RESTful,之後再來研究…(菸

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus