美文网首页
gRPC 远程调用基础案例

gRPC 远程调用基础案例

作者: Squall_峰 | 来源:发表于2018-11-11 00:30 被阅读0次

    完整项目路径:cd /Users/squall/go/src/myproject/goGrpc_course


    go语言实现 gRPC远程调用

    HelloServer需求:

    • 服务端:
      创建一个服务,一个接口接收客户端传输过来的用户姓名
      并且返回“Nice to meet you ” + 用户姓名 给客户端
    • 客户端:
      只需要调用接口传输姓名参数给服务端即可

    protobuf定义
    创建一个protobuf package,如:hello;
    在工程目录下创建hello文件夹
    里面创建 protobuf协议文件 hello.proto

    syntax = "proto3";
    package hello;
    
    // The HelloServer service definition.
    service Hello {
        //远程调用接口
        rpc SayHello (Request) returns (Reply) {}
    }
    
    // The request message containing the user's name.
    message Request {
        string name = 1;
    }
    
    // The response message containing the greetings
    message Reply {
        string msg = 1;
    }
    

    在当前文件下,编译 helloServer.proto文件
    protoc --go_out=plugins=grpc:./ *.proto
    得到 hello.pb.go文件

    gRPC-Server

    package main
    import (
        "fmt"
        "net"
        context "golang.org/x/net/context"
        grpc "google.golang.org/grpc"
        pb "./hello"
    )
    
    //1 实现接口
    type HelloService  struct {}
    func (this *HelloService) SayHello(ctx context.Context ,request *pb.Request) (*pb.Reply , error) {
        //接受客户端的调用,输出客户端的姓名并且返回一个结构体
        fmt.Println("Get call , name is :",request.GetName())
        var replyStr string = "Nice to meet you " + request.GetName()
        return &pb.Reply{Msg:replyStr},nil
    }
    
    const (
        Address = ":10080"
    )
    
    func main(){
        //2 开启服务等待客户端连接和调用 
        service := HelloService{}
        ln,err := net.Listen("tcp",Address)
        if err !=nil{
            fmt.Println("Error in listen :",err)
            return
        }
        //函数返回的时候自动关闭服务
        defer ln.Close()
        //创建grpc的服务器
        server := grpc.NewServer()
        pb.RegisterHelloServer(server,&service)
        if err!=nil{
            fmt.Println("Error in register server :",err)
            return
        }
        if err:=server.Serve(ln);err!=nil{
            fmt.Println("Error in Serve:",err)
            return
        }
    
    }
    

    gRPC-Client

    package main
    import(
        fmt "fmt"
        context "golang.org/x/net/context"
        grpc "google.golang.org/grpc"
        pb "./hello"
    )
    
    func main(){
        //1 建立连接
        conn ,err := grpc.Dial("127.0.0.1:10080",grpc.WithInsecure())
        if err!=nil{
            fmt.Println("Error in dial:",err)
            return
        }
        //2 调用rpc接口
        client := pb.NewHelloClient(conn)
        reply,err := client.SayHello(context.Background(),&pb.Request{ Name:"squall"})
        fmt.Println("Get reply :",reply.GetMsg())
    }
    

    运行结果
    先运行 server,在运行 client
    得到以下输出结果

    #服务端输出:
    squall:04_grpc$ ./server
    SayHello to squall
    
    #客户端输出:
    lsquall:04_grpc$ ./client
    Nice to meet you squall
    

    相关文章

      网友评论

          本文标题:gRPC 远程调用基础案例

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