go grpc 设置返回头信息_跟我学 gRPC—2. gRPC Client 和 Server

Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!

738f1230f24ad2c5690d7b75b2f2e82a.png

前言

本章节将使用 Go 来编写 gRPC Server 和 Client,让其互相通讯。在此之上会使用到如下库:

  • google.golang.org/grpc
  • github.com/golang/protobuf/protoc-gen-go

安装

gRPC

go get -u google.golang.org/grpc

Protocol Buffers v3

wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.zipunzip protobuf-all-3.5.1.zipcd protobuf-3.5.1/./configuremakemake install

检查是否安装成功

protoc --version

若出现以下错误,执行 ldconfig 命名就能解决这问题

protoc: error while loading shared libraries: libprotobuf.so.15: cannot open shared object file: No such file or directory

Protoc Plugin

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

安装环境若有问题,可参考我先前的文章 《介绍与环境安装》 https://studygolang.com/articles/12433 内有详细介绍,不再赘述

gRPC

本小节开始正式编写 gRPC 相关的程序,一起上车吧

图示

c7ba96de03bdb44c568fb9519069f45c.png

目录结构

$ tree go-grpc-example go-grpc-example├── client├── proto│ └── search.proto└── server.go

IDL

编写

在 proto 文件夹下的 search.proto 文件中,写入如下内容:

e8d8b5af0d7f03ed379e761f257c7ae1.png

生成

在 proto 文件夹下执行如下命令:

$ protoc --go_out=plugins=grpc:. *.proto
  • plugins=plugin1+plugin2:指定要加载的子插件列表

我们定义的 proto 文件是涉及了 RPC 服务的,而默认是不会生成 RPC 代码的,因此需要给出 plugins 参数传递给 protoc-gen-go,告诉它,请支持 RPC(这里指定了 gRPC)

  • --go_out=.:设置 Go 代码输出的目录

该指令会加载 protoc-gen-go 插件达到生成 Go 代码的目的,生成的文件以 .pb.go 为文件后缀

  • : (冒号)

冒号充当分隔符的作用,后跟所需要的参数集。如果这处不涉及 RPC,命令可简化为:

$ protoc --go_out=. *.proto

注:建议你看看两条命令生成的 .pb.go 文件,分别有什么区别

生成后

执行完毕命令后,将得到一个 .pb.go 文件,文件内容如下:

a38550e4ba2fa3dbd68232b948a1c1dc.png

通过阅读这一部分代码,可以知道主要涉及如下方面:

  • 字段名称从小写下划线转换为大写驼峰模式(字段导出)
  • 生成一组 Getters 方法,能便于处理一些空指针取值的情况
  • ProtoMessage 方法实现 proto.Message 的接口
  • 生成 Rest 方法,便于将 Protobuf 结构体恢复为零值
  • Repeated 转换为切片
581611fe4b02b1711f74b2655af17103.png

而这一部分代码主要是围绕 fileDescriptor 进行,在这里 fileDescriptor_search_8b45f79ee13ff6a3 表示一个编译后的 proto 文件,而每一个方法都包含 Descriptor 方法,代表着这一个方法在 fileDescriptor 中具体的 Message Field

Server

这一小节将编写 gRPC Server 的基础模板,完成一个方法的调用。对 server.go 写入如下内容:

760716d0da4e23af89cfd1d163e22117.png
  • 创建 gRPC Server 对象,你可以理解为它是 Server 端的抽象对象
  • 将 SearchService(其包含需要被调用的服务端接口)注册到 gRPC Server 的内部注册中心。这样可以在接受到请求时,通过内部的服务发现,发现该服务端接口并转接进行逻辑处理
  • 创建 Listen,监听 TCP 端口
  • gRPC Server 开始 lis.Accept,直到 Stop 或 GracefulStop

Client

接下来编写 gRPC Go Client 的基础模板,打开 client/client.go 文件,写入以下内容:

9442d12a7ac427dc36b77937b7f09768.png
  • 创建与给定目标(服务端)的连接交互
  • 创建 SearchService 的客户端对象
  • 发送 RPC 请求,等待同步响应,得到回调后返回响应结果
  • 输出响应结果

验证

启动 Server

$ pwd$GOPATH/github.com/EDDYCJY/go-grpc-example$ go run server.go

启动 Client

$ pwd $GOPATH/github.com/EDDYCJY/go-grpc-example/client$ go run client.go 2018/09/23 11:06:23 resp: gRPC Server

总结

在本章节,我们对 Protobuf、gRPC Client/Server 分别都进行了介绍。希望你结合文中讲述内容再写一个 Demo 进行深入了解,肯定会更棒

本系列作者:煎鱼,原创授权发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值