RPC概念
我的网络通信概念还停留在比较基础的地方, 直觉来说就是发送一个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
目录结构
DEMO
proto 文件
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文件
server文件
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
}
}
client文件
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)
}