前言
記錄下使用grpc-gateway來支持grpc服務的http請求,網上大都是引入google/api/annotations.proto的方式,懶的改每個proto文件,在grpc-gateway的github里看到了另一種方式,不用改proto文件,適合~
原理
grpc-gateway的原理我就不贅述了,大概邏輯是http的請求過來,grpc-gateway接受請求,再生成grpc的client,去請求grpc的server端;做了層轉化
所以是啟了2個服務,一個http服務,一個grpc服務
如圖:
安裝grpc-gateway的相關包
$ go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
$ go get google.golang.org/protobuf/cmd/protoc-gen-go
$ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
protoc生成相關編譯文件
用protoc編譯proto文件的命令,每個proto文件分別生成pb.go和pb.gw.go的后綴文件,即相關的grpc和網關的
protoc -I ../proto目錄 \
--go_out=plugins=grpc:../編譯生成的文件目錄 \
--grpc-gateway_out ../編譯生成的文件目錄 \
--grpc-gateway_opt logtostderr=true \
--grpc-gateway_opt paths=source_relative \
--grpc-gateway_opt generate_unbound_methods=true \
../proto目錄/*.proto
測試請求http
這里是請求test包的Service服務的Hello方法 ;必須是Post請求,因為看pb.gw.go里默認的都是POST方法請求,不然會提示錯誤"Method Not Allowed"
curl -XPOST http://localhost:8081/test.Service/Hello