用gRPC框架实现简单的调用和双向流式传输。

gRPC是一个高性能、通用的开源RPC框架,主要由Google主要面向移动应用开发,并基于HTTP/2协议标准设计,基于ProtoBuf序列化协议开发,且支持众多开发语言。

gRPC主要有4中请求/响应模式,分别是:

1. 简单模式 (Simple RPC)

这种模式最为传统,即客户端发起一次请求,服务端响应一次。这和大家平常熟悉的RPC没有什么区别,所以不再做介绍。

 

2. 服务端数据流模式 (Server-side streaming RPC)

这种模式是客户端发起一次请求,服务端返回一段连续的数据流。典型的例子是客户端向服务端发送一个股票代码,服务端把该股票的实时数据源源不断返回客户端。

 

3. 客户端数据流模式 (Client-side streaming RPC)

与服务端数据流模式相反,这次是客户端源源不断向服务端发送数据流,在发送结束后,由服务端返回一个响应。典型的例子是物联网终端向服务器报送数据。

 

4. 双向数据流模式(Bidirectional streaming RPC)

顾名思义,这是客户端和服务端都可以向对方发送数据流,这个时候双方的数据可以同时互相发送,这就是可以实现实时交互。典型的例子是聊天机器人。

 

 

先看 hello.proto 文件,定义helloService接口:

这段代码有两个接口,Hello函数是简单模式、Channel函数是双向数据流模式。

关键字stream指定启用流特性,参数部分是接受客户端的流,返回值是返回给客户端的流。

 

用protoc-gen-go内置的gRPC插件自动生成GRPC代码:

 

我们看看需要关注的自动生成的代码内容:

这是客户端和服务端调用接口,gRPC通过context为每个方法提供了上下文支持。

客户端在调用方法的时候,可以通过可选的grpc.CallOption类型的参数提供额外的上下文信息。

Channel方法返回的HelloService_ChannelClient、HelloService_ChannelServer用于和服务端(客户端)进行双向通信。

这两个方法都是接口类型,其实现具体如下:

客户端和服务端流辅助接口均定义了Send、Recv方法,用于流数据的双向通信。

 

基于服务端的HelloServiceServer接口可以重新实现HelloService服务,服务端完整代码如下:

服务端代码逻辑是这样:

1. 通过grpc.NewServer()构造一个gRPC服务对象

2. 通过gRPC插件生成的RegisterHelloServiceServer函数注册实现的HelloServiceImpl服务。

2. 通过 grpcServer.Serve(lis) 在一个监听端口上提供gRPC服务。

 

客户端代码如下:

客户端代码逻辑如下:

grpc.Dial 负责和gRPC服务建立链接,然后NewHelloServiceClient函数基于已经建立的链接构造HelloServiceClient对象。

返回的client是一个HelloServiceClient接口对象,通过接口定义的方法就可以调用服务端对应的gRPC服务提供的方法。

 

gRPC和标准库RPC框架有一个区别,gRPC生成的接口并不支持异步调用,不过我们可以在多个Goroutine之间安全地共享gRPC底层的HTTP/2链接,因此可以通过在另一个Goroutine阻塞调用的方式模拟异步调用。

RPC是远程函数调用,因此每次调用的函数参数和返回值不能太大,否则将严重影响每次调用的响应时间。因此传统RPC方法调用对于上传下载较大数据量场景并不合适。

同时传统RPC模式也不适用于对时间不确定的订阅和发布模式。为此,gRPC框架针对服务器端和客户端分别提供了流特性。客户端或服务端的单项流是双向流的特殊情况。

【Go】gRPC入门 & gRPC流
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
内联反馈
查看所有评论