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. 搭建私有CA并基于OpenSSL实现双向身份认证

    0x00 前言 互联网上的Web应用由于用户数目广泛,都是采用单向身份认证的,只需要客户端验证服务端的身份.但如果是企业内部的应用对接,客户端数量有限,可能就会要求对客户端也做身份验证,这时就需要一个 ...

  2. Windows设置 .exe 开机自启动

    例如:想让Nginx开机自启动 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

  3. MySQL之RPM安装说明及配置

    1.查看当前系统是否安装过Linux rpm -qa | grep -i mysql 未安装无任何输出:安装会打印对应mysql的rpm安装包. 2.准备安装包: MySQL-client-5.5.4 ...

  4. 16、Nginx Rewrite重写

    1.Rewrite基本概述 1.1.什么是rewrite Rewrite主要实现url地址重写, 以及地址重定向,就是将用户请求web服务器的地址重新定向到其他URL的过程. 1.2.Rewrite使 ...

  5. Python基础编程:字符编码、数据类型、列表

    目录: python简介 字符编码介绍 数据类型 一.Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心 ...

  6. Cuda9.0安装

    CUDA 9.0安装笔记 最近实验室新购买两块K80的GPU.作为好奇的小猪,当然会自报奋勇去配置环境.在这篇博客中将会介绍在centos7下配置CUDA 9.0的步骤. 1. 什么是CUDA? 引用 ...

  7. php-fpm搭建及加固

    php-fpm安装 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程 ...

  8. C语言|博客作业12—学期总结

    一.我学到的内容 二.我的收获 (1)https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/7603 收获:第一次接触C语言和写博客,感觉特别 ...

  9. 基于MaxCompute InformationSchema进行血缘关系分析

    一.需求场景分析 在实际的数据平台运营管理过程中,数据表的规模往往随着更多业务数据的接入以及数据应用的建设而逐渐增长到非常大的规模,数据管理人员往往希望能够利用元数据的分析来更好地掌握不同数据表的血缘 ...

  10. postman -- token全局变量

    var data = JSON.parse(responseBody);if (data.data.token) { tests["Body has token"] = true; ...