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. java对象只有值传递,为什么?

    在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就 ...

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

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

  3. 小程序UI设计(5)-符合视觉规范-按钮视觉规范

    在设计工具中,根据规范我们定义了大中小三种按钮的尺寸大:720rpx *94rpx 圆角10px 字体18中:360rpx*70rpx 圆角8px 字体16 文字距离两边最小60小:120rpx*60 ...

  4. echo(),print(),print_r()的区别?

    echo可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用.echo是php的内部指令,不是函数, ...

  5. p1364 医院设置 题解

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

  6. [uboot] (番外篇)uboot relocation介绍(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...

  7. IC SPEC相关数据

    ---恢复内容开始--- 静态电流:静态电流是指没有信号输入时的电流,也就是器件本身在不受外部因素影响下的本身消耗电流. 纹波电压的害处: 1.容易在用设备中产生不期望的谐波,而谐波会产生较多的危害: ...

  8. 处理并解决mysql8.0 caching-sha2-password问题,开启远程访问

    原文:https://blog.csdn.net/u010026255/article/details/80062153 启动mysql服务:service mysqld start ALTER US ...

  9. nginx跨域设置&文件上传大小限制

    在部署项目的时候碰到这么一个问题:XMLHttpRequest cannot load,下面阐述一下这个问题 问题背景: 用nginx+tomcat部署项目.tomcat用的8080端口,nginx用 ...

  10. select添加皮肤 jquery

    由于select修改样式不能兼容浏览器,也不能随意修改,那么就需要模拟select,给select添加皮肤了,代码如下 <!DOCTYPE html> <html lang=&quo ...