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.参考
Protocol Buffer Language Guide
golang gRPC初探的更多相关文章
- Golang gRPC调试工具
目录 Golang gRPC调试工具 1. 命令行工具 grpcurl 1.1 安装 1.2 验证 1.3 注册反射 1.4 使用示例 2. web调试工具grpcui 2.1 安装 2.2 验证 2 ...
- Golang gRPC 示例
1.安装gRPC runtime go get google.golang.org/grpc 为了自动生成Golang的gRPC代码,需要安装protocal buffers compiler以及对应 ...
- Golang gRPC 和 gRPC-gateway 结合使用
一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...
- Golang gRPC 使用
一.概念 1.gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务 ...
- [golang grpc] 框架介绍
官方网站 http://www.grpc.io/ http://www.grpc.io/docs/quickstart/go.html grpc安装 • go安装 目前grpc需要go 1.5以上版本 ...
- Golang gRPC微服务02: helloworld
安装protobuf 在windows下,直接下载release版本https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0然后把 ...
- Golang gRPC微服务01: 介绍
gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...
- Golang gRPC学习(04): Deadlines超时限制
为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ...
- golang grpc demo
1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...
随机推荐
- subversion(SVN)服务配置及使用方法
1.安装 yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql -y 2.查看版本 svnserve --vers ...
- PAT Basic 1012 数字分类 (20 分)
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n ...
- 清除zencart分类页多页后面的&disp_order &sort字符串的方法
在includes\classes\split_page_results.php页面中的function display_links()函数第一行添加如下两行代码即可$parameters=preg_ ...
- MyEclipse 2016 反编译插件安装
下载插件,分享一下下载插件的地址,百度网盘:链接:http://pan.baidu.com/s/1nturiAH 密码:yk73 1.把net.sf.jadclipse_3.3.0.jar拷到D:\P ...
- p1364 医院设置 题解
思路:floyd 很普通的思路. 先用floyd求出两个边之间的距离,然后乘以人数. 代码: #include<iostream> #include<cstring> usin ...
- fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配
一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...
- flutter 学习路上碰到的错误问题。
决定还是把碰到的问题进行简单记录吧 19.8.14 错误日志: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subty ...
- 构建的Web应用界面还不够好看?DevExtreme v19.1全新主题来袭
行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,本文将主要介绍介绍DevExtremev19.1中的数据可视化和主题控件,其中主要包含图表注释.增强图例功能等.欢迎下载v19 ...
- nginx第六天
nginx正向代理 反向代理 Nginx正向代理配置 Nginx正向代理使用场景并不多见. 需求场景1: 如果在机房中,只有一台机器可以联网,其他机器只有内网,内网的机器想用使用yum安装软件包,在能 ...
- 给DataFrame的列命名或重命名
1.读取文件的时候重命名 names = new_col,可以在读取文件的时候,给出新列名. new_col = ['new1', 'new2',... , 'newn'] pd.read_csv(' ...