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

目录结构

golang使用grpc

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

分类:

技术点:

相关文章: