• go grpc入门


    安装go

    //下载
    wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
    //解压
    tar -zxvf go1.13.4.linux-amd64.tar.gz
    //设置环境变量
    export GOPATH=/root/go export PATH=$PATH:/root/go/bin
    //检测是否成功
    go version

    安装go grpc

    go get google.golang.org/grpc //使用 grpc SDK
    https://github.com/protocolbuffers/protobuf/releases/ 找到合适的protoc编译器下载 并将bin目录下的protoc移动到/usr/bin/目录下
    protoc --version //可以查看版本
    go get -u github.com/golang/protobuf/protoc-gen-go //安装protoc go插件

    protobuf文件定义

    syntax = "proto3";
    package proto;
    option go_package ="proto/proto";
    
    message Members {
        repeated Member ss = 1;
    }
    
    message Member {
        string id = 1;
        string name = 2;
    }
    
    message Empty {
    
    }
    
    service User {
      rpc Users(Empty) returns (stream Members) {};
    }

    编译proto文件

    protoc --go_out=plugins=grpc:. ./service.proto

     

    server端代码

    package grpc
    
    import (
        "log"
        "awesomeProject/grpc/proto/proto"//编译protobuf文件生成的pb.go所在的包
        "net"
        "google.golang.org/grpc"
        "math"
    )
    
    type server struct {}
    
    func (s *server) Users(in *proto.Empty, out proto.User_UsersServer) error {
        var err error
        list := proto.Members{}
        for i := 0; i < 5; i++ {
            feature := proto.Member{
                Id:   "123",
                Name: "test",
            }
            list.Ss = append(list.Ss, &feature)
        }
        err = out.Send(&list)
        return err
    }
    
    func RunServer() error {
        sock, err := net.Listen("tcp", "127.0.0.1:9090")
        if err != nil {
            return err
        }
    
        var options = []grpc.ServerOption{
            grpc.MaxRecvMsgSize(math.MaxInt32),
            grpc.MaxSendMsgSize(1073741824),
        }
        s := grpc.NewServer(options...)
    
        myServer := &server{}
    
        proto.RegisterUserServer(s, myServer)
        if err != nil {
            return err
        }
    
        if err := s.Serve(sock); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }
        return nil
    }

    client端代码

    package grpc
    
    import (
        "log"
        "awesomeProject/grpc/proto/proto"//编译protobuf文件生成pb.go所在的包
        "google.golang.org/grpc"
        "fmt"
        "time"
        "context"
    )
    
    
    func RunClient() error {
        conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithInsecure())
        // 如果要增加 Recv 可以接受的一个消息的数据量,必须增加 grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(100000000))
        if err != nil {
            log.Fatalf("fail to dial: %v", err)
            return err
        }
        defer conn.Close()
    
        client := proto.NewUserClient(conn)
    
        ctx, cancel := context.WithTimeout(context.Background(), 10000*time.Second)
        defer cancel()
    
        stream, err := client.Users(ctx, &proto.Empty{})
    
        for {
            data, err := stream.Recv()
            if err != nil {
                //fmt.Printf("error %v", err)
                return err
            }
            for i := 0;i < len(data.Ss);i++ {
                fmt.Println( data.Ss[i].GetId())
            }
        }
        return err
    }

     mac下编译linux可执行文件

    GOOS=linux GOARCH=amd64 go build  -o server main.go 
  • 相关阅读:
    svn: E120106: ra_serf: The server sent a truncated HTTP response body.
    HTTP method POST is not supported by this URL解决
    TinyOS文件结构清单解析
    Crush Course 神话学笔记
    Django 入门
    Crush Course 心理学笔记
    网络相关知识汇总链接
    9.21 小程序开发培训讲座
    论文简读之LAIA
    Android studio 的那些坑
  • 原文地址:https://www.cnblogs.com/godehi/p/14651532.html
Copyright © 2020-2023  润新知