ARTICLE DETAIL

资讯详情

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

Pachyderm Console 后端 Proto 代码生成全流程:gRPC 客户端构建、版本锁定与 node_modules 故障排查

Pachyderm Console 后端 Proto 代码生成全流程:gRPC 客户端构建、版本锁定与 node_modules 故障排查 数据工程后端云原生任务调度微服务【免费下载链接】pachydermData-Centric Pipelines and Data Versioning项目地址https://gitcode.com/gh_mirrors/pa/pachyderm点击查看免费下载导读本指南围绕 console/backend/src/proto/README.md 展开完整解析 Pachyderm Console 后端如何通过独立的package.json与proto.sh脚本从上游 Pachyderm 仓库拉取指定版本的.proto文件并生成 TypeScript/JavaScript 的 gRPC 客户端代码。读完本文你将掌握 Console 后端的 Proto 版本锁定机制、protoc 多插件输出流程、生成产物的目录结构以及生成后必须删除node_modules的深层原因并能独立排查典型的finishCommit调用报错问题。一、模块定位Console 后端独立维护的 Proto 生成单元在 Pachyderm 仓库中console/backend/src/proto/是一个特殊的独立子模块它不直接参与 Console 后端的日常业务逻辑而是负责从上游 Pachyderm 服务端同步.proto协议定义并生成本地可用的 gRPC 客户端代码。整个目录包含README.md生成流程说明与故障排查指引本文主体package.json 与package-lock.json独立的依赖树scripts/proto.sh一键下载.proto源文件并调用 protoc 生成代码的构建脚本proto/生成的 gRPC/Protobuf 产物*_pb.js、*_pb.d.ts、*_grpc_pb.js、*_grpc_pb.d.tsindex.ts、client.ts、services/、builders/、utils/基于生成产物封装的上层 RPC 客户端层。二、为什么需要一套独立的 package.jsonREADME 开门见山地指出This requires a separate package.json, as the proto generation libraries dont include linux arm build, and thus the build fails on circle arm. It does work locally on an m1 mac though.也就是说Proto 生成所需的工具链grpc-tools等原生二进制插件没有提供 linux/arm 架构的构建产物导致在 CircleCI 的 ARM 节点上构建必然失败而在本地 Apple Siliconm1 mac上却可以正常工作。Console 后端因此将这套工具链隔离到独立的 package.json 中避免污染主工程的依赖树。该独立包的完整内容如下{ name: proto, version: 1.0.0, scripts: { build:proto: ./scripts/proto.sh }, dependencies: { grpc_tools_node_protoc_ts: ^5.3.2, grpc-tools: ^1.11.3 } }grpc-tools提供grpc_tools_node_protoc命令与grpc_tools_node_protoc_plugin生成 Node.js gRPC 服务端/客户端绑定grpc_tools_node_protoc_ts提供protoc-gen-ts插件生成 TypeScript 类型声明。入口命令即npm run build:proto它会执行./scripts/proto.sh。由于该目录自带package-lock.json依赖版本是锁定的保证了生成结果的可复现性。三、生成流水线解剖scripts/proto.shscripts/proto.sh 是整个生成过程的真正执行者。脚本开头的注释说明了两个关键设计约束This tool downloads .proto files and generates the corresponding js/ts files It is important to mirror Pachyderms file structure here because Pachyderms proto files use relative imports即必须原样镜像 Pachyderm 的目录结构。因为 Pachyderm 的.proto文件之间使用相对导入例如pfs.proto会引用gogoproto/gogo.proto、protoextensions/validate.proto等只有保持相同的目录层级protoc 才能正确解析导入关系。3.1 版本锁定从 console/version.json 读取 proto 版本脚本通过jq从仓库根目录的 console/version.json 中读取proto字段作为下载源文件的版本锚点PACHYDERM_VERSION$(jq -r .proto ../../../version.json) GOGO_VERSIONv1.3.2当前仓库中console/version.json的内容为{ proto: 289a1fdeac8a3127657ad46713eb6a8d87115dea, pachyderm: 2.11.0-alpha.5-727163b978af9568d258c8fec27ac02c31889ca1, pachctl: 2.11.0-alpha.5, kind: 0.12.0 }可见proto字段是一个commit SHA289a1fde...而非语义化版本号。脚本的 DEBUG 输出部分专门解释了该字段的三种合法取值形式tag如v2.5.0-nightly.20230104、release如v2.4.2、sha如a7f229de...。用 SHA 锁定可以将.proto协议定义精确固定在某次提交避免上游变更导致生成的客户端与服务端协议不匹配。3.2 下载 .proto 源文件清单脚本先清空并重建输出目录rm -rf $OUT_DIR后mkdir -p随后用curl逐一下载源文件。从脚本可以看出下载的完整清单包括目标目录源文件来源proto/licenselicense.protoPachydermsrc/license/proto/enterpriseenterprise.protoPachydermsrc/enterprise/proto/tasktask.protoPachydermsrc/task/proto/pfspfs.protoPachydermsrc/pfs/proto/ppspps.protoPachydermsrc/pps/proto/authauth.protoPachydermsrc/auth/proto/adminadmin.protoPachydermsrc/admin/proto/version/versionpbversion.protoPachydermsrc/version/versionpb/proto/protoextensionslog.proto、validate.proto、json-schema-options.protoPachydermsrc/protoextensions/proto/gogoprotogogo.protogogo/protobuf v1.3.2其中gogo.proto单独从 gogo/protobuf 项目以GOGO_VERSIONv1.3.2锁定下载其余均来自 Pachyderm 自身仓库对应版本。生成的目录树也印证了脚本中mkdir的十个目录license enterprise task pfs pps auth gogoproto admin version/versionpb protoextensions与proto/下实际产物一一对应见 目录列表。3.3 protoc 三插件联合生成下载完成后脚本对proto/下所有.proto文件批量执行 protocfind $OUT_DIR -name *.proto | xargs \ $PROTOC \ --proto_path${OUT_DIR} \ --pluginprotoc-gen-grpc${PROTOC_GEN_GRPC_PATH} \ --pluginprotoc-gen-ts${PROTOC_GEN_TS_PATH} \ --grpc_outgrpc_js:${OUT_DIR} \ --js_outimport_stylecommonjs:${OUT_DIR} \ --ts_outgrpc_js:${OUT_DIR}这里同时生成了三类产物--grpc_outgrpc_js基于grpc/grpc-js的现代 gRPC 服务定义对应*_grpc_pb.js/*_grpc_pb.d.ts--js_outimport_stylecommonjsCommonJS 风格的 Protobuf 消息类对应*_pb.js--ts_outgrpc_js配套的 TypeScript 类型声明对应*_pb.d.ts。这也解释了为什么console/backend/src/proto/下每个服务的产物都是成对出现的admin_pb.js、admin_grpc_pb.js及对应的.d.ts。由于--proto_path指向整个proto/根目录各.proto文件之间的相对导入如引用gogoproto/gogo.proto可以在一个统一的搜索路径内解析这正是脚本要求镜像目录结构的原因。四、生成产物与统一出口index.ts生成的代码并非直接散落使用而是由 index.ts 统一重新导出。该文件为每个服务admin、auth、pfs、pps、enterprise、license、version做了两类导出RPC 客户端与服务端接口如APIClient as PfsAPIClient、APIService as PfsAPIService、IAPIServer as PfsIAPIServer、IAPIService as PfsIAPIService其中IAPIService_*前缀的接口按 RPC 方法逐个导出例如IAPIService_IFinishCommit、IAPIService_IStartCommit、IAPIService_IListDatum消息类型如export * from ./proto/pfs/pfs_pb等将全部 Protobuf 请求/响应类原样导出。此外 builders/pfs.ts 提供了普通对象 → Protobuf 消息的转换辅助函数如commitFromObject、branchFromObject、commitSetFromObject、deleteFileFromObjectlib/types.ts 中定义的CommitObject、BranchObject等类型即由这些 builder 消费构成了上层调用与底层生成代码之间的适配层。五、生成之后必须做的事删除 node_modulesREADME 的 Important Note 给出了一个关键操作纪律After generating the protos, make sure to remove the node_modules from this folder. Apparently the parent application mistakenly references node_modules from this directory, leading to a potential app malfunction.由于父应用Console 后端存在对console/backend/src/proto/node_modules的错误引用若生成流程在该目录安装了依赖npm install后不清理残留的node_modules会干扰父应用的模块解析进而引发应用故障。因此每次执行npm run build:proto生成代码后都必须删除本目录的node_modules。这一操作与脚本中先rm -rf $OUT_DIR再重建的幂等设计相呼应生成产物proto/目录可以被反复重建而依赖目录node_modules必须在使用后立即移除保持该目录只作为源文件 生成产物 脚本的纯净构建单元存在。六、典型故障排查finishCommit 报 Expected argument of type google.protobuf.EmptyREADME 提供了一个需要重点关注的报错样例[{extensions: {code: INTERNAL_SERVER_ERROR, details: Expected argument of type google.protobuf.Empty, grpcCode: 13, metadata: {content-type: [application/grpcproto], date: [Tue, 01 Aug 2023 00:19:41 GMT]}}, locations: [{column: 3, line: 2}], message: Something went wrong, path: [finishCommit]}]关键信息解读grpcCode: 13对应 gRPC 的INTERNAL错误码表示服务端在执行内部 RPC 调用时发生协议层面的异常details为Expected argument of type google.protobuf.Empty说明某个 gRPC 调用接收到的请求消息类型与预期不符path: [finishCommit]指明错误发生在finishCommit提交文件集完成的调用链上。README 给出的第一步处置方案非常明确Should you encounter the error above, the first step is to delete the proto node_modules.即首先删除console/backend/src/proto下的node_modules。从 README 的表述可以推断该报错的根源是父应用错误地引用了本目录残留的node_modules导致运行时解析到了不匹配的 Protobuf/gRPC 绑定消息序列化后的类型与服务端期望不符最终表现为google.protobuf.Empty参数类型错误。清理残留依赖、确保父应用从正确路径解析生成代码即可消除这类问题。七、生成的客户端如何被运行时消费理解生成代码的用途有助于评估重新生成 Proto的影响范围。Console 后端通过 utils/createGrpcApiClient.ts 创建底层 gRPC 连接PACHD_ADDRESS环境变量为必填指定 pachd 服务地址未设置时会直接抛出env var PACHD_ADDRESS is not set. Set it!GRPC_SSL环境变量为true时使用credentials.createSsl()否则使用credentials.createInsecure()。client.ts 中的apiClientRequestWrapper则在连接之上做了一层包装向每次 RPC 调用注入authn-token与project-id元数据认证令牌与项目标识并通过 Proxy 机制挂载插件——插件可监听onCall、onCompleted、onError三类事件见 lib/types.ts 的GRPCPlugin接口用于日志、指标或统一错误处理。具体服务实现示例可参考 services/auth.ts 的whoAmI调用client.whoAmI(new WhoAmIRequest(), credentialMetadata, ...)返回WhoAmIResponse.AsObject。因此npm run build:proto重新生成代码的直接影响是所有 RPC 方法签名、消息字段与类型声明都会随上游协议版本更新上层services/、builders/与index.ts的类型安全也随之重新建立——这正是版本锁定SHA如此重要的原因。八、操作清单与最佳实践小结综合 README 与 scripts/proto.sh在 Console 后端维护 Proto 生成流程的推荐步骤如下确认版本锚点如需同步新协议更新 console/version.json 的proto字段建议使用 commit SHA亦可使用 tag 或 release 版本号执行生成在console/backend/src/proto目录运行npm install后执行npm run build:proto脚本会重建proto/目录并下载、生成全部服务绑定清理依赖生成完成后务必删除本目录的node_modules防止父应用错误引用导致运行故障回归验证确认index.ts导出的各服务接口如PfsAPIClient、PpsAPIClient与消息类型同步更新并通过上层services/的 RPC 调用如whoAmI、finishCommit做冒烟测试故障速查若线上出现grpcCode: 13且details含Expected argument of type google.protobuf.Empty的finishCommit错误第一步先检查并删除console/backend/src/proto下的node_modules再排查协议版本是否与 pachd 服务端一致。这套独立依赖 SHA 锁定 目录镜像 生成后清理的设计保证了 Console 后端在跨架构 CIcircle arm 无 linux/arm 构建产物下依然可以稳定产出与 Pachyderm 服务端协议精确对齐的 gRPC 客户端代码。赞分享数据工程后端云原生任务调度微服务【免费下载链接】pachydermData-Centric Pipelines and Data Versioning项目地址https://gitcode.com/gh_mirrors/pa/pachyderm点击查看免费下载相关推荐Dapr 公共 Proto 定义全解析dapr/proto/common/v1 消息模型与 gRPC 客户端代码生成指南Dapr 公共 Proto 定义全解析dapr/proto/common/v1 消息模型与 gRPC 客户端代码生成指南 Dapr 是一个跨云与边缘的分布式应后端微服务云原生消息队列AI AgentDapr Proto 契约与代码生成实战指南从 Protobuf 定义到 gRPC 客户端Dapr Proto 契约与代码生成实战指南从 Protobuf 定义到 gRPC 客户端 本文聚焦 Dapr 核心仓库GitHub_Trending/da后端微服务云原生消息队列AI Agentlnd 移动端库构建指南iOS/Android 集成、gRPC 绑定与 proto 生成全流程lnd 移动端库构建指南iOS/Android 集成、gRPC 绑定与 proto 生成全流程 导读 本文基于 lnd 仓库 mobile/README.md区块链上一篇艾尔登法环单角色存档迁移指南EldenRingSaveCopier 5分钟救回你的200小时进度下一篇显卡驱动残留彻底清理DDU 完整卸载旧驱动的实操流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表