尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
读懂 grpc-errors 的 hello.proto:1 份文件讲透 gRPC 服务定义与错误触发机制
读懂 grpc-errors 的 hello.proto1 份文件讲透 gRPC 服务定义与错误触发机制【免费下载链接】grpc-errorsA handy guide to gRPC errors项目地址: https://gitcode.com/gh_mirrors/gr/grpc-errorsgrpc-errors 是一个专门演示gRPC 错误处理的多语言示例仓库A handy guide to gRPC errors。整个项目的核心就是根目录下的 [hello.proto] 这一个文件它定义了 2 个 gRPC 方法其中SayHelloStrict会在参数不合法时主动抛出INVALID_ARGUMENT错误让你直观看到「服务端如何报错、客户端如何接收错误码与错误消息」。读懂这份文件你就掌握了 gRPC 服务定义 错误触发机制的最小完整模型。 为什么用「打招呼」来学 gRPC 错误学 gRPC 错误处理最怕一上来就堆砌十几种错误码。grpc-errors 的思路很聪明只做一件事服务端收到名字回复Hey, 名字!故意制造一个错误名字长度 ≥ 10 个字符时SayHelloStrict拒绝服务并返回INVALID_ARGUMENT错误码 3一个正常路径 一个错误路径覆盖了 gRPC 调用中最常遇到的两类场景。 逐行拆解 hello.proto根目录的 [hello.proto] 全文不到 30 行是整个项目的契约文件syntax proto3; package hello; service HelloService { // 简单打招呼SayHello(Euler) - Hello, Euler! rpc SayHello(HelloReq) returns (HelloResp) {}; // 严格版Name 长度超过 10 个字符就报错 rpc SayHelloStrict(HelloReq) returns (HelloResp) {}; } message HelloReq { string Name 1; } message HelloResp { string Result 1; }1️⃣service HelloService声明服务与 RPC 方法service是 gRPC 服务的容器客户端调用的门面就叫HelloService每个rpc定义一次远程调用rpc 方法名(请求消息) returns (响应消息)SayHello永远成功SayHelloStrict携带错误触发逻辑是理解gRPC 错误机制的关键2️⃣message HelloReq / HelloResp请求与响应结构HelloReq只有一个字段Name字段编号 1是 Protobuf 的序列化标识HelloResp只有一个字段Result即服务端返回的问候语注意proto 文件不定义错误格式——错误码和错误消息是 gRPC 协议层Status自带的不需要单独声明这正是 gRPC 与 REST 的重要区别gRPC 用统一的StatusCode Message结构传递错误而不是靠 HTTP 状态码或自定义错误 JSON。⚡ SayHelloStrict错误是怎么触发的以 Go 为例[go/server.go] 中的核心逻辑只有 5 行if len(req.GetName()) 10 { return nil, status.Errorf(codes.InvalidArgument, Length of Name cannot be more than 10 characters) }返回nil响应 一个带codes.InvalidArgument的 errorstatus.Errorf把错误码code和错误消息message打包进 gRPC 状态里发回客户端其他语言只是写法不同语义完全一致语言服务端报错方式参考文件Pythoncontext.set_code(grpc.StatusCode.INVALID_ARGUMENT)[python/server.py]Creturn Status(StatusCode::INVALID_ARGUMENT, msg)[cpp/server.cpp]Node.jscallback({code: grpc.status.INVALID_ARGUMENT, message: ...})[node/server.js]Rust通过 tonic 的Status::invalid_argument[rust/src/proto/mod.rs]Rubycall.status INVALID_ARGUMENT[ruby/server.rb] 客户端如何读懂这个错误客户端发一个长名字Leonhard Euler15 个字符触发错误后可以从异常中解析出结构化信息。以 Go 客户端 [go/client.go] 为例errStatus, _ : status.FromError(err) fmt.Println(errStatus.Message()) // Length of Name cannot be more than 10 characters fmt.Println(errStatus.Code()) // INVALID_ARGUMENTint 值为 3Python 客户端 [python/client.py] 中则是except grpc.RpcError as e: print(e.details()) # 错误消息 print(e.code().name) # INVALID_ARGUMENT拿到错误码后客户端就可以按错误码分支处理比如INVALID_ARGUMENT时提示用户改参数UNAVAILABLE时重试而不是把所有失败都当成出错了。 1 份 proto10 种语言hello.proto 通过 protoc 编译器为每种语言生成桩代码这是 gRPC 跨语言互操作的根基hello.pb.go消息结构、hello_grpc.pb.go服务桩→ 生成自go/hello/目录Python 对应hello_pb2.py、hello_pb2_grpc.pyC 对应hello.pb.h/cc、hello.grpc.pb.h/ccRust 生成到rust/src/proto/mod.rs各语言的生成命令和运行步骤都写在对应目录的 README 里例如 Go 的 [go/README.md]# 生成 protobuf 与 gRPC 桩代码 $ protoc -I ../ ../hello.proto --go_outhello --go_optmodulegithub.com/avinassh/grpc-errors/go/hello $ protoc -I ../ ../hello.proto --go-grpc_outhello --go-grpc_optmodulegithub.com/avinassh/grpc-errors/go/hello # 编译并运行服务端监听 50051 端口 $ go build server.go go build client.go $ ./server $ ./client客户端会先打印Hey, Euler!随后打印出那句错误消息和INVALID_ARGUMENT错误码——这就是完整的一次gRPC 错误往返。 快速上手3 步跑通错误演示克隆仓库git clone https://gitcode.com/gh_mirrors/gr/grpc-errors安装依赖gRPC 运行时 protocProtobuf 编译器系统要求见根目录 [README.md]进入任一语言目录推荐 Go步骤最简按其 README 生成代码 → 启动 server → 运行 client观察错误码输出 小结这份 proto 教会你的 3 件事收获说明gRPC 服务定义servicerpcmessage三件套即一个完整服务契约错误触发机制服务端通过 gRPC Status 携带错误码如INVALID_ARGUMENT无需自定义错误结构跨语言一致性同一份 hello.proto 生成 10 种语言的桩代码错误语义完全一致把 [hello.proto] 配合 [go/server.go]、[go/client.go] 这三个文件连起来读你就拥有了理解 gRPC 错误处理的最小地图。之后再遇到UNAUTHENTICATED、DEADLINE_EXCEEDED等其他错误码套路都是一样的服务端设置 code message客户端按 code 分支处理。【免费下载链接】grpc-errorsA handy guide to gRPC errors项目地址: https://gitcode.com/gh_mirrors/gr/grpc-errors创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

qmcdump实战指南:5分钟把QQ音乐加密文件批量转成车机能播的flac/mp3

qmcdump实战指南:5分钟把QQ音乐加密文件批量转成车机能播的flac/mp3

qmcdump实战指南:5分钟把QQ音乐加密文件批量转成车机能播的flac/mp3 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdu…

📅 2026/10/9 7:15:47
Towny元数据与翻译系统完全指南:CustomDataField扩展机制与Crowdin多语言实践

Towny元数据与翻译系统完全指南:CustomDataField扩展机制与Crowdin多语言实践

Towny元数据与翻译系统完全指南:CustomDataField扩展机制与Crowdin多语言实践 【免费下载链接】Towny Towny Advanced Minecraft plugin for Bukkit/Spigot. 项目地址: https://gitcode.com/gh_mirrors/to/Towny 🏰 Towny 是一款功能强大的 Minec…

📅 2026/10/11 7:23:48
Open-Agent架构全景解析:NestJS + GraphQL + PostgreSQL + Rust + Electron的Monorepo设计深度剖析

Open-Agent架构全景解析:NestJS + GraphQL + PostgreSQL + Rust + Electron的Monorepo设计深度剖析

Open-Agent架构全景解析:NestJS GraphQL PostgreSQL Rust Electron的Monorepo设计深度剖析 【免费下载链接】open-agent Open-source alternative to Claude Agent SDK, ChatGPT Agents, and Manus. 项目地址: https://gitcode.com/gh_mirrors/op/open-agent …

📅 2026/8/31 11:41:57
MORE NEWS

更多资讯

📰

Qt Core 模块深度解析:元对象系统、事件循环与多线程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

FMEA失效模式分析:原理、应用与行业实践

1. 失效模式与影响分析(FMEA)概述失效模式与影响分析(Failure Mode and Effects Analysis,简称FMEA)是一种系统化的可靠性分析方法,最早由美国军方在20世纪40年代开发用于武器装备的质量控制。如今它已成为…

📰

国内环境快速部署Dify:镜像拉取与docker-compose改造指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

WSL下STM32烧录难题:ST-Link USB直通与OpenOCD实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

低功耗气体传感模组物联网设计:从选型到功耗优化的实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

CH379M双通道读卡器方案:SD/TF卡并行读写与国产化迁移实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬