【问题标题】:Using x-google-endpoints OpenAPI extension with multiple API versions in Cloud Endpoints在 Cloud Endpoints 中使用具有多个 API 版本的 x-google-endpoints OpenAPI 扩展
【发布时间】:2019-10-21 07:15:04
【问题描述】:

我正在尝试将两个 API 版本部署到 Google Cloud Endpoints,但最终在部署过程中遇到了配置问题。

API 定义api-1.yaml 如下所示:

swagger: "2.0"
info:
  description: "API"
  title: "API"
  version: "1.0.0"
host: "api.endpoints.GCP_PROJECT.cloud.goog"
basePath: "/v1"
x-google-api-name: v1
x-google-endpoints:
- name: "api.endpoints.GCP_PROJECT.cloud.goog"
  target: "IP_ADDRESS"
...

如果单独部署,这很好用。但是,如果添加了api-2.yaml

swagger: "2.0"
info:
  description: "API"
  title: "API"
  version: "2.0.0"
host: "api.endpoints.GCP_PROJECT.cloud.goog"
basePath: "/v2"
x-google-api-name: v2
x-google-endpoints:
- name: "api.endpoints.GCP_PROJECT.cloud.goog"
  target: "IP_ADDRESS"
...

这会导致部署错误:OpenAPI spec is invalid. Multiple endpoint entries are defined in the extension \'x-google-endpoints\'. At most one entry is allowed.

从一个yaml 文件中删除x-google-endpoints 扩展名有效,但它会使另一个yaml 文件不完整,因此不是最佳解决方案。

在部署期间合并/验证 yaml 文件是否存在问题? x-google-endpoints 扩展可以用来为版本化 API 定义 .cloud.goog 域吗?

【问题讨论】:

    标签: google-cloud-endpoints openapi


    【解决方案1】:

    有两种方法可以做到这一点:

    1) 版本在域名中,如v1-api.endpoints.GCP_PROJECT.cloud.goog。 您定义和部署两个服务;一个用于 v1,另一个用于 v2。每个都有自己的 IP、正确的服务名称和自己的后端。这是最直接最简单的方法。

    2) 版本在路径中,如 api.endpoints.GCP_PROJECT.cloud.goog/v1。您只能定义和部署一项服务。但是你有两个后端。这是一个棘手的问题。您可以使用 OpenApi 规范中的 x-google-backend 扩展并部署一个 Cloud Endpoint 服务。

    【讨论】:

    • 选项 2 是我正在使用的东西。 basePath 对应于v1v2。在这种情况下我应该如何定义x-google-endpoints?此处的指南 (cloud.google.com/endpoints/docs/openapi/…) 说我应该为每个版本制作单独的 openApi yaml 文件,但似乎 x-google-endpoints 不能复制到两者。
    【解决方案2】:

    您正在使用两个 ESP 代理:v1_esp -> v1、v2_esp -> v2。每个代理都有自己的 IP,您正在尝试将域名绑定到两个 IP。这是不支持的。

    我的建议是通过使用 x-google-backend 来使用一个 ESP,例如 esp -> v1 + v2。 1)在openApi.yaml中

    路径: /v1/路径1: ... x-谷歌后端: 地址:v1_host # 为所有路径/方法执行上述操作

    /v2: ... x-谷歌后端: 地址:v2_host # 为所有路径/方法执行上述操作

    x-google 端点: - 名称:“api.endpoints.GCP_PROJECT.cloud.goog” 目标:“IP_ADDRESS”

    2) 在将请求发送到后端之前,添加 --enable_backend_routing 和 --rewrite 以删除 /v1 和 /v2 前缀。

    我们还没有测试过这样的部署,但是你可以试试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2017-01-07
      • 2017-08-23
      相关资源
      最近更新 更多