流式 RPC
server/client/bidi streaming。
35 分钟
流式 RPC
gRPC 除 Unary 外支持 Server streaming、Client streaming、Bidirectional streaming。适合推送进度、批量上报、实时日志——REST 需 SSE/WebSocket 或长轮询。
学习目标
- 区分四种调用模式的
.proto签名 - 实现 Server streaming 示例(如 lesson 列表流式返回)
- 理解何时 不必 为 CodeRoadMap 主 API 引入 streaming
核心内容
.proto 四种模式
service TrackService {
// Unary
rpc GetTrack(GetTrackRequest) returns (GetTrackResponse);
// Server streaming:一次请求,多次响应
rpc StreamLessons(StreamLessonsRequest) returns (stream Lesson);
// Client streaming:多次请求,一次响应
rpc UploadProgress(stream ProgressEvent) returns (UploadSummary);
// Bidi:双向流
rpc Chat(stream ChatMessage) returns (stream ChatMessage);
}
本站课时 Markdown 经 REST GET /tracks/{slug}/lessons/{lessonSlug} 一次返回即可——streaming 属 lab 进阶,非生产必需。
Server streaming 服务端
@Override
public void streamLessons(StreamLessonsRequest req, StreamObserver<Lesson> observer) {
lessonService.findByTrackSlug(req.getTrackSlug()).forEach(lesson -> {
observer.onNext(Lesson.newBuilder()
.setSlug(lesson.getSlug())
.setTitle(lesson.getTitle())
.build());
});
observer.onCompleted();
}
客户端:
stub.streamLessons(request, new StreamObserver<Lesson>() {
public void onNext(Lesson value) { /* 逐条处理 */ }
public void onError(Throwable t) { /* Status */ }
public void onCompleted() { }
});
选型提示
| 场景 | 推荐 |
|---|---|
| 课程列表/详情 | REST /tracks(可缓存) |
| 编译日志 tail | Server streaming |
| 批量指标上报 | Client streaming |
| 协作编辑 | Bidi(复杂度高) |
graphql-essentials 用 Subscription 做类似推送;gRPC streaming 更偏 服务间。配合 spring-cloud-essentials 时注意连接数与超时。
练习
- 实现 ,客户端打印每条