ARTICLE DETAIL

资讯详情

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

googleapis 仓库中的 Example Library API:从 Shelf 与 Book 资源模型理解 Google API 设计与 GAPIC 代码生成范式

googleapis 仓库中的 Example Library API:从 Shelf 与 Book 资源模型理解 Google API 设计与 GAPIC 代码生成范式 googleapis 仓库中的 Example Library API从 Shelf 与 Book 资源模型理解 Google API 设计与 GAPIC 代码生成范式【免费下载链接】googleapisPublic interface definitions of Google APIs.项目地址: https://gitcode.com/GitHub_Trending/go/googleapis导读本文基于 googleapis 仓库中的官方示例服务Example Library APIgoogle/example/library展开。该服务用最简单的「书架Shelf与图书Book」两级资源模型完整演示了 Google API 定义的三大核心要素资源导向的 Protobuf 接口、REST/HTTP 映射注解、以及驱动多语言客户端代码生成的 GAPIC 配置。读完本文你将掌握 Google 系 API 的.proto定义规范、google.api注解的语义、grpc_service_config 重试策略的配置方法以及 Bazel 如何一次性为 Java/Go/Python/PHP/Node.js/Ruby/C#/C 生成客户端库。一、Example Library 是什么README 中的资源模型仓库根目录的 google/example/library/README.md 用一句话定义了整个服务这是一个代表简单数字图书馆的 Google 示例服务。它管理一个书架Shelf资源集合每个书架拥有一个图书Book资源集合。这句描述背后是 Google API 设计中最经典的两级父子资源模型Shelf书架顶层资源集合命名规则为shelves/*例如shelves/classicBook图书挂靠在某个书架下的子资源命名规则为shelves/*/books/*例如shelves/classic/books/1984。整个服务的定位是「教学与验证用示例」它没有真实的后端逻辑而是被 Google 的 API 生成工具链GAPIC当作测试夹具fixture用来验证「一份.proto定义能否正确生成出各语言的客户端库」。也正因如此它是学习 Google API 定义语法的绝佳入门样本。二、资源模型与命名规则从 proto 源码看资源定义资源模型的正规定义位于 google/example/library/v1/library.proto。其中Book与Shelf两个消息通过google.api.resource注解声明自己的资源类型与命名模式patternmessage Book { option (google.api.resource) { type: library-example.googleapis.com/Book, pattern: shelves/{shelf}/books/{book} }; string name 1; // 资源名形如 shelves/{shelf_id}/books/{book_id} string author 2; // 作者 string title 3; // 标题 bool read 4; // 是否已读 } message Shelf { option (google.api.resource) { type: library-example.googleapis.com/Shelf, pattern: shelves/{shelf_id} }; string name 1; // 资源名形如 shelves/{shelf_id} string theme 2; // 书架主题 }从源码结构可以提炼出 Google 资源导向 API 的两条设计惯例每个资源消息的第一个字段必须是name它承载全局唯一的资源标识符resource name并可直接出现在 REST 路径中pattern中的{shelf}、{book}是路径参数占位符服务端实现时据此解析出具体的 ID 值。同时注意源码注释明确说明创建资源时name字段会被忽略The name is ignored when creating a book/shelf即创建操作由服务端分配资源名——这是 Google API 的另一个通用约定。library.proto顶部的 package 声明为google.example.library.v1并设置了go_package、java_package、php_namespace等多语言选项为各语言代码生成指定目标包名option go_package google.golang.org/genproto/googleapis/example/library/v1;library; option java_multiple_files true; option java_outer_classname LibraryProto; option java_package com.google.example.library.v1; option php_namespace Google\\Cloud\\Example\\Library\\V1;三、LibraryService 的 11 个 RPC完整的资源 CRUD 全景library.proto 中的LibraryService是服务的唯一接口共定义 11 个 RPC覆盖了 Google 资源 API 的标准操作集。按照资源层级可分成两组Shelf 层级5 个RPC语义HTTP 映射method_signatureCreateShelf创建书架返回新 ShelfPOST /v1/shelvesbody 为shelfshelfGetShelf获取书架不存在返回 NOT_FOUNDGET /v1/{nameshelves/*}nameListShelves列出书架顺序未指定但确定GET /v1/shelves—DeleteShelf删除书架DELETE /v1/{nameshelves/*}nameMergeShelves将other_shelf的书并入name并删除源书架POST /v1/{nameshelves/*}:mergebody 为*name,other_shelfBook 层级6 个RPC语义HTTP 映射method_signatureCreateBook在书架下创建图书POST /v1/{parentshelves/*}/booksbody 为bookparent,bookGetBook获取图书GET /v1/{nameshelves/*/books/*}nameListBooks列出某书架下的图书GET /v1/{parentshelves/*}/booksparentUpdateBook更新图书若 name 非空且不匹配则返回 INVALID_ARGUMENTPATCH /v1/{book.nameshelves/*/books/*}body 为bookbook,update_maskDeleteBook删除图书DELETE /v1/{nameshelves/*/books/*}nameMoveBook将图书移动到另一书架新 book 的 id 可能变化POST /v1/{nameshelves/*/books/*}:movebody 为*name,other_shelf_name3.1 google.api.http 注解proto 与 REST 的桥接每个 RPC 都通过google.api.http选项声明 REST 映射。以UpdateBook为例rpc UpdateBook(UpdateBookRequest) returns (Book) { option (google.api.http) { patch: /v1/{book.nameshelves/*/books/*} body: book }; option (google.api.method_signature) book,update_mask; }可以观察到几个关键机制路径模板中的变量绑定{book.nameshelves/*/books/*}表示把路径片段绑定到请求消息UpdateBookRequest的book.name字段上shelves/*/books/*是匹配模式自定义动作custom verbMergeShelves使用:merge、MoveBook使用:move后缀这是 Google API 在标准 CRUD 之外扩展动作的标准写法形如POST /v1/{name...}:actionbody: *表示整个请求消息体都作为 HTTP bodymethod_signature声明该方法最常用的参数组合是后续生成语言友好方法签名的依据。3.2 请求/响应消息与分页、字段掩码ListShelves/ListBooks严格遵循 Google 标准分页模式ListShelvesRequest 携带page_size默认由服务端决定与page_token对应响应ListShelvesResponse返回shelves列表与next_page_token客户端通过反复携带next_page_token翻页。UpdateBookRequest则演示了**字段掩码FieldMask**的使用update_mask字段类型为google.protobuf.FieldMask声明为 REQUIRED用于指定 PATCH 请求中仅更新哪些字段这是 Google API 支持局部更新的标准做法。所有需要定位资源的请求字段如name、parent都同时带上了google.api.field_behavior REQUIRED和google.api.resource_reference注解用于标注参数校验规则与资源类型关联供代码生成器与静态检查使用。四、Service Config 与重试策略library_example_v1.yaml 与 grpc_service_config4.1 服务配置service configgoogle/example/library/library_example_v1.yaml 是一份google.api.Service类型的服务配置声明了 API 的服务名library-example.googleapis.com、标题Example Library API、挂载的 API 列表并在backend.rules中为全部 11 个方法逐一设置了10 秒的 deadlinetype: google.api.Service config_version: 3 name: library-example.googleapis.com title: Example Library API apis: - name: google.example.library.v1.LibraryService backend: rules: - selector: google.example.library.v1.LibraryService.CreateShelf deadline: 10.0 # ... 其余方法同样为 10.0s这份 yaml 也是library.proto中default_host选项library-example.googleapis.com与文档 summary 的配置来源。4.2 gRPC 服务配置重试与超时google/example/library/v1/library_grpc_service_config.json 为生成的客户端定义了分组重试策略是理解 Google 客户端默认行为的关键配置读操作组GetShelf、ListShelves、DeleteShelf、GetBook、ListBooks、DeleteBook、UpdateBooktimeout: 60smaxAttempts: 5initialBackoff: 0.100smaxBackoff: 60sbackoffMultiplier: 1.3可重试状态码为DEADLINE_EXCEEDED与UNAVAILABLE——读操作天然幂等因此允许自动重试写操作组CreateShelf、MergeShelves、CreateBook、MoveBook同样timeout: 60s、5 次尝试但retryableStatusCodes为空数组——写操作非幂等客户端默认不重试。这一读可重试、写不重试的默认策略体现了 Google API 客户端对幂等性风险的保守处理原则也直接复用到生成出的各语言客户端中。五、GAPIC 代码生成一份 proto八种语言5.1 生成配置google/example/library/v1/library_example_gapic.yaml 是 GAPIC 的生成配置为特定语言指定代码生成参数例如 Java 的包名com.google.cloud.example.library.v1type: com.google.api.codegen.ConfigProto config_schema_version: 2.0.0 language_settings: java: package_name: com.google.cloud.example.library.v15.2 BUILD.bazel多语言构建矩阵v1/BUILD.bazel 由 BuildFileGenerator 自动生成是展示 Google API 多语言产物布局的最佳样本。其核心链路为library_protoproto_library依赖google/api下的 annotations/client/field_behavior/resource 及 protobuf 的 empty、field_masklibrary_proto_with_info额外并入//google/cloud:common_resources_proto用于生成带资源定义信息的描述符随后以*_gapic_library规则分别产出各语言客户端java_gapic_library、go_gapic_library、py_gapic_library、php_gapic_library、nodejs_gapic_library、ruby_cloud_gapic_library、csharp_gapic_library另有cc_grpc_library产出 C gRPC 桩每种语言还配套*_gapic_assembly_pkg打包规则如google-cloud-example-library-v1-java、example-library-v1-py、google-cloud-example-library-v1-ruby等直接产出可发布的客户端包。从构建定义可以推断几个通用事实所有语言的 gapic 规则都显式传入service_yaml //google/example/library:library_example_v1.yaml与grpc_service_config library_grpc_service_config.json且transport grpcrest、rest_numeric_enums True——即现代 Google 客户端默认同时支持 gRPC 与 REST 两种传输方式。此外该文件还内置了java_gapic_test_suite覆盖LibraryServiceClientTest与LibraryServiceClientHttpJsonTest与py_gapic_test说明示例服务的构建产物会同步生成并运行语言级测试这正是该示例用于验证工具链的目的所在。顶层的 google/example/library/BUILD.bazel 仅一行exports_files(glob([*.yaml]))将 service config 暴露给其他规则引用。六、如何查看与使用该示例是 googleapis 仓库的一部分无需部署任何真实服务即可学习阅读定义以 v1/library.proto 为主线对照google.api注解源码google/api/annotations.proto、google/api/client.proto、google/api/resource.proto逐条理解每个 RPC 的语义对比配置将 library_example_v1.yaml 与 library_grpc_service_config.json 对应到 11 个方法上掌握服务配置与重试策略的书写格式体验生成如本机装有 Bazel可在仓库根目录执行bazel build //google/example/library/v1:all观察 Java/Go/Python 等语言的客户端代码与测试被生成出来作为模板复用编写自己的 Google 风格 API 时可仿照Shelf/Book的两级父子资源结构、{parent...}路径模板与:custom_verb动作写法。七、小结Example Library API 虽然只有一句 README 描述但其源码构成了一个完整的「Google API 定义 多语言代码生成」教学闭环library.proto定义了资源模型与 11 个 RPC 的语义和 REST 映射两个 yaml/json 配置决定了服务的 deadline、超时与重试策略而BUILD.bazel则展示了如何用一套定义产出 8 种语言的客户端库。对于希望理解 googleapis 仓库组织方式、或需要设计资源导向 API 的开发者google/example/library 是一个可直接研读与复用的最小范本。参考文件服务介绍README.mdAPI 完整定义v1/library.proto服务配置library_example_v1.yamlGAPIC 生成配置v1/library_example_gapic.yamlgRPC 重试配置v1/library_grpc_service_config.json多语言构建定义v1/BUILD.bazel注解依赖google/api/annotations.proto、google/api/resource.proto、google/api/field_behavior.proto【免费下载链接】googleapisPublic interface definitions of Google APIs.项目地址: https://gitcode.com/GitHub_Trending/go/googleapis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表