下載grpc包
go get google.golang.org/grpc
下載protoc命令包:https://github.com/protocolbuffers/protobuf/releases荆责,隨便安裝在那個路徑都行,把protoc.exe文件的路徑放在系統(tǒng)環(huán)境變量上亚脆,這樣在IDE的控制臺才能執(zhí)行protoc命令做院。
安裝依賴項
- 1 代碼生成工具: protoc-gen-go
- 2 由于前面已經(jīng)安裝grpc包了,這里就不用go get命令濒持,直接go install 安裝就行键耕。
go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
上面步驟做完后,會在GOPATH目錄下生成2個文件
創(chuàng)建一個 models.proto文件
syntax="proto3";
package grpc;
option go_package = ".;grpc";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
生成bp.go文件 '.' 代表當下文件
控制臺執(zhí)行命令 :
protoc --go_out=. *.proto
protoc --go-grpc_out=. *.proto
protoc 參數(shù)解析
- 1 protoc --go_out=path field (path 為輸出的目錄柑营,field 為要解析的proto文件)
- 2 message 是protobuf最基本的數(shù)據(jù)單元屈雄,類似go里的結構體的存在.
- 3 service 定義服務處理函數(shù)的
service Search{
rpc SayHello (HelloRequest) returns (HelloReply);
}
Demo 示例
- 1 服務端
import (
"context"
grpcdemo "google.golang.org/grpc"
"net"
)
type Server struct{}
func (s *Server) SayHello(ctx context.Context, request *HelloRequest) (*HelloReply, error) {
res := &HelloReply{
Message: "hello___" + request.Name,
}
return res, nil
}
func main() {
g := grpcdemo.NewServer()
RegisterGreeterServer(g, &Server{})
lis, err := net.Listen("tcp", "127.0.0.1:8888")
if err != nil {
panic("監(jiān)聽錯誤:" + err.Error())
}
err = g.Serve(lis)
if err != nil {
panic("啟動錯誤:" + err.Error())
}
}
- 2 客戶端
func clientRpc(body map[string]string) (*HelloReply, error) {
conn, err := grpc.Dial("127.0.0.1:8888", grpc.WithInsecure())
if err != nil {
return nil, err
}
defer conn.Close()
rpc := NewGreeterClient(conn)
response, err := rpc.SayHello(context.Background(), &HelloRequest{Name: body["name"]})
if err != nil {
return nil, err
}
return response, nil
}
func main() {
body := make(map[string]string)
body["name"] = "紅樓夢~"
response, err := clientRpc(body)
if err != nil {
fmt.Println("rpc調用失敗:", err)
return
}
fmt.Println("服務端返回的響應__:", response.Message)
}
-
3 啟動服務端后再啟動客戶端代碼:
版本包的坑
1 github.com/golang/protobuf/protoc-gen-go 舊版本包
2 google.golang.org/protobuf/cmd/protoc-gen-go 谷歌接管后的新包
3 它們之間生成的命令行是不一樣的,生成后的文件也不一樣
4 protoc --go_out=plugins=grpc:. helloworld.proto 這個命令是github版本包的生成命令
5 如果報"protoc-gen-go-grpc: Plugin failed with status code 1." 該命令不是本包的命令官套,是由于前面 go install 的時候沒有安裝好依賴項!
在proto文件里的message每個字段都有唯一的編號標識符
- 1 【1-15】范圍內只占用一個字節(jié)
- 2 【16-2047】之內的標識符占用2個字節(jié)
- 3 更多細節(jié)請看官網(wǎng)文檔:https://developers.google.com/protocol-buffers/docs/proto3#simple