export GO111MODULE=on go get github.com/golang/protobuf/protoc-gen-go export PATH="$PATH:$(go env GOPATH)/bin" Go to src目录下 git clone -b v1.31.0 https://github.com/grpc/grpc-go mkdir grpc-go/examples/myproject/pb
创建proto文件:
syntax = "proto3"; package pb; option go_package = ".;pb"; message HelloRequest { string username = 1; } message HelloResponse { string message = 1; } message AddRequest { int64 first = 1; int64 second = 2; } message AddResponse { int64 result = 3; } message ClientStream { bytes stream = 1; } message ServerStream { bytes stream = 1; } service HelloService { rpc SayHello(HelloRequest) returns (HelloResponse){} rpc Chat(stream ClientStream) returns (stream ServerStream){} rpc Add(AddRequest) returns (AddResponse){} }
protoc --go_out=plugins=grpc:. hello.proto 生成 hello.pb.go文件
编写客户端和服务端程序
mkdir client
package main import ( "context" "fmt" "io" "time" pb "google.golang.org/grpc/examples/myproject/pb" "google.golang.org/grpc" ) func main() { conn, err := grpc.Dial("localhost:6001", grpc.WithInsecure()) if err != nil { fmt.Println(err.Error()) return } defer conn.Close() c := pb.NewHelloServiceClient(conn) r, err := c.Add(context.Background(), &pb.AddRequest{First: 88, Second: 88}) if err != nil { fmt.Println(err.Error()) return } fmt.Println(r.Result) // chat chatClilent, e := c.Chat(context.Background()) if e != nil { fmt.Println(e.Error()) return } go func() { for { stream, e := chatClilent.Recv() if e == io.EOF { fmt.Println("EOF") return } if e != nil { fmt.Println("cuowu") return } fmt.Println("receive from server:", stream.Stream) } }() chatClilent.Send(&pb.ClientStream{ Stream: newBytes(10, 9, 8, 7), }) select { case <-time.After(20 * time.Second): } } func newBytes(a ...byte) []byte { return a }
mkdir server
package main import ( "context" "fmt" "io" "net" pb "google.golang.org/grpc/examples/myproject/pb" "google.golang.org/grpc" ) type HelloService struct { } func (hs HelloService) Add(ctx context.Context, in *pb.AddRequest) (*pb.AddResponse, error) { return &pb.AddResponse{Result: in.First + in.Second}, nil } func (hs *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) { return &pb.HelloResponse{Message: fmt.Sprintf("你好,%s", req.Username)}, nil } func (hs *HelloService) Chat(conn pb.HelloService_ChatServer) error { for { stream, err := conn.Recv() if err == io.EOF { fmt.Println("EOF") return nil } if err != nil { fmt.Println(err.Error()) return err } fmt.Println("receive from client:", stream.Stream) conn.Send(&pb.ServerStream{ Stream: newBytes(1, 2, 3, 4, 5), }) // 关闭连接 // return nil } return nil } func main() { lis, err := net.Listen("tcp", ":6001") if err != nil { fmt.Println(err.Error()) return } s := grpc.NewServer() pb.RegisterHelloServiceServer(s, &HelloService{}) s.Serve(lis) } func newBytes(a ...byte) []byte { return a }