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)
}