com.google.api.config.ServiceConfigSupplier - 无法获取服务的默认配置版本(仅在localhost上)

Sam*_*den 7 java google-app-engine maven google-cloud-endpoints openapi

我正在将Java端点框架(2.0.1)用于Java作为我最后一年项目的一部分,到目前为止它已经相对成功.部署到我的appspot.com域时没有任何问题,但是,我在本地部署时遇到了一些问题.

(以下代码块中对my-project-id的任何引用都是我实际的Google云项目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]
Run Code Online (Sandbox Code Playgroud)

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

endpoints_api_service:
  name: api.endpoints.<my-project-id>.cloud.goog
  config_id: 2017-02-23r0
Run Code Online (Sandbox Code Playgroud)

该服务由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...
Run Code Online (Sandbox Code Playgroud)

和"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
Run Code Online (Sandbox Code Playgroud)

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

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

 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)
....
Run Code Online (Sandbox Code Playgroud)

部署然后陷入无休止的循环,尝试启动jetty,并被该错误消息,并重新启动等.任何尝试访问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)我怀疑这是问题,但我想我会提到它,因为它包含与异常相关的类(ServiceManfigSupplier使用ServiceManagement,它正在抛出例外).他们在寻找服务配置的地方可能存在不一致之处?

我很难过,这有点过头了.我不喜欢删除端点,因为我开始喜欢它,但我们也不能真正失去对我们的devserver的使用.我希望有人能够对这个问题有所了解.

Fra*_*dad 3

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

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

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

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

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

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

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