- 阅读前先了解【protobuf的安装和使用】protobuf的安装使用_M_YBin的博客-CSDN博客protobuf的安装和使用:golang插件、编译、异常处理https://blog.csdn.net/u012455110/article/details/125290669
- 在golang中给.proto文件添加RPC服务(如下图),再次进行编译:
protoc --go_out=./ *.proto
- 发现生产的go文件并没有什么变化,因为protoc编译器并不知道该如何为HelloService服务生成代码。
//默认是proto2 syntax = "proto3"; option go_package="./;pd"; package pd; //定义枚举类型 enum Week { Monday = 0;//枚举值必须从0开始 Turesday = 1; } //定义消息体 message Student { int32 age = 1; //可以不从1开始,但是不能重复,不能使用19000-19999 string name = 2; People p = 3; repeated int32 score = 4;//数组 //枚举 Week w = 5; //联合体 oneof data { string teacher = 6; string class = 7; } } //嵌套消息体 message People { int32 weight = 1; } //添加RPC服务 service learn { rpc English(People) returns (Student); }
- 在protoc-gen-go内部集成了一个grpc的插件,我们可以针对grpc生成代码:
protoc --go_out=plugins=grpc:. *.proto
- 在生成的代码中多了一些类似XXXServiceServer、XXXServiceClient的新类型(如下图)
- 到此,通过protoc编译生成的grpc服务已经完成,但是Golang并没有自带grpc库(自带rpc),需要我们进行安装才能正常使用。
- grpc环境安装
- 安装方法一:
# 官方推荐,但是会出现访问超时,不能正常访问情况 go get -u -v google.golang.org/grpc
- 安装方法二:
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text go get -u github.com/golang/protobuf/{proto,protoc-gen-go} git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto cd $GOPATH/src/ go install google.golang.org/grpc
- 安装方法一:
- grpc的使用
- proto代码
syntax = "proto3"; option go_package="./;pd"; package pd; message Child{ string name = 1; } message Info{ string content = 1; } //定义服务 service SayService{ rpc SayEnglish (Child)returns (Info); }
- server代码
package main import ( "context" "fmt" "google.golang.org/grpc" "microservices/pd" "net" ) type SayServiceServer struct { } func (this *SayServiceServer)SayEnglish(ctx context.Context, child *pd.Child) (*pd.Info, error){ reply := &pd.Info{ Content : child.Name + " Say:Hello World!", } return reply, nil } func main() { //获取grpc服务端对象 grpcServer := grpc.NewServer() //注册grpc服务 pd.RegisterSayServiceServer(grpcServer, new(SayServiceServer)) //设置服务器监听 lis, err := net.Listen("tcp", "127.0.0.1:8800") if err != nil { fmt.Println("net.Listen:", err) } grpcServer.Serve(lis) }
-
client代码
package main import ( "context" "fmt" "google.golang.org/grpc" "microservices/pd" ) func main() { conn, err := grpc.Dial("127.0.0.1:8800", grpc.WithInsecure()) if err != nil{ fmt.Println("grpc.Dial:", err) } defer conn.Close() client := pd.NewSayServiceClient(conn) reply, err := client.SayEnglish(context.Background(), &pd.Child{Name: "lisi"}) if err !=nil{ fmt.Println("client.SayEnglish:", reply) } fmt.Println("reply:", reply) }
-
执行结果:
- proto代码