go运行第一个gRPC程序
装置插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
配置环境变量
将%GOPATH%\bin增加到Path中
创立我的项目
我的项目构造
├─practice│ │ go.mod│ │ go.sum│ ││ ├─client│ │ ├─sample_client│ │ │ client.go│ ││ ├─proto│ │ │ helloworld.proto│ ││ └─server│ ├─simple_server│ │ server.go│
编辑helloword.proto
syntax = "proto3";package proto; // 包名option go_package = '/grpc/service'; // 指定生成的go代码所寄存的门路,不必提前创立service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {}}message HelloRequest { string name = 1;}message HelloReply { string message = 1;}
生成go代码
# 进入寄存.proto门路下cd proto# 生成代码protoc --go_out=. --go-grpc_out=. *.proto# 最初一个参数为源文件
生成后的目录构造
├─practice│ │ go.mod│ │ go.sum│ ││ ├─client│ │ ├─sample_client│ │ │ client.go│ ││ ├─proto│ │ │ helloworld.proto│ │ ││ │ └─grpc│ │ └─service│ │ helloworld.pb.go│ │ helloworld_grpc.pb.go│ ││ └─server│ ├─simple_server│ │ server.go│
编辑client.go
package mainimport ( "context" "flag" "google.golang.org/grpc" "log" pb "practice/proto/grpc/service" "time")const ( defaultName = "world")var ( addr = flag.String("addr", "localhost:50051", "the address to connect to") name = flag.String("name", defaultName, "Name to greet"))func main() { flag.Parse() // 建设连贯 conn, err := grpc.Dial(*addr, grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() // 实例化client c := pb.NewGreeterClient(conn) // 调用rpc,期待同步响应 ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Greeting: %s", r.GetMessage())}
server.go
package mainimport ( "context" "flag" "fmt" "google.golang.org/grpc" "log" "net" pb "practice/proto/grpc/service")var ( port = flag.Int("port", 50051, "The server port"))// server is used to implement helloworld.GreeterServer.type server struct { pb.UnimplementedGreeterServer}func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello" + in.GetName()}, nil}func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello Again " + in.GetName()}, nil}func main() { flag.Parse() // 监听端口 lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", *port)) if err != nil { log.Fatalf("failed to listen: %v", err) } // 实例化server s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) log.Printf("server listening at %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) }}
运行
启动服务端
E:\go_workplace\src\practice>go run server/simple_server/server.go2021/11/29 19:22:27 server listening at 127.0.0.1:50051
启动客户端
E:\go_workplace\src\practice>go run client/sample_client/client.go --name cui2021/11/29 19:23:25 Greeting: Hellocui