3. Service Catalog 接口概述

Service Catalog 作为云平台的服务目录中枢,对外暴露的接口是平台门户、CLI 工具、自动化流水线进行服务注册、发现、订阅与生命周期管理的核心通道。本章从接口类型、文档规范、版本策略和认证方式四个维度,系统梳理 Service Catalog 的接口体系。

3.1 接口类型:RESTful 与 gRPC 双协议

Service Catalog 同时支持 RESTful 和 gRPC 两种接口协议,分别面向不同的调用场景和客户端类型。

对比维度 RESTful (HTTP/JSON) gRPC (HTTP/2 + Protobuf)
传输协议 HTTP/1.1 或 HTTP/2 HTTP/2
数据格式 JSON / YAML Protocol Buffers (二进制)
接口定义 OpenAPI 3.0 (Swagger) Proto 文件
适用场景 Web 门户、浏览器、第三方集成 微服务间高频调用、高性能场景
流式支持 Server-Sent Events (SSE) 原生双向流、服务端流、客户端流
浏览器兼容 原生支持 需 gRPC-Web 代理
架构建议:平台门户基线校验场景优先使用 RESTful 接口,便于前端调试和抓包分析;内部服务编排与事件推送场景推荐使用 gRPC,以获得更低的延迟和更强的类型约束。
Service Catalog 双协议调用架构 平台门户 (Web) RESTful 调用 内部微服务 gRPC 调用 CLI / CI 流水线 RESTful 调用 API 网关 协议转换 / 路由 认证 / 限流 Service Catalog 服务注册 服务发现 版本管理 订阅管理 健康检查 策略校验 审计日志 事件推送 RESTful 接口用于门户和 CLI;gRPC 接口用于微服务间高性能通信,支持双向流

3.2 接口文档规范

Service Catalog 所有 RESTful 接口遵循 OpenAPI 3.0 规范编写文档,gRPC 接口通过 Proto 文件 定义。文档是接口调用的唯一权威参考,也是平台门户基线校验的比对基准。

3.2.1 RESTful 接口文档要求

  • 路径设计:采用资源导向风格,如 /api/v1/catalog/services、/api/v1/catalog/plans。
  • HTTP 方法:GET(查询)、POST(创建)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除)。
  • 请求/响应结构:统一封装 code、message、data 三层结构。
  • 错误码:使用标准 HTTP 状态码 + 业务错误码组合。
  • 示例:每个接口必须包含至少一个请求示例和一个响应示例。
OpenAPI 文档片段示例:
openapi: 3.0.3
info:
  title: Service Catalog API
  version: 1.2.0
paths:
  /api/v1/catalog/services:
    get:
      summary: 获取服务列表
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 1
        - name: size
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: 成功返回服务列表
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: integer
                    example: 0
                  message:
                    type: string
                    example: "success"
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Service'

3.2.2 gRPC Proto 文件规范

  • 包名:使用 catalog.v1 格式,与服务版本对齐。
  • 服务定义:每个 RPC 方法必须包含明确的请求和响应消息类型。
  • 字段编号:从 1 开始连续编号,预留扩展区间(1000+)。
  • 注释:每个字段和服务方法必须附带中文或英文注释。
syntax = "proto3";
package catalog.v1;

service CatalogService {
  // 获取服务详情
  rpc GetService (GetServiceRequest) returns (GetServiceResponse);
  // 订阅服务
  rpc SubscribeService (SubscribeRequest) returns (SubscribeResponse);
}

message GetServiceRequest {
  string service_id = 1;   // 服务唯一标识
  string version = 2;      // 服务版本号
}

message GetServiceResponse {
  int32 code = 1;          // 状态码
  string message = 2;      // 状态描述
  Service data = 3;        // 服务详情
}

3.3 接口版本策略

Service Catalog 采用 语义化版本 + URL 路径版本 的双重版本管理策略,确保向后兼容和平滑升级。

版本层级 示例 变更范围 兼容性要求
Major (主版本) v1 → v2 接口路径、请求结构、响应结构 不兼容,需同步升级客户端
Minor (次版本) v1.1 → v1.2 新增字段、新增可选参数 向后兼容,旧客户端可继续使用
Patch (补丁) v1.1.0 → v1.1.1 Bug 修复、性能优化 完全兼容,无感知升级
版本策略要点:
  • URL 路径中只体现 Major 版本号,如 /api/v2/catalog/services。
  • Minor 和 Patch 版本通过响应头 X-API-Version 返回。
  • 废弃接口需提前至少 3 个 Minor 版本发布 Deprecation 警告。
  • 平台门户基线校验时,必须确认目标接口的 Major 版本与文档一致。
Service Catalog 接口版本生命周期 v1.0.0 稳定 v1.1.0 新增 v1.2.0 新增 v1.x 废弃 v2.0 当前稳定版 持续演进 3 个 Minor 后废弃 新 Major 版本策略关键规则 • Major 版本变更:URL 路径更新,客户端必须适配 • Minor 版本变更:仅新增字段,旧客户端不受影响

3.4 接口认证方式

Service Catalog 接口采用 多因子认证 体系,根据调用方类型和敏感度级别选择不同的认证组合。

3.4.1 认证方式对比

认证方式 凭证类型 安全等级 适用场景
Bearer (JWT) Access + Refresh 高 平台门户用户调用
静态密钥字符串 中 CLI 工具、自动化脚本
mTLS (双向 TLS) 客户端证书 + 服务端证书 极高 微服务间内部调用
OAuth 2.0 Client Credentials Client ID + Client Secret 高 第三方系统集成

3.4.2 认证流程要点

  • 获取:调用 /api/v1/auth/ 接口,传入用户名/密码或 Client 凭证,返回 JWT 。
  • 传递:所有 API 请求在 HTTP Header 中携带 Authorization: Bearer <>。
  • 有效期:Access 默认 30 分钟,Refresh 默认 7 天。
  • 传递:通过 Header X- 传递,适用于服务间低敏感度调用。
  • 基线校验要求:平台门户基线校验时,必须验证认证失败场景的 HTTP 状态码是否为 401(未认证)或 403(无权限)。
认证最佳实践:平台门户基线校验脚本中,建议先调用 接口获取有效凭证,再执行后续业务接口校验。避免在代码中硬编码长期有效的 。

3.4.3 认证失败响应示例

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
  "code": 401001,
  "message": " expired or invalid",
  "data": null
}
HTTP/1.1 403 Forbidden
Content-Type: application/json

{
  "code": 403001,
  "message": "Insufficient permissions: requires 'catalog:admin' scope",
  "data": null
}