iT邦幫忙

1

gRPC 與 職涯問題

  • 分享至 

  • xImage

問題有點多,如果需時太久不需要全答,5.以外的我都可以再花更多時間去找,十分感謝


  1. 網上看到的大多數的教程在用 protoc 的時候都只有用 --go_out 這個 flag,但亦有部份的有加上 --go-grpc_out,除 _pb.go 之外多了一個 _grpc.pb.go。請問兩者有甚麼分別,或者說新增的是甚麼實際用途嗎?有實際的例子嗎?

在其中一個 repo 有看到相關的討論,但仍然不太理解。


  1. project layout
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"
  • Entry point 不是在 main.go 的 folder 嗎,為什麼會成功 import?是因為會讀上一層的目錄嗎?
  • 該如何理解 import "grpc_test/proto" 這句?
    為甚麼要有 grpc_test/?是前面有隱含 $GOPATH 而理解為 $GOPATH/src/grpc_test/{package_name} 嗎?

  1. 關於 project layout 與 protobuf 的問題
    如果在 *.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";

  1. 如果想要做一些個人 side project,希望可以用作豐富一下 GitHub。請問大家有題材上的建議嗎(我想主因是我依然不太清楚 gRPC 可以做到些甚麼),目前在寫一個簡單的 chatroom。

  1. 職涯

非資訊畢業的新鮮人,目前在做 QA 職務內容的掛名軟體工程師 (Go),之後想往後端發展。但是目前感覺個人大多數技能不僅雜,也十分不精:像是會 Python 可卻不會 flask、django;db 的部分大概就是 SELECT * FROM table WHERE ...; 的程度了;git 看完了為你自己學 git 卻感覺只理解到表面,有時還是會卡卡的;Go 只摸到表面。簡單而言就是沒有甚麼項目的經驗,東西一多就不會了。

目前的公司大部分時間都很空閒(也不算太學得到東西),該用空閒時間先自己努力準備,還是該嘗試轉到真的後端位置上?自己準備的速度好像很慢,也沒有甚麼目標導向的壓力;但自身亦總是覺得目前能力很難轉到後端。

如果想要繼續往後端方向發展,該如何/選哪個方向快速準備自己?
Go: gRPC、gin、⋯⋯
CI\CD: docker、k8s
db SQL

powerc iT邦研究生 5 級 ‧ 2023-02-04 09:35:55 檢舉
第五點看起來是,部分工具、語言在基礎上有了,缺乏實務經驗而已。像是你說python的網頁框架、git的應用(在團隊中就會比較有體會?),以及DB可能在大型資料庫中會需要管理、設定的部分。
自己沒目標的話,就找你的主管要目標(意思是問問看能不能參與開發案之類的)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
雷N
iT邦研究生 1 級 ‧ 2023-02-03 21:18:31
最佳解答

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等等的

akitrash iT邦新手 5 級 ‧ 2023-02-04 02:05:58 檢舉

超級感謝!學到了很多,很多之前看過的東西也都連結起來!

  1. 看到如果只用 --go_out=plugins=grpc:. 的話,service 的東西也是有在 *.pb.go 的。所以目的是由原先的單一 *.pb.go 中把 gRPC service 的 method 分割出來到 *_grpc.pb.go 嗎?實際使用方式上也一樣嗎?

4 & 5. 如果這樣的話,菜雞如我感覺應該先從 RESTful API 或是 GraphQL 著手?

  1. 很多新的東西需要再去了解,有很多扇門 xd,感恩
froce iT邦大師 1 級 ‧ 2023-02-04 09:33:14 檢舉

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等交換格式高,接受度自然會比較小。

雷N iT邦研究生 1 級 ‧ 2023-02-04 16:57:26 檢舉

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/

我要發表回答

立即登入回答