热门标签 | 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

完毕!


推荐阅读
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
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社区 版权所有