wujingsheng0 2020-06-16
我的网络通信概念还停留在比较基础的地方, 直觉来说就是发送一个get/post请求, 设定一定的参数格式, 这样对方再解析你的数据, 基于此完成通讯.
而rpc则不使用这种显式的通讯方式, 通过proto与生成grpc文件, 里面提供方法, 供client与server通过方法来进行通讯. 简单来说, 就是如果你以前要告诉server你好, 需要发送一个完整网络请求, 但是现在你只需要调用一个hello方法就可以了
go get google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
syntax = "proto3"; package "proto"; service Msg{ rpc SendMsg(RequestMsg) returns(ReplyMsg){} } message RequestMsg{ string message = 1; } message ReplyMsg{ string message = 1; }
编译文件
protoc -I ./ ./msg.proto --go_out=plugins=grpc:./
生成msg.pb.go文件
package main import ( "context" "fmt" pb "grpc_test/proto" "net" "google.golang.org/grpc" ) const ( Address = "127.0.0.1:8801" ) type MsgServer struct{} func (m *MsgServer)SendMsg(ctx content.Context, request *pb.RequestMsg)(*pb.ReplyMsg, error){ fmt.Println("get client info , msg is:", request.Message) res := "test" + request.Message return &pb.MsgReply{Message: res}, nil } func main(){ conn,err:= net.Listen("tcp", Address) if err!=nil{ fmt.Sprintln("tcp失败", err) return } defer conn.Close() service := MsgServer{} server := grpc.NewServer() pb.RegisterMsgServer(server, &service) if err:= server.Serve(conn);err!=nil{ fmt.Spintln("启动失败",err) return } }
package main const ( Address = "127.0.0.1:8801" ) func main(){ conn,err:=grpc.Dial(Address, grpc.WithInsecure()) if err!=nil{ fmt.Println(err) } defer conn.Close() client := pb.NewMsgCient(conn) result,err:= client.SendMsg(context.Background(), &pb.RequestMsg{Messgae:"test message"}) if err:= nil{ fmt.Println(err) } fmt.Println("接受到的数据:", result) }