ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

读懂 grpc-errors 的 hello.proto:1 份文件讲透 gRPC 服务定义与错误触发机制

读懂 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),仅供参考
返回列表