GO GRPC 安装与测试

安装protoc

  1. 打开地址https://github.com/protocolbuffers/protobuf/releases,根据自身系统找到对应的版本,比如我是win64,则下载 protoc-3.11.2-win64.zip 。
  2. 解压缩到 C:\protoc-3.11.2-win64。
  3. 加入到系统环境变量。
    GO GRPC 安装与测试_第1张图片

安装 protoc-gen-go

  1. 拉取代码go get -u github.com/golang/protobuf/protoc-gen-go,如果能找到protoc-gen-go.exe,则把可执行文件直接复制到 C:\protoc-3.11.2-win64 。
  2. 如果无法找到protoc-gen-go.exe,则可以在下面的目录执行 go build,会生成一个新的protoc-gen-go.exe,同上把可执行文件直接复制到 C:\protoc-3.11.2-win64 。
    GO GRPC 安装与测试_第2张图片

测试

测试结构

GO GRPC 安装与测试_第3张图片

编写helloword.proto

syntax = "proto3";

package hello;

service MyRpc {
    rpc SayHello (HelloRequest) returns (HelloReply) {
    }
}

message firstWrap {
    string name = 1;
    string age = 2;
    secondWrap home = 3;
}

message secondWrap {
    string addr = 1;
    string num = 2;
}

message HelloRequest {
    firstWrap info = 1;
}

message HelloReply {
    string message = 1;
}

解释:

  1. syntax 定义proto的版本。
  2. package 定义生成的*.pb.go所在的包。
  3. service MyRpc 定义了这个 GRPC 的服务名字和里面包含的 SayHello 方法。
  4. firstWrap 和 secondWrap 类似于定义了2个消息体,并且 firstWrap 嵌入了 secondWrap 。
  5. MyRpcRequest 和 MyRpcResponse 定义了请求参数和返回参数的消息体。

生成 helloword.pb.go

进入目录rpct/hello,执行 protoc --go_out=plugins=grpc:. *.proto 会生成 helloword.pb.go。

编写RPC server

// 业务实现方法的容器
type rpcContainer struct{}

func (r *rpcContainer) SayHello(ctx context.Context, req *pb.MyRpcRequest) (*pb.MyRpcResponse, error) {
	resData := fmt.Sprintf("hello %s %s", req.GetInfo().GetName(), req.GetInfo().GetHome().GetNum())
	return &pb.MyRpcResponse{Message: resData}, nil
}

func main() {
	//监听端口
	lis, err := net.Listen("tcp", ":12222")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	//注册rpc
	ser := grpc.NewServer()
	pb.RegisterMyRpcServer(ser, &rpcContainer{})

	//运行
	if err := ser.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

编写RPC client

func main() {
	// 连接rpc服务器
	conn, err := grpc.Dial(":12222", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	client := pb.NewMyRpcClient(conn)
	defer conn.Close()

	//请求数据
	data := &pb.MyRpcRequest{
		Info: &pb.FirstWrap{
			Name: "zhexiao",
			Age:  "yoyo",
			Home: &pb.SecondWrap{
				Addr: "my address",
				Num:  "my number",
			},
		},
	}

	//发送连接数据
	res, err := client.SayHello(context.Background(), data)
	if err != nil {
		log.Fatalf("could not send data: %v", err)
	}

	//打印返回的数据
	fmt.Println(res.Message)
}

你可能感兴趣的:(GoLang)