CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
gRPC 入门/课时/流式 RPC
RawBlame
课时目录12 节

gRPC 入门

  1. 01gRPC 是什么
  2. 02Protocol Buffers
  3. 03代码生成
  4. 04Java 服务端
  5. 05Java 客户端
  6. 06流式 RPC
  7. 07Spring gRPC 集成
  8. 08状态与错误
  9. 09gRPC-Gateway
  10. 10gRPC vs REST
  11. 11TLS 与安全
  12. 12综合练习

流式 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(可缓存)
编译日志 tailServer streaming
批量指标上报Client streaming
协作编辑Bidi(复杂度高)

graphql-essentials 用 Subscription 做类似推送;gRPC streaming 更偏 服务间。配合 spring-cloud-essentials 时注意连接数与超时。

练习

  • 实现 ,客户端打印每条
StreamLessons
slug
  • 中途 cancel 流,观察服务端 onError/CANCELLED
  • 写一段话:为何主站不用 streaming 传 Markdown
  • 小结

    Streaming = HTTP/2 多帧上的多消息 RPC;主 API 仍 Unary REST 足够。 下一课 Spring gRPC 集成。

    加载本节练习…
    ← 上一课Java 客户端下一课 →Spring gRPC 集成