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. subversion(SVN)服务配置及使用方法

      1.安装 yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql -y 2.查看版本 svnserve --vers ...

  2. PAT Basic 1012 数字分类 (20 分)

    给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n ...

  3. 清除zencart分类页多页后面的&disp_order &sort字符串的方法

    在includes\classes\split_page_results.php页面中的function display_links()函数第一行添加如下两行代码即可$parameters=preg_ ...

  4. MyEclipse 2016 反编译插件安装

    下载插件,分享一下下载插件的地址,百度网盘:链接:http://pan.baidu.com/s/1nturiAH 密码:yk73 1.把net.sf.jadclipse_3.3.0.jar拷到D:\P ...

  5. p1364 医院设置 题解

    思路:floyd 很普通的思路. 先用floyd求出两个边之间的距离,然后乘以人数. 代码: #include<iostream> #include<cstring> usin ...

  6. fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配

    一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...

  7. flutter 学习路上碰到的错误问题。

    决定还是把碰到的问题进行简单记录吧 19.8.14 错误日志: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subty ...

  8. 构建的Web应用界面还不够好看?DevExtreme v19.1全新主题来袭

    行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,本文将主要介绍介绍DevExtremev19.1中的数据可视化和主题控件,其中主要包含图表注释.增强图例功能等.欢迎下载v19 ...

  9. nginx第六天

    nginx正向代理 反向代理 Nginx正向代理配置 Nginx正向代理使用场景并不多见. 需求场景1: 如果在机房中,只有一台机器可以联网,其他机器只有内网,内网的机器想用使用yum安装软件包,在能 ...

  10. 给DataFrame的列命名或重命名

    1.读取文件的时候重命名 names = new_col,可以在读取文件的时候,给出新列名. new_col = ['new1', 'new2',... , 'newn'] pd.read_csv(' ...