美文网首页
gRPC远程过程调用之golang

gRPC远程过程调用之golang

作者: 尽情的嘲笑我吧 | 来源:发表于2018-10-14 17:36 被阅读0次

    gRPC是Google出品,支持多种语言,但是国内安装会有点问题,下面整理一下,方便今后配环境的复习。

    安装grpc

    go get google.golang.org/grpc
    

    结果出现了如下错误:

    package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc"(https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
    

    参考 https://blog.csdn.net/cjj198561/article/details/78133193 可以使用如下方式进行安装。

    git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
    git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
    git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
    go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
    git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
     
    cd $GOPATH/src/
    go install google.golang.org/grpc
    

    安装protocal buffer compiler

    https://github.com/google/protobuf/releases
    

    下载后使用源码安装,固定套路为:

    tar -zxvf xxxx.tar.gz
    cd xxxx/
    ./configure
    make
    make install
    

    漫长等待后,就完事了。不过这次还没完,好像是需要将一个环境变量加到path中。

    export LD_LIBRARY_PATH=/usr/local/lib
    

    创建proto文件

    helloworld.proto 放到 $GOPATH/src/helloworld 目录下,方便自己待会的引用。

    syntax = "proto3";
    
    package grpcusage;
    
    service Hello {
        rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    message HelloRequest {
        string Name = 1;
    }
    
    message HelloReply {
        string Message = 1;
    }
    

    然后通过protoc 根据此模板来生成对应的golang的grpc代码

    #格式 protoc --go_out=plugins=grpc:{go代码输出路径} {proto文件}
    protoc --go_out=plugins=grpc:./ ./helloworld.proto
    

    gRPC代码编写

    server.go

    package main
    
    import (
        "golang.org/x/net/context"
        pb "helloworld"
    
        "net"
        "log"
        "google.golang.org/grpc"
        "fmt"
    )
    
    const (
        port = ":50051"
    )
    
    type Server struct {}
    
    func (s *Server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{
            Message: "hello " + in.Name,
        }, nil
    }
    
    func main() {
        conn, err := net.Listen("tcp", port)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println("grpc server listening at: 50051 port")
        server := grpc.NewServer()
        pb.RegisterHelloServer(server, &Server{})
        server.Serve(conn)
    }
    

    client.go

    package main
    
    import (
        "google.golang.org/grpc"
        "log"
        pb "helloworld"
        "os"
        "context"
            "fmt"
    )
    
    const (
        address = "localhost:50051"
        defaultName = "郭璞"
    )
    
    func main()  {
        conn, err := grpc.Dial(address, grpc.WithInsecure())
        if err != nil {
            log.Fatal(err)
        }
        defer conn.Close()
        client := pb.NewHelloClient(conn)
    
        name := defaultName
        if len(os.Args) > 1 {
            name = os.Args[1]
        }
        request, err := client.SayHello(context.Background(), &pb.HelloRequest{Name:name})
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(request.Message)
    }
    
    

    测试服务

    启动server端程序。

    ➜  grpcusage go run server.go
    grpc server listening at: 50051 port
    
    

    启动client程序

    ➜  client go run client.go
    hello 郭璞
    ➜  client
    

    如此便实现了grpc在golang中的简单使用,暂且记录下,以备不时之需。

    相关文章

      网友评论

          本文标题:gRPC远程过程调用之golang

          本文链接:https://www.haomeiwen.com/subject/axhtzftx.html