热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gRPCgolang初步接触

概述gRPC使用protocolbuffers作为IDL(InterfaceDefinitionLanguage),提供一种跨平台,跨语言的RPC(远程过程调用)机制,本文通过示例

概述

gRPC使用protocol buffers作为 IDL(Interface Definition Language), 提供一种跨平台,跨语言的RPC(远程过程调用)机制,本文通过示例程序介绍gRPC基本使用。

前置条件

  • Go 版本1.6及以上 (传送)

    $ go version

  • 安装gRPC

    $ go get -u google.golang.org/grpc

  • 安装 Protocol Buffers v3

    Protocol编译器是用来生成gRPC服务代码的。下载对应的zip文件包来安装即可 传送。

    • 解压zip文件
    • 将二进制文件(bin/protoc)添加进path环境变量

接着安装 protoc的Go插件:

$ go get -u github.com/golang/protobuf/protoc-gen-go

protoc-gen-go 编译器插件安装在$GOBIN,变量定义为 \$GOPATH/bin,在$PATH环境变量中必须存在 protocol ,protoc相关命令。

$ export PATH=$PATH:$GOPATH/bin

下载代码

下载gRPC示例代码库GIthub,示例代码位于 $GOPATH/src/google.golang.org/grpc/examples 目录下。

$ go get google.golang.org/grpc
#或者从github下载
$ go get github.com/grpc/grpc

构建程序

#切换到示例代码目录中
$ cd $GOPATH/src/google.golang.org/grpc/examples

.proto 文件 定义 gRPC服务,同时也用来生成对应的 .pb.go 文件。 .pb.go 文件是使用 protoc 编译器根据.proto来生成的。

对示例程序来说,helloworld.pb.go 文件已经提前生成(依据 helloworld.proto 定义),文件位于$GOPATH/src/google.golang.org/grpc/examples/helloworld/helloworld

文件 helloworld.pb.go 包含以下内容:

  • 生成的客户端和服务端代码
  • 生成定义好的 HelloRequestHelloReply 类型操作代码

运行程序

使用 go run 指令运行。

运行服务端:

$ go run greeter_server/main.go

运行客户端(新开terminal):

$ go run greeter_client/main.go

若打印 Greeting: Hello world,表示基于 client-server 的 gRPC 运用运行成功。

修改程序

目的:服务端(server)增加一个新的方法(SayHelloAgain)供客户端(client)调用。gRPC服务使 protocol定义;在这个 地址 和这个 地址 能找到定义 .proto 文件的更多信息。现在,你只需要知道服务端和客户端”stub”同时存在一个 SayHello 方法,该方法接受从客户端 HelloRequest 类型参数并且由服务端返回 HelloReply 类型结果,代码如下:

// greeting 服务定义.
service Greeter {
// 发送 greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// request 消息体包含 user's name.
message HelloRequest {
string name = 1;
}
// response 消息提包含 greetings
message HelloReply {
string message = 1;
}

Greeter 增加一个 SayHelloAgain 方法,确保当前工作目录为$GOPATH/src/google.golang.org/grpc/examples/helloworld。

修改 helloworld/helloworld.proto 文件,增加一个 SayHelloAgain 方法,带有 HelloRequestHelloReply 类型。代码如下:

// greeting 服务定义.
service Greeter {
// 发送 greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// 新增 SayHelloAgain
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// request 消息体包含 user's name.
message HelloRequest {
string name = 1;
}
// response 消息提包含 greetings
message HelloReply {
string message = 1;
}

生成gRPC代码

现在使用定义好的服务重新生成gRPC代码。工作目录为($GOPATH/src/google.golang.org/grpc/examples/helloworld)。指令如下:

$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld

文件 helloworld.pb.go 被重新生成。

修改&重新运行

虽然已经重新生成 服务端 (server) 和 客户端 (client) 代码, 但让然需要手动修改部分调用代码。

修改 server

编辑文件 greeter_server/main.go,增加如下代码:

func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello again " + in.Name}, nil
}

修改 client

编辑文件 greeter_client/main.go,在 main 函数中增加如下代码:

r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)

运行

运行服务端:

$ go run greeter_server/main.go

运行客户端:

$ go run greeter_server/main.go

期望结果:

$ go run greeter_client/main.go
Greeting: Hello world
Greeting: Hello again world

完毕!


推荐阅读
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
  • 每种编程语言都有其独特的完成任务的方式,这也说明了为什么有这么多语言可供选择。在JimHall的《不同的编程语言如何完成相同的事情》文章中,他演示了13种不同的语言如何使用不同的语 ... [详细]
  • 本文详细介绍了 MySQL InnoDB 存储引擎的事务机制,包括 ACID 特性、redo 日志、undo 日志以及 checkpoint 的作用和实现方式。 ... [详细]
  • oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
  • 本文探讨了如何在游戏启动画面中移除广告,特别是在游戏数据加载期间(大约5-6秒)广告会短暂显示的问题。通过调整XML布局和代码逻辑,可以实现广告的延迟加载或完全移除。 ... [详细]
  • 本文介绍了如何在 VC++ 中使用双缓冲技术来减少屏幕闪烁,提高绘图性能。通过示例代码详细展示了双缓冲的实现步骤。 ... [详细]
author-avatar
plumscape_191
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有