1、环境搭建 官网地址

# 下载protobuf编译程序,解压下载的文件,将里面的protoc.exe文件放置在$GOPATH/bin目录下
https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0 

# 安装protobuf的go语言插件
go get  -v -u github.com/golang/protobuf/proto
go get google.golang.org/grpc
# 这个命令会在你的$GOPATH/bin目录下生成protoc-gen-go.exe
go get  -v -u github.com/golang/protobuf/protoc-gen-go

2 在项目的根目录下创建一个pb目录,在pb目录中创建hello.proto文件 proto3 语法参考

syntax = "proto3";
// 注意此处写法,
// ./ 表示生成的go文件的存放地址,会自动生成目录的。
// pb 表示生成的go文件所属的包名
option go_package = "./;pb";

message Request {
  string name = 1;
}

message Response {
  string msg = 1;
}

service HelloServer {
  rpc Say (Request) returns (Response){};
}

打开terminal工具编译hello.proto文件,使之生成hello.pb.go文件

# 进入pb目录执行
protoc --go_out=plugins=grpc:./ hello.proto

如果报如下错误,就是没有申明 option go_package = "./;pb";,这个问题困扰了我很久

protoc-gen-go: unable to determine Go import path for "hello.proto"

Please specify either:
        • a "go_package" option in the .proto source file, or
        • a "M" argument on the command line.

See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.

--go_out: protoc-gen-go: Plugin failed with status code 1.

3、创建服务端,在项目根目录下创建server.go文件

package main

import (
	"context"
	"google.golang.org/grpc"
	pb "grpc.zozoo.net/pb"
	"log"
	"net"
)

type HelloServer struct {

}

func (h *HelloServer) Say(ctx context.Context, req *pb.Request) (rsp *pb.Response,err error) {
	rsp = new(pb.Response)
	rsp.Msg = "你好 "+req.Name
	return rsp,nil
}

func NewHelloServer() *HelloServer {
	return &HelloServer{}
}

func main() {
	listen,err := net.Listen("tcp","127.0.0.1:8080")
	if err != nil {
		log.Fatal(err)
	}

	s := grpc.NewServer()

	pb.RegisterHelloServerServer(s,NewHelloServer())

	log.Println("服务注册成功,等待连接...")
	s.Serve(listen)
}

启动服务端,打印如下信息表示成功
go run server.go
E:\gocode\src\grpc.zozoo.net>go run server.go
2021/04/28 23:49:22 服务注册成功,等待连接…

4、创建客户端服务,在项目根目录下创建client.go文件

package main

import (
	"context"
	"google.golang.org/grpc"
	pb "grpc.zozoo.net/pb"
	"log"
)

func main() {
	//连接
	conn,err := grpc.Dial("127.0.0.1:8080",grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}

	//初始化客户端
	c := pb.NewHelloServerClient(conn)

	//调用方法
	rsp,err := c.Say(context.TODO(),&pb.Request{
		Name: "gangan",
	})

	if err != nil {
		log.Fatal(err)
	}

	log.Println(rsp.Msg)
}

启动客户端,打印如下信息表示成功
go run client.go
E:\gocode\src\grpc.zozoo.net>go run client.go
2021/04/28 23:49:28 你好 gangan

目录结

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐