gRPC遠端過程呼叫之golang
阿新 • • 發佈:2018-12-15
gRPC是Google出品,支援多種語言,但是國內安裝會有點問題,下面整理一下,方便今後配環境的複習。
安裝grpc
go get google.golang.org/grpc
結果出現瞭如下錯誤:
package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc"(https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text go get -u github.com/golang/protobuf/{proto,protoc-gen-go} git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto cd $GOPATH/src/ go install google.golang.org/grpc
安裝protocal buffer compiler
https://github.com/google/protobuf/releases
下載後使用原始碼安裝,固定套路為:
tar -zxvf xxxx.tar.gz
cd xxxx/
./configure
make
make install
漫長等待後,就完事了。不過這次還沒完,好像是需要將一個環境變數加到path中。
export LD_LIBRARY_PATH=/usr/local/lib
建立proto檔案
helloworld.proto
放到 $GOPATH/src/helloworld
目錄下,方便自己待會的引用。
syntax = "proto3"; package grpcusage; service Hello { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string Name = 1; } message HelloReply { string Message = 1; }
然後通過protoc 根據此模板來生成對應的golang的grpc程式碼
#格式 protoc --go_out=plugins=grpc:{go程式碼輸出路徑} {proto檔案}
protoc --go_out=plugins=grpc:./ ./helloworld.proto
gRPC程式碼編寫
server.go
package main import ( "golang.org/x/net/context" pb "helloworld" "net" "log" "google.golang.org/grpc" "fmt" ) const ( port = ":50051" ) type Server struct {} func (s *Server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{ Message: "hello " + in.Name, }, nil } func main() { conn, err := net.Listen("tcp", port) if err != nil { log.Fatal(err) } fmt.Println("grpc server listening at: 50051 port") server := grpc.NewServer() pb.RegisterHelloServer(server, &Server{}) server.Serve(conn) }
client.go
package main
import (
"google.golang.org/grpc"
"log"
pb "helloworld"
"os"
"context"
"fmt"
)
const (
address = "localhost:50051"
defaultName = "郭璞"
)
func main() {
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()
client := pb.NewHelloClient(conn)
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
request, err := client.SayHello(context.Background(), &pb.HelloRequest{Name:name})
if err != nil {
log.Fatal(err)
}
fmt.Println(request.Message)
}
測試服務
啟動server端程式。
➜ grpcusage go run server.go
grpc server listening at: 50051 port
啟動client程式
➜ client go run client.go
hello 郭璞
➜ client
如此便實現了grpc在golang中的簡單使用,暫且記錄下,以備不時之需。