美文网首页go
grpc基本使用

grpc基本使用

作者: lesterhnu | 来源:发表于2021-03-23 23:54 被阅读0次

    前言

    grpc 是一种基于 HTTP/2 设计的RPC框架,采用protobuf作为idl (交互式数据语言Interactive Data Language) 本篇简单介绍下grpc的使用,并制作一个demo

    一、安装protoc

    $ go get -u github.com/golang/protobuf
    
    $ go get -u github.com/golang/protobuf/protoc-gen-go
    
    • 确保protoc protoc-gen-go安装成功,可到$GOPATH/bin/ 目录下查看

    二、项目创建

    1.创建目录结构

    hello
    ├── client
    │ └── client.go
    └── server
    └── server.go
    └── proto
    └── hello.proto
    └── hello.pb.go # 通过protoc命令生成
    ├── go.mod

    编写proto文件
    
    // hello.proto
    syntax = "proto3";
    service HelloService {
        rpc SayHello(SayHelloRequest)returns(SayHelloResponse){}
    }
    message SayHelloRequest{
        string name = 1;
    }
    message SayHelloResponse {
        string msg = 1;
    }
    
    生成pb文件  proto/hello.pb.go
    
    $ protoc --go_out=plugins=grpc:./ ./proto/hello.proto
    

    2 编写服务端代码

    // server/server.go
    package main
    
    import (
        "context"
        "fmt"
        "google.golang.org/grpc"
        hello "hello/proto"
        "log"
        "net"
    )
    
    type HelloServer struct {
    }
    
    func (h *HelloServer) SayHello(ctx context.Context, request *hello.SayHelloRequest) (*hello.SayHelloResponse, error) {
        name := request.Name
        fmt.Printf("receive name : %s", name)
        msg := fmt.Sprintf("hello, %s", name)
        return &hello.SayHelloResponse{Msg: msg}, nil
    }
    func main() {
        server  := grpc.NewServer() // 创建gRPC Server 对象
        // 将HelloService 注册到gRPC Server 的内部注册中心;接收到请求时,通过内部的服务发现,发现该服务的端口并转接进行逻辑处理
        hello.RegisterHelloServiceServer(server,&HelloServer{})
        // 创建listen,监听tcp端口
        lis, err := net.Listen("tcp", ":8080")
        if err != nil {
            log.Fatalf("failed to listen:%+v", err)
        }
        if err := server .Serve(lis); err != nil {
            log.Fatalf("err %+v", err)
        }
    }
    

    3 编写客户端代码

    // client/client.go
    package main
    
    import (
        "context"
        "google.golang.org/grpc"
        hello "hello/proto"
        "log"
    )
    
    const (
        Address = "127.0.0.1:8080"
    )
    
    func main() {
        conn, err := grpc.Dial(Address, grpc.WithInsecure())
        if err != nil {
            log.Fatalf("did not connect: %v", err)
        }
        defer conn.Close()
        client := hello.NewHelloServiceClient(conn)
        ctx := context.Background()
        request := &hello.SayHelloRequest{Name: "lester"}
        response, err := client.SayHello(ctx, request)
        if err != nil {
            log.Fatalf("get response err :%v", err)
        }
        log.Printf("receive response msg:%s", response.Msg)
    }
    
    
    • 根目录下运行
    go run server/server.go
    
    • 另起一个终端运行
    go run client/client.go
    

    客户端输出结果


    image.png

    相关文章

      网友评论

        本文标题:grpc基本使用

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