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. 记一次启动Tomcat 控制台以及log4j 乱码问题

    Tomcat启动乱码 问题描述:当你发现你的Tomcat启动时乱码了,而你只是换了个Tomcat版本而已. 在找到真正的问题之前,我在网上百度了N多的资料,都试过了,但是都不行.1.修改了 windo ...

  2. C++中写文件ofstream 的<< 操作符 与C风格的fwrite 的笔记

    在某次工作中,调用了某SDK接口,该接口通过一个回调函数返回需要的内容.我们需要的内容是H.264码流,该码流通过一个unsigned char* 变量带回,另外还有一个长度 int length.为 ...

  3. java 观察这模式(发布订阅模式)

    观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息. 抽象 ...

  4. JavaWeb--ServletContext

    https://www.jianshu.com/p/31d27181d542 java类中获取ServletContext的方法 起因是我想要获取一个相对路径,需要用到servletContext的g ...

  5. silverlight发布设置

    HTTP头 - MIME类型.xap xapapplication/x-silverlight .xaml application/xaml+xml

  6. C# WCF发布服务的元数据的方式

    发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xm ...

  7. C#定时任务之FluentScheduler

    一.业务需求 平台首页,有几个指标统计,产品不要求实时性,觉得一天更新一次可以接受. 最后决定用FluentScheduler定时执行统计,redis缓存结果. 每天晚上1点进行定时任务统计,将统计结 ...

  8. MySQL--关于MySQL练习过程中遇到的AVG()函数处理空值的问题

    最近正准备面试,所以本来不怎么熟悉的SQL语句迫切需要练习,学习一下 在此感谢 笨鸟先飞-天道酬勤 大佬的博客:https://blog.csdn.net/dehu_zhou/article/deta ...

  9. NURBS 曲线和曲面参数化

    NURBS 曲线和曲面参数化 什么是参数? 参数是曲线或曲面上点的唯一数值(类似于坐标).通过参数,可以沿曲线的长度方向引用特定点.参数值越大,点在曲线方向上的距离越远. 就像空间中的点具有三个维度( ...

  10. python 数据库插入操作

    数据库插入操作 以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录: #!/usr/bin/python # -*- coding: UTF-8 -*- import MyS ...