• golang使用grpc


    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

    目录结构

    title

    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)
    }
    
    
    僵尸将臣
  • 相关阅读:
    向强大的SVG迈进
    手把手教你写个小程序定时器管理库
    蒲公英 · JELLY技术周刊 Vol.11 Lighthouse 测试报告生成
    ES6语法——let和const
    北京天地益星面经
    JS的数据类型你真的懂了吗
    北京MedPeer凉经
    flex布局语法+实例
    面试官问:你有多少种方式实现三栏布局?
    CSS粘性定位
  • 原文地址:https://www.cnblogs.com/sunshenggang/p/13143396.html
Copyright © 2020-2023  润新知