: jank : : 726 : 2020-10-29 08:00 rpc
1.1.安装protobuf:
安装c/c++:yum install gcc yum install gcc-c++ libstdc++-devel
安装protoc通过源码编译安装:
git clone https://github.com/protocolbuffers/protobuf.git--depth=1
通过安装包安装:
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.0/protobuf-all-3.12.0.tar.gz
tar -zxvf ./protobuf-all-3.12.0.tar.gz
cd protobuf-all-3.12.0
./configuremake && make install
1.2.安装protobuf golang 插件
git clone https://github.com/protocolbuffers/protobuf-go.gitcd protobuf/protoc-gen-go && go install
1.3.执行命令生成对应的.pb.go文件:
protoc --go_out=$DST_DIR $SRC_DIR/addressbook.proto #使用grpc用例,
默认方法 protoc ./helloworld.proto --go_out=plugins=grpc:. #使用go grpc 插件
1.4 在 server 端 和 客户端中都引用.pb.go 文件,.pb.go 即protoc自动生成的客户端和服务端交互的媒介。
使用示例流程
//服务端 package main import ( "context" "log" "net" "google.golang.org/grpc" pb "google.golang.org/grpc/examples/helloworld/helloworld" ) const ( port = ":50051" ) // server is used to implement helloworld.GreeterServer. type server struct { pb.UnimplementedGreeterServer } // SayHello implements helloworld.GreeterServer func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { log.Printf("Received: %v", in.GetName()) return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil } func main() { lis, err := net.Listen("tcp", port) //listen a tcp server if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() //新建一个grpc server pb.RegisterGreeterServer(s, &server{}) //注册proto中的服务 if err := s.Serve(lis); err != nil { //开始运行grpc服务 log.Fatalf("failed to serve: %v", err) } } //客户端 package main import ( "context" "log" "os" "time" "google.golang.org/grpc" pb "google.golang.org/grpc/examples/helloworld/helloworld" ) const ( address = "localhost:50051" defaultName = "world" ) func main() { // Set up a connection to the server. conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) // Contact the server and print out its response. name := defaultName ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name}) //use invoke if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Greeting: %s", r.GetMessage()) time.Sleep(time.Hour) }