系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例
第五章 多proto文件示例
第六章 服务器流式传输
第七章 客户端流式传输
第八章 双向流示例
一、前言
前面我们一直在讲的是服务端、客户端一问一答,最普通且常用的RPC服务。接下来本文介绍的是服务器流式传输
。主要应用场景就是客户端请求服务端,从服务端下载视频、文件、图片
等等。
二、定义proto文件
新建stream.proto
文件
// 指定proto版本
syntax = "proto3";
// 指定默认包名
package stream_proto;
// 指定golang包名
option go_package = "/stream_proto";
//定义个流服务,叫什么名字无所谓
service ServiceStream {
//下载文件,关键字stream
rpc DownloadFile(Request)returns(stream FileResponse){}
}
//请求参数
message Request{
string name = 1;
}
//文件回调参数
message FileResponse{
//字节数据类型,即文件内容、数据
bytes content =1;
}
在go_grpc_study/example_4/grpc_proto
目录下新建Terminal,执行生成文件,命令如下
protoc --go_out=. --go-grpc_out=. ./stream.proto
目录结构变更后为
具体步骤如下:
- 1)定义回调message结构体
FileResponse
,使用bytes数据类型 - 2)定义
ServiceStream
服务 - 2)在服务里面,定义
rpc
方法DownloadFile
,使用关键词stream
回调FileResponse
结构体
三、拷贝任意文件进项目
任意文件,可以是视频、音频、图片、文档等等,不做限制。这里以一张png图片
为例。
新建static
目录,拷贝一张grpc.png
到static
目录
图片如下:
目录结构如下
四、编写server服务端
新建server
目录,新建main.go
文件
目录结构如下
编写server/main.go
文件
package main
import (
"fmt"
"go_grpc_study/example_4/grpc_proto/stream_proto"
"google.golang.org/grpc"
"io"
"log"
"net"
"os"
)
//服务端流式
// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type ServiceStream struct