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

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

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

学习

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

更多

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

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
gRPC 入门/课时/状态与错误
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综合练习

状态与错误

Status、Metadata、deadline。

25 分钟

状态与错误

gRPC 用 Status(code + description)与 Metadata 传递错误;客户端通过 StatusRuntimeException 处理。与 REST 的 HTTP 状态码 概念对应、映射非 1:1。

学习目标

  • 使用标准 Status.Code(NOT_FOUND、INVALID_ARGUMENT 等)
  • 在 Metadata 中传递 trace-id、业务错误码
  • 配置 deadline 避免级联阻塞

核心内容

Status 对照 REST

gRPC Code近似 REST本站示例
OK200正常返回 track
NOT_FOUND404slug 不存在
INVALID_ARGUMENT400空 slug
UNAUTHENTICATED401缺 mTLS/ token
DEADLINE_EXCEEDED504下游超时
UNAVAILABLE503服务未启动

REST TrackController 返回 ResponseEntity.notFound();gRPC lab 用 Status.NOT_FOUND——同一业务,不同传输语义。

服务端抛错

if (req.getSlug().isBlank()) {
    resp.onError(Status.INVALID_ARGUMENT
        .withDescription("slug required")
        .asRuntimeException());
    return;
}
resp.onError(Status.NOT_FOUND
    .withDescription("track: " + req.getSlug())
    .asRuntimeException());

Metadata 与拦截器

Metadata.Key<String> TRACE =
    Metadata.Key.of("x-trace-id", Metadata.ASCII_STRING_MARSHALLER);

Metadata trailers = new Metadata();
trailers.put(TRACE, MDC.get("traceId"));
resp.onError(Status.INTERNAL.asRuntimeException(trailers));

Spring 可用 ServerInterceptor 统一注入 trace,对齐 spring-boot-essentials 日志 MDC。微服务链路透传见 spring-cloud-essentials Sleuth/Micrometer。

Deadline

// 客户端
stub.withDeadlineAfter(3, TimeUnit.SECONDS).getTrack(req);

// 服务端检查
if (Context.current().isCancelled()) { /* 尽早退出 */ }

公开 /tracks 仍用 HTTP timeout + 网关限流;gRPC deadline 主要 服务间 防护。

练习

  • 触发 NOT_FOUND,打印 getStatus().getCode()
  • 设置 1ms deadline,观察 DEADLINE_EXCEEDED
  • 对比 REST 404 JSON body 与 gRPC 纯 Status 差异

小结

错误 = Status + 可选 Metadata;deadline 是微服务韧性基础。 下一课 gRPC-Gateway 与 REST 桥接。

加载本节练习…
← 上一课Spring gRPC 集成下一课 →gRPC-Gateway