com.google.api.config.ServiceConfigSupplier - 无法获取服务的默认配置版本(仅限本地主机)

时间:2017-02-23 16:19:52

标签: java maven google-app-engine google-cloud-endpoints openapi

我正在使用Cloud Endpoints Frameworks(2.0.1)for 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]

然后我将返回的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上部署我的项目,但是在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)
....

部署然后陷入无休止的循环,试图启动jetty,并被该错误消息,并重新启动等等。任何访问localhost:8080的尝试都会导致“503:Service not found”错误

我认为我的应用程序的本地部署能够访问使用“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的使用。我希望有人能对这个问题略微说清楚。

7 个答案:

答案 0 :(得分: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。根据帮助说明:

  

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

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

答案 1 :(得分:3)

这不是解决办法,但我能够使用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”点中提到的缩放块。

答案 2 :(得分:0)

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

我的错误是: 无法获取服务&#39; echo-api.endpoints的默认配置版本。$ {endpoints.project.id} .cloud.goog&#39;。没有版本!

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

答案 3 :(得分:0)

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

[project ID]@appspot.gserviceaccount.com. 

默认情况下,它是Project(编辑器),至少您需要将其作为服务控制器角色提供。

如果它消失了,那么您可以按these instructions重新添加。

答案 4 :(得分:0)

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

gcloud auth application-default login

答案 5 :(得分:0)

我遇到了类似的错误

  

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

对我来说,问题是在我的appengine-web.xml中指定了 ENDPOINTS_SERVICE_VERSION 环境变量。因此,基本上,对于我而言,删除行就足够了(因为端点使用最新的 ENDPOINTS_SERVICE_VERSION if not provided any.):

<env-var name="ENDPOINTS_SERVICE_VERSION" value="1" />

答案 6 :(得分:0)

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

gcloud endpoints services deploy openapi.json