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

猜你喜欢

转载自www.cnblogs.com/lanyangsh/p/10810333.html