7

作为我最后一年项目的一部分,我正在使用适用于 Java 的 Cloud Endpoints Frameworks (2.0.1),并且到目前为止相对成功。部署到我的 appspot.com 域时没有任何问题,但是在本地部署时遇到了一些问题。

(以下代码块中对 my-project-id 的任何引用都是我的实际谷歌云项目 ID 的别名)

我有一个带注释的@API 类的有效openapi 描述符(openapi.json),我正在使用“gcloud service-management deploy openapi.json”将其部署到云端点。命令返回成功:

Service Configuration [2017-02-23r0] uploaded for service [api.endpoints.<my-project-id>.cloud.goog]

然后我将返回的 config_id 映射到我的 app.yaml 中的正确 endpoints_api_service

endpoints_api_service:
  name: api.endpoints.<my-project-id>.cloud.goog
  config_id: 2017-02-23r0

此服务由 gcloud cli 工具使用“gcloud service-management list”列出

    NAME                                                           TITLE
    storage-component.googleapis.com                 Google Cloud Storage
    api.endpoints.<my-project-id>.cloud.goog         api.endpoints.<my-project-id>.cloud.goog
    etc...

和“gcloud service-management configs list --service api.endpoints.my-project-id.cloud.goog”

CONFIG_ID        SERVICE_NAME
2017-02-23r0     api.endpoints.<my-project-id>.cloud.goog
... other version configs

并且可以在我的 appspot.com 域上访问(我可以调用端点并接收正确的响应)

我正在尝试使用 java 的 maven appengine 插件(mvn appengine:devserver)在 localhost 上部署我的项目,但是在码头启动时,我遇到了以下异常:

 WARNING: Failed startup of context com.google.appengine.tools.development.DevAppEngineWebAppContext...

com.google.api.config.ServiceConfigException: Failed to fetch default config version for service 'api.endpoints.<my-project-id>.cloud.goog'. No versions exist!
at com.google.api.config.ServiceConfigSupplier.fetchLatestServiceVersion(ServiceConfigSupplier.java:155)
....

然后,部署陷入无休止的循环,尝试启动码头,并被该错误消息击中,然后重新启动等。任何访问 localhost:8080 的尝试都会导致“503:找不到服务”错误

我假设我的应用程序的本地部署能够访问使用“gcloud service-management deploy”部署的服务配置,就像appspot.com 部署一样,但不是这样吗?查看 ServiceConfigSupplier.getchLatestServiceVersion() 的源代码,我收集到 serviceManagement.services().configs().list(my-service-name).execute().getServiceConfigs() 正在返回一个空列表,但为什么这只是发生在本地?

额外的信息

我的 ENDPOINTS_SERVICE_NAME 环境变量匹配“api.endpoints.my-project-id.cloud.goog”

我注意到几天前 com.google.api.config 有一个更新(1.0.2),它依赖于旧版本的 com.google.api.services.servicemanagement(依赖于 v1-rev14 -1.22.0,最新版本是 v1-rev340-1.22.0)我怀疑这是问题所在,但我想我会提到它,因为它包含与异常相关的类(ServiceManagement 由 ServiceConfigSupplier 使用,它正在抛出例外)。也许他们在哪里寻找服务配置不一致?

我很困惑,这有点过头了。我不喜欢必须删除端点,因为我开始喜欢它,但我们也不能真正失去对开发服务器的使用。我希望有人可以对这个问题有所了解。

4

7 回答 7

4

这不是一个修复,但我能够通过使用https://stackoverflow.com/a/41493548/1410035中的建议来解决这个问题。

即,注释掉ServiceManagementConfigFilter

b) 从 web.xml 中注释掉 ServiceManagementConfigFilter ,即

<!--
    <filter>
      <filter-name>endpoints-api-configuration</filter-name>
      <filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class>
   </filter>
-->

<!--    
<filter-mapping>
    <filter-name>endpoints-api-configuration</filter-name>
    <servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>
-->

请注意,您必须注释掉filter 并且filter-mapping它们在文件中并不相邻。

我发现我不需要删除链接答案中“a”点中提到的缩放块。

于 2017-04-11T04:36:10.290 回答
3

如果您已提取所有最近的更新,这可能与权限问题有关。git pull此外,使用以下命令检查您的 Cloud SDK 是否是最新的:gcloud components update

假设您按照https://cloud.google.com/endpoints/docs/frameworks/java/quickstart-frameworks-java中列出的说明进行操作。要解决此问题,您可以创建具有必要权限的服务帐户或使用命令gcloud auth application-default login

您可以在https://cloud.google.com/sdk/docs/authorizing使用 Cloud SDK gcloud 设置服务帐户

如果您还有问题,请告诉我。

至于命令gcloud auth application-default login。根据帮助描述:

通过 Web 流获取用户访问凭据,并将它们放在应用程序默认凭据的众所周知的位置,以将它们用作服务帐户的代理。

当您使用此命令时,它会获取 gcloud 您的 Gmail 帐户的凭据。something@gmail.com 然后将凭据存储在已知包含应用程序凭据的位置。

于 2017-03-30T03:36:29.323 回答
0

如果您更改了要对其进行身份验证的 Google Cloud 项目,则可能会发生这种情况(如果其他人更改了项目,则可能会在您从源代码管理中提取更改时发生)。在这种情况下,您用于旧项目的服务帐户凭据将不再有效,您可以通过运行以下命令对新项目进行身份验证:

gcloud auth application-default login
于 2019-01-07T04:18:38.920 回答
0

对我来说,问题是我没有部署开放 API。所以运行以下解决了这个问题:

gcloud endpoints services deploy openapi.json
于 2021-07-05T16:48:02.817 回答
0

要记住的另一件事是您的服务帐户具有正确的权限,您的服务帐户如下所示

[project ID]@appspot.gserviceaccount.com. 

默认情况下,它是 Project(Editor),至少您需要将其提供为 Service Controller 角色。

如果它消失了,那么您可以按照这些说明重新添加。

于 2017-11-06T01:07:42.677 回答
0

它与“gradle appengineRun”一起工作,但在 IntelliJ Idea 项目中,我必须替换 web.xml 和 appengine-web.xml 中的所有 ${endpoints.project.id} 才能从 IntelliJ 运行/调试 localhost(从 gradle 源导入,安装Google Cloud Tools 插件并从 Tools/GoogleCloudTools/Run 在本地 App Engine 标准开发服务器上设置运行/调试配置)。

我的错误是:无法获取服务“echo-api.endpoints.${endpoints.project.id}.cloud.goog”的默认配置版本。不存在版本!

cloud.google.com文档只有 Maven 构建示例 Gradle 构建位于github.com

于 2017-06-08T21:54:14.027 回答
0

我遇到了这个相当相似的错误,

endpoints.repackaged.com.google.api.config.ServiceConfigException:无法获取服务配置(状态代码 404):找不到服务配置名称和配置 ID。仔细检查过滤器初始化参数 endpoints.projectId 和 endpoints.serviceName 是否设置正确。

我的问题是在我的 appengine-web.xml 中指定了ENDPOINTS_SERVICE_VERSION环境变量。所以基本上,在我的情况下删除这些行就足够了(因为端点使用最新的ENDPOINTS_SERVICE_VERSION 如果没有提供。):

<env-var name="ENDPOINTS_SERVICE_VERSION" value="1" />
于 2019-03-31T11:47:55.640 回答