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, ... 
随机推荐
- 记一次启动Tomcat 控制台以及log4j 乱码问题
			Tomcat启动乱码 问题描述:当你发现你的Tomcat启动时乱码了,而你只是换了个Tomcat版本而已. 在找到真正的问题之前,我在网上百度了N多的资料,都试过了,但是都不行.1.修改了 windo ... 
- C++中写文件ofstream 的<< 操作符 与C风格的fwrite 的笔记
			在某次工作中,调用了某SDK接口,该接口通过一个回调函数返回需要的内容.我们需要的内容是H.264码流,该码流通过一个unsigned char* 变量带回,另外还有一个长度 int length.为 ... 
- java 观察这模式(发布订阅模式)
			观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息. 抽象 ... 
- JavaWeb--ServletContext
			https://www.jianshu.com/p/31d27181d542 java类中获取ServletContext的方法 起因是我想要获取一个相对路径,需要用到servletContext的g ... 
- silverlight发布设置
			HTTP头 - MIME类型.xap xapapplication/x-silverlight .xaml application/xaml+xml 
- C# WCF发布服务的元数据的方式
			发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xm ... 
- C#定时任务之FluentScheduler
			一.业务需求 平台首页,有几个指标统计,产品不要求实时性,觉得一天更新一次可以接受. 最后决定用FluentScheduler定时执行统计,redis缓存结果. 每天晚上1点进行定时任务统计,将统计结 ... 
- MySQL--关于MySQL练习过程中遇到的AVG()函数处理空值的问题
			最近正准备面试,所以本来不怎么熟悉的SQL语句迫切需要练习,学习一下 在此感谢 笨鸟先飞-天道酬勤 大佬的博客:https://blog.csdn.net/dehu_zhou/article/deta ... 
- NURBS 曲线和曲面参数化
			NURBS 曲线和曲面参数化 什么是参数? 参数是曲线或曲面上点的唯一数值(类似于坐标).通过参数,可以沿曲线的长度方向引用特定点.参数值越大,点在曲线方向上的距离越远. 就像空间中的点具有三个维度( ... 
- python 数据库插入操作
			数据库插入操作 以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录: #!/usr/bin/python # -*- coding: UTF-8 -*- import MyS ... 
