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

golang gRPC初探的更多相关文章

  1. Golang gRPC调试工具

    目录 Golang gRPC调试工具 1. 命令行工具 grpcurl 1.1 安装 1.2 验证 1.3 注册反射 1.4 使用示例 2. web调试工具grpcui 2.1 安装 2.2 验证 2 ...

  2. Golang gRPC 示例

    1.安装gRPC runtime go get google.golang.org/grpc 为了自动生成Golang的gRPC代码,需要安装protocal buffers compiler以及对应 ...

  3. Golang gRPC 和 gRPC-gateway 结合使用

    一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...

  4. Golang gRPC 使用

    一.概念 1.gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务 ...

  5. [golang grpc] 框架介绍

    官方网站 http://www.grpc.io/ http://www.grpc.io/docs/quickstart/go.html grpc安装 • go安装 目前grpc需要go 1.5以上版本 ...

  6. Golang gRPC微服务02: helloworld

    安装protobuf 在windows下,直接下载release版本https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0然后把 ...

  7. Golang gRPC微服务01: 介绍

    gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...

  8. Golang gRPC学习(04): Deadlines超时限制

    为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ...

  9. golang grpc demo

    1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...

随机推荐

  1. 织梦DedeCMS栏目列表常见序号的调用标签

    我们在制作dedecms模板时,源代码中的[field:global name=autoindex/]标签很好用可以调用数字序号,此标签最简单的用法就是按内容条数来获取数字序号,但有的时候发现使用该标 ...

  2. IE浏览器清除缓存及历史浏览数据

    IE浏览器清除缓存方法如下: 打开IE浏览器,依次点击"工具-Internet选项-常规-删除",如下图所示, 有的时候发现你明明已经执行了删除,但是实际上还是有缓存数据,一般是因 ...

  3. 【异常】org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:

    1 Phoenix远程无法连接但是本地可以连接,详细异常 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bindin ...

  4. python、第四篇:记录相关操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  5. java执行字符串中的运算公式

    import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.Scrip ...

  6. R 语言中的简单线性回归

    ... sessionInfo() # 查询版本及系统和库等信息 getwd() path <- "E:/RSpace/R_in_Action" setwd(path) rm ...

  7. Kattis - heapsoffun Heaps of Fun (概率密度函数+dp)

    题意:有一棵含有n个结点(n<=300)的根树,树上每个结点上的权值是从[0,ai](ai<=1e9)区间内随机的一个实数,问这棵树能形成一个最小堆的概率. 由于结点取值范围是1e9而且是 ...

  8. 同一域名对应多个IP时,PHP获取远程网页内容的函数

    同一域名对应多个IP时,PHP获取远程网页内容的函数 [文章作者:张宴 本文版本:v1.0 最后修改:2008.12.15 转载请注明原文链接:http://blog.zyan.cc/post/389 ...

  9. Puppet部署:安装puppet server、client

    Puppet部署:安装puppet server.client   puppet与其他手工操作工具有一个最大的区别就是 puppet的配置具有稳定性,因此你可以多次执行puppet,一旦你更新了你的配 ...

  10. qt5--字符串格式拼接

    QString str=QString("x坐标为:%1  y坐标为:%2").arg(i).arg(j);