• golang gRPC初探


    gRPC使用protocol buffers作为Interface Definition Language (IDL)。
    gRPC的底层信息交互格式也使用的是protocol buffers。

    默认情况下,gRPC使用protocol buffers进行序列结构化数据。

    protocol buffers是Google 序列化数据的成熟开源方案。

    gRPC支持的很多种语言,例如C++, Java, Go, Python, Ruby
    等。
    这样,可以方便的使用gRPC进行开发。例如,
    服务端server可以使用Java实现,客户端client可以使用Go、Python 或者Ruby.

    本文基于golang语言,介绍gRPC的使用。

    1.安装protocol buffers编译器

    下载已经编译好的protocol buffers编译器二进制文件, 下载地址:3.7.1

    这里选择的具体版本是:protoc-3.7.1-osx-x86_64.zip.

    解压后,将bin文件夹下面的protoc拷贝到环境变量$PATH定义的目录下,例如:
    /usr/local/bin

    cp Downloads/tools/protoc-3.7.1-osx-x86_64/bin/protoc /usr/local/bin
    

    将include文件夹下面的文件拷贝到可以搜索到的include目录下,例如:
    /usr/local/include

    cp -R  Downloads/tools/protoc-3.7.1-osx-x86_64/include/google /usr/local/include
    

    2.下载Go protocol buffers plugin

    Go protocol buffers plugin是golang语言的protocol buffers编译工具和支持库。

    执行命令:

    go get -u github.com/golang/protobuf/protoc-gen-go
    

    完成后,
    编译器 plugin protoc-gen-go
    将被安装到$GOBIN, 默认是$GOPATH/bin.

    这个路径必须在环境变量$PATH 定义的路径里面。

    以便 protoc编译器能够找到。

    3.例子

    说的再多,不如写个例子。

    3.1 定义数据格式

    定义文件user.proto,路径:
    $GOPATH/src/grpc_demo/orange/user.proto

    具体内容如下:

    syntax = "proto3";
    package orange;
    
    message user {
        int32 id = 1;
        string name = 2;
    }
    
    message multi_user {
        repeated user users = 1;
    }
    

    文件开始部分是包头定义,接着是具体消息定义。

    3.2.编译protocol buffers文件

    接下来是编译刚才定义的.proto文件。

    命令格式:

    protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/addressbook.proto
    
    • -I=$SRC_DIR指定应用源码目录,如果不提供,默认是当前目录
    • --go_out=$DST_DIR 指定生成的go代码存放路径
    • $SRC_DIR/addressbook.proto 最后参数指定.proto文件

    在这里,我们执行命令参数如下:

    protoc -I=./ --go_out=./ user.proto
    

    执行后,user.pb.go文件被创建。

    内容类似:

    // Code generated by protoc-gen-go. DO NOT EDIT.
    // source: user.proto
    
    package orange
    
    import (
            fmt "fmt"
            proto "github.com/golang/protobuf/proto"
            math "math"
    )
    
    // Reference imports to suppress errors if they are not otherwise used.
    var _ = proto.Marshal
    var _ = fmt.Errorf
    var _ = math.Inf
    
    ... ....
    

    3.3 编写应用代码

    代码文件路径
    $GOPATH/src/grpc_demo/main.go

    具体代码如下:

    package main
    
    import (
        "log"
        "grpc_demo/orange"
    
        "github.com/golang/protobuf/proto"
    )
    
    func main() {
        user1 := orange.User{
            Id:   *proto.Int32(1),
            Name: *proto.String("Mike"),
        }
    
        user2 := orange.User{
            Id:   2,
            Name: "John",
        }
    
        users := orange.MultiUser{
            Users: []*orange.User{&user1, &user2},
        }
    
        // 序列化数据
        data, err := proto.Marshal(&users)
        if err != nil {
            log.Fatalln("Marshal data error: ", err)
        }
        println(users.Users[0].GetName()) // output: Mike
    
        // 对已序列化的数据进行反序列化
        var target orange.MultiUser
        err = proto.Unmarshal(data, &target)
        if err != nil {
            log.Fatalln("Unmarshal data error: ", err)
        }
        println(target.GetUsers()[1].Name) // output: John
    
    }
    

    编译

    cd grpc_demo
    ll
    total 8
    -rw-r--r--  1 lanyang  staff   817B  5  4 22:46 main.go
    drwxr-xr-x  4 lanyang  staff   128B  5  4 22:42 orange
    
    go build
    
    ll
    total 6536
    -rwxr-xr-x  1 langyang  staff   3.2M  5  4 22:47 grpc_demo
    -rw-r--r--  1 langyang  staff   821B  5  4 22:47 main.go
    drwxr-xr-x  4 langyang  staff   128B  5  4 22:42 orange
    

    编译生成grpc_demo可执行文件。

    执行

     ./grpc_demo
    Mike
    John
    

    4.小结

    本文以golang为例,简单介绍了gRPC的使用。
    以此作为入门实践。

    5.参考

    gRPC官网

    Protocol Buffer Basics: Go

    Protocol Buffer Language Guide

    protocolbuffers github

    golang demo

    golang protobuf

  • 相关阅读:
    图像切割之(五)活动轮廓模型之Snake模型简单介绍
    拓扑排序的原理及事实上现
    理解class.forName()
    Java中StringBuilder的清空方法比較
    Java实现BASE64编解码
    KMP算法具体解释(贴链接)
    基于PCM2912a的USB声卡设计
    51. 腾讯面试题:一个二叉树,中序遍历,找一个节点的后一个节点
    Handler和HandlerThread
    Nuget-QRCode:jquery-qrcode
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/10810333.html
Copyright © 2020-2023  润新知