問題有點多,如果需時太久不需要全答,5.以外的我都可以再花更多時間去找,十分感謝
protoc
的時候都只有用 --go_out
這個 flag,但亦有部份的有加上 --go-grpc_out
,除 _pb.go
之外多了一個 _grpc.pb.go
。請問兩者有甚麼分別,或者說新增的是甚麼實際用途嗎?有實際的例子嗎?在其中一個 repo 有看到相關的討論,但仍然不太理解。
grpc_test/
├── client/
│ └── main.go (package main)
│
├── proto/
│ ├── service.pb.go (package proto)
│ └── service.proto (package proto) &\
│ (option go_package = "proto/proto";)
├── server/
│ └── main.go (package main)
├── go.mod
└── go.sum
網上普遍的 project layout 大概都如上,並且用下面的方式執行
# shell_1
$ cd server & go run main.go
# shell_2
$ cd client & go run main.go
有點不太理解:
// main.go
package main
import "grpc_test/proto"
import "grpc_test/proto"
這句?grpc_test/
?是前面有隱含 $GOPATH
而理解為 $GOPATH/src/grpc_test/{package_name}
嗎?*.proto
中沒有加上 option go_package = ".;proto";
,在 $ protoc
時就會出現protoc-gen-go: unable to determine Go import path for "simple.proto"
Please specify either:
• a "go_package" option in the .proto source file, or
• a "M" argument on the command line.
go_package
最後的字會在 protoc compile 後成為 *.pb.go 的 package;但另外的 "M" argument 是甚麼呢?option go_package = ".;proto";
?非資訊畢業的新鮮人,目前在做 QA 職務內容的掛名軟體工程師 (Go),之後想往後端發展。但是目前感覺個人大多數技能不僅雜,也十分不精:像是會 Python 可卻不會 flask、django;db 的部分大概就是 SELECT * FROM table WHERE ...;
的程度了;git 看完了為你自己學 git 卻感覺只理解到表面,有時還是會卡卡的;Go 只摸到表面。簡單而言就是沒有甚麼項目的經驗,東西一多就不會了。
目前的公司大部分時間都很空閒(也不算太學得到東西),該用空閒時間先自己努力準備,還是該嘗試轉到真的後端位置上?自己準備的速度好像很慢,也沒有甚麼目標導向的壓力;但自身亦總是覺得目前能力很難轉到後端。
如果想要繼續往後端方向發展,該如何/選哪個方向快速準備自己?
Go: gRPC、gin、⋯⋯
CI\CD: docker、k8s
db SQL
Q1 : 除 _pb.go之外多了一個 _grpc.pb.go有何差別?
A1 : _pb.go 是protobuffer的資料型別定義, 打開看會有很多type xx struct這種的定義; _grpc.pb.go則是gRPC service的定義檔案, 打開看會有很多 func xxx (yyy) (zzz), rpc method的參數就會是_pb.go內的
能參考https://developers.google.com/protocol-buffers/docs/style
Q2-1 : Entry point 不是在 main.go 的 folder 嗎,為什麼會成功 import?是因為會讀上一層的目錄嗎?
A2-1 : 因為你go.mod應該就是init成grpc_test, 能打開go.mod確認;
該package底下的第一層folder proto內的proto package, 能看看proto/service.pb.go的package是不是就叫做"proto"
Q2-2 : 該如何理解 import "grpc_test/proto" 這句?
為甚麼要有 grpc_test/?是前面有隱含 $GOPATH 而理解為 $GOPATH/src/grpc_test/{package_name} 嗎?
A2-2 : 這要先理解go module, 小弟以前有一篇很粗淺的介紹
go modules 終於不會再被GOPATH綁死了
Q3-1 : 關於 project layout 與 protobuf 的問題
如果在 *.proto 中沒有加上 option go_package = ".;proto";,在 $ protoc 時就會出現
A3-1 : go_package 或者 protoc gen時給上, --go_opt=M{folder}/{proto path}={go package path}
能參閱 https://developers.google.com/protocol-buffers/docs/reference/go-generated
Q3-2 : 如何理解 option go_package = ".;proto";?
A3-2 : ;前面的.
, 是指說要是有別的proto引用這隻proto, 那麼它們就會使用;
前面的路徑當作go package路徑(慎用)
;後面的則是產出go檔案的package名稱
Q4 : 我想主因是我依然不太清楚 gRPC 可以做到些甚麼
A4 : gRPC大部分場景都是用在企業的系統架構下, 在內網架設出這些gRPC服務作為一些特定功能服務提供; 真的要泛用還是HTTP, HTTPS, RESTful API這些學一學, 進階能學WebSocket做雙向溝通用(聊天室?) 或者學GraphQL
Q5 : db SQL的話
是想成為DBA? 去佈署管理DB; 還是成為使用者
前者的話, MySQL, SQL server的蠻值得深入的, 職缺不少 XD
後者的話要看公司了, 但能使用PostgreSQL玩看看, 了解什麼是MVCC, Lock, ACID, transaction, isolation, race condition, index等等的
超級感謝!學到了很多,很多之前看過的東西也都連結起來!
--go_out=plugins=grpc:.
的話,service 的東西也是有在 *.pb.go
的。所以目的是由原先的單一 *.pb.go
中把 gRPC service
的 method 分割出來到 *_grpc.pb.go
嗎?實際使用方式上也一樣嗎?4 & 5. 如果這樣的話,菜雞如我感覺應該先從 RESTful API 或是 GraphQL 著手?
A4 : gRPC大部分場景都是用在企業的系統架構下, 在內網架設出這些gRPC服務作為一些特定功能服務提供; 真的要泛用還是HTTP, HTTPS, RESTful API這些學一學, 進階能學WebSocket做雙向溝通用(聊天室?) 或者學GraphQL
補充一下,在微服務的架構中,gRPC可以拿來做服務間的溝通。另外查過gRPC也能像websocket一樣做雙向溝通。
RESTful 簡單的說是拿HTTP 1的幾個動詞(GET/POST/DELETE/...)為核心,去表意做資料存取,GraphQL 則是以改進RESTful 查詢缺點產生出來的查詢語言,主要改用HTTP POST去送所有的查詢。
gRPC則使用HTTP/2作為傳輸基礎,擁有類似GraphQL一樣的Schema 設計外,以自訂的service api接口做溝通(溝通方式都定義在_grpc.pb.go中)。因此也沒有必要用HTTP動詞做表意了。
目前網站前後端還是以RESTful和GraphQL為大宗,因為其實是夠用且有歷史包袱。gRPC因為使用HTTP/2要考慮瀏覽器/web server支援,開發難度也比人類可以直接閱讀的JSON等交換格式高,接受度自然會比較小。
akitrash 你看到的文章還是代碼的版本應該是舊版的prtoc-gen-go
能看看是github.com/golang/protobuf/protoc-gen-go
還是新版本的位子google.golang.org/protobuf/cmd/protoc-gen-go
因為那用法是對應舊版本的
其實參考gRPC官網就好https://grpc.io/docs/languages/go/quickstart/