目前正在學習後端有關概念, 瞭解到了grpc. 本文將簡述一個簡單demo的搭建.
個人網絡通訊概念還停留在比較基礎的地方, 直覺來講就是發送一個get/post請求, 設定必定的參數格式, 這樣對方再解析你的數據, 基於此完成通信.
而rpc則不使用這種顯式的通信方式, 經過proto與生成grpc文件, 裏面提供方法, 供client與server經過方法來進行通信. 簡單來講, 就是若是你之前要告訴server你好, 須要發送一個完整網絡請求, 可是如今你只須要調用一個hello方法就能夠了git
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
export PATH=$PATH:$GOPATH/bin
grpc_test/ |-- client | `-- client.go |-- proto | |-- greeter.pb.go | `-- greeter.proto `-- server `-- server.go
syntax = "proto3"; package proto; service Hello { rpc Hello (Request) returns (Response) {} } message Request { string Name = 1; } message Response { string Msg = 1; }
很是簡單, 提供了request, response對象, 而且提供了hello方法.github
執行protoc -I ./ ./greeter.proto --go_out=plugins=grpc:../proto/
前面的./與./greeter.proto是上面的proto文件的文件夾以及文件, 後面的../proto是輸出目錄, 運行成功的時候, 會生成greeter.pb.go
文件. 有興趣能夠詳細去讀裏面的代碼.golang
package main import ( "fmt" "net" "context" grpc "google.golang.org/grpc" proto "grpc_test/proto" // 引用剛纔生成grpc代碼 ) const( Address = "127.0.0.1:8801" // 監聽的端口 ) type Greeter struct {} // 實現proto中定義的hello方法 func (greeter *Greeter) Hello(ctx context.Context, request *proto.Request) (*proto.Response, error){ fmt.Println("get client info, name is: ", request.Name) response_msg := "Hello " + request.Name return &proto.Response{Msg:response_msg}, nil } func main(){ service := Greeter{} conn, err := net.Listen("tcp", Address) // tcp監聽端口 if err != nil{ fmt.Println(err) return } fmt.Println("tcp listening...") defer conn.Close() server := grpc.NewServer() proto.RegisterHelloServer(server, &service) // 將tcp服務於grpc進行綁定 fmt.Println("server serve.....") if err := server.Serve(conn); err != nil{ fmt.Println(err) return } }
package main import ( "context" "fmt" grpc "google.golang.org/grpc" proto "grpc_test/proto" //引用grpc代碼 ) const( Address = "127.0.0.1:8801" // 服務監聽的端口 ) func main() { conn, err := grpc.Dial(Address, grpc.WithInsecure()) if err != nil{ fmt.Println(err) } defer conn.Close() client := proto.NewHelloClient(conn) // 自動生成方法, 由於proto文件中service的名字是hello name := "jhonsmith" result, err := client.Hello(context.Background(), &proto.Request{Name:name}) // 調用grpc方法, 對服務端進行通信 if err != nil{ fmt.Println(err) } fmt.Println("I see, u see. I say ", name, "u say ", result.Msg) }
終わり。後端