「连载二」gRPC Client and Server
前言
本章节将使用 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.zip
unzip protobuf-all-3.5.1.zip
cd protobuf-3.5.1/
./configure
make
make 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
安装环境若有问题,可参考我先前的文章 《介绍与环境安装》 内有详细介绍,不再赘述
gRPC
本小节开始正式编写 gRPC 相关的程序,一起上车吧 😄
图示
目录结构
$ tree go-grpc-example
go-grpc-example
├── client
├── proto
│ └── search.proto
└── server.go
IDL
编写
在 proto 文件夹下的 search.proto 文件中,写入如下内容:
syntax = "proto3";
package proto;
service SearchService {
rpc Search(SearchRequest) returns (SearchResponse) {}
}
message SearchRequest {
string request = 1;
}
message SearchResponse {
string response = 1;
}
生成
在 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 文件,文件内容如下:
|
|
通过阅读这一部分代码,可以知道主要涉及如下方面:
- 字段名称从小写下划线转换为大写驼峰模式(字段导出)
- 生成一组 Getters 方法,能便于处理一些空指针取值的情况
- ProtoMessage 方法实现 proto.Message 的接口
- 生成 Rest 方法,便于将 Protobuf 结构体恢复为零值
- Repeated 转换为切片
|
|
而这一部分代码主要是围绕 fileDescriptor 进行,在这里 fileDescriptor_search_8b45f79ee13ff6a3 表示一个编译后的 proto 文件,而每一个方法都包含 Descriptor 方法,代表着这一个方法在 fileDescriptor 中具体的 Message Field
Server
这一小节将编写 gRPC Server 的基础模板,完成一个方法的调用。对 server.go 写入如下内容:
|
|
- 创建 gRPC Server 对象,你可以理解为它是 Server 端的抽象对象
- 将 SearchService(其包含需要被调用的服务端接口)注册到 gRPC Server 的内部注册中心。这样可以在接受到请求时,通过内部的服务发现,发现该服务端接口并转接进行逻辑处理
- 创建 Listen,监听 TCP 端口
- gRPC Server 开始 lis.Accept,直到 Stop 或 GracefulStop
Client
接下来编写 gRPC Go Client 的基础模板,打开 client/client.go 文件,写入以下内容:
|
|
- 创建与给定目标(服务端)的连接交互
- 创建 SearchService 的客户端对象
- 发送 RPC 请求,等待同步响应,得到回调后返回响应结果
- 输出响应结果
验证
启动 Server
|
|
启动 Client
|
|
总结
在本章节,我们对 Protobuf、gRPC Client/Server 分别都进行了介绍。希望你结合文中讲述内容再写一个 Demo 进行深入了解,肯定会更棒 🤔
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/go/posts/go/grpc/2018-09-23-client-and-server/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com