最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Google Cloud Endpoints - Failed to load service - Stack Overflow

programmeradmin3浏览0评论

Something very strange has just started happening. Our API on Google Cloud Endpoints won't startup. This happened just after trying to deploy to a new test environment. Now we can't deploy to the old test environment either.

We deploy the API, as we always have:

gcloud endpoints services deploy openapi.json

Note that we changed the "host" to the new test URL in the openapi.

openapi.json

{
    "swagger": "2.0",
        "info": {
        "version": "1.2.0",
        "title": "Our App API"
    },
    "host": "test2-ourappapi.appspot",
    "basePath": "/_ah/api",
    "schemes": [
        "https"
    ],
    "consumes": [
        "application/json"
    ],
    "produces": [
        "application/json"
    ],
    "paths": {
       ...
    }
}

Now this appears in the logs when after deploying to GAE.

GAE logs

Failed to load service
endpoints.repackaged.google.api.config.ServiceConfigException: Failed to parse the HTTP response as service configuration
    at endpoints.repackaged.google.api.config.ServiceConfigSupplier.parseHttpResponse(ServiceConfigSupplier.java:197)
    at endpoints.repackaged.google.api.config.ServiceConfigSupplier.fetch(ServiceConfigSupplier.java:170)
    at endpoints.repackaged.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:131)
    at endpoints.repackaged.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:50)
    at endpoints.repackaged.googlemon.base.Suppliers$ExpiringMemoizingSupplier.get(Suppliers.java:241)
    at endpoints.repackaged.google.api.config.ServiceConfigFetcher.fetch(ServiceConfigFetcher.java:41)
    at com.google.api.control.ServiceManagementConfigFilter$1.load(ServiceManagementConfigFilter.java:33)
    at com.google.api.control.ConfigFilter.init(ConfigFilter.java:90)
    at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:140)
    at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
    at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
    at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:273)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:219)
    at org.eclipse.jetty.utilponent.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:225)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(A… [message truncated due to size]

After researching this, it seems like one workaround is to comment out the lines in the web.xml (see below).

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns=";
         xmlns:xsi=";
         xsi:schemaLocation=" .xsd"
         version="3.1">

    <servlet>
        <servlet-name>EndpointsServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>company.api.OurAppApi</param-value>
        </init-param>
        <init-param>
            <param-name>restricted</param-name>
            <param-value>false</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>EndpointsServlet</servlet-name>
        <url-pattern>/_ah/api/*</url-pattern>
    </servlet-mapping>

<!-- COMMENTING THIS OUT WORKS. 
    <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-name>endpoints-api-controller</filter-name>
        <filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class>
        <init-param>
            <param-name>endpoints.projectId</param-name>
            <param-value>test2-ourappapi</param-value>
        </init-param>
        <init-param>
            <param-name>endpoints.serviceName</param-name>
            <param-value>test2-ourappapi.appspot</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>endpoints-api-controller</filter-name>
        <servlet-name>EndpointsServlet</servlet-name>
    </filter-mapping>
</web-app>

appengine-web.xml

  </system-properties>
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns=".0">

  <sessions-enabled>false</sessions-enabled>
  <runtime>java17</runtime>
  <app-engine-apis>true</app-engine-apis>
  <automatic-scaling>
    <min-instances>1</min-instances>
  </automatic-scaling>

  <system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>

  <env-variables>
    <env-var name="ENDPOINTS_SERVICE_NAME" value="test2-ourappapi.appspot" />
  </env-variables>

</appengine-web-app>

I can confirm this works. However, the documentation indicates removing these lines bypassess GCE's management of the endpoint.

What is going on?

Note that I've updated to the latest Google Cloud SDK. I've also run "gcloud auth application-default login" after setting the project.

Something very strange has just started happening. Our API on Google Cloud Endpoints won't startup. This happened just after trying to deploy to a new test environment. Now we can't deploy to the old test environment either.

We deploy the API, as we always have:

gcloud endpoints services deploy openapi.json

Note that we changed the "host" to the new test URL in the openapi.

openapi.json

{
    "swagger": "2.0",
        "info": {
        "version": "1.2.0",
        "title": "Our App API"
    },
    "host": "test2-ourappapi.appspot.com",
    "basePath": "/_ah/api",
    "schemes": [
        "https"
    ],
    "consumes": [
        "application/json"
    ],
    "produces": [
        "application/json"
    ],
    "paths": {
       ...
    }
}

Now this appears in the logs when after deploying to GAE.

GAE logs

Failed to load service
endpoints.repackaged.com.google.api.config.ServiceConfigException: Failed to parse the HTTP response as service configuration
    at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.parseHttpResponse(ServiceConfigSupplier.java:197)
    at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.fetch(ServiceConfigSupplier.java:170)
    at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:131)
    at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:50)
    at endpoints.repackaged.com.google.common.base.Suppliers$ExpiringMemoizingSupplier.get(Suppliers.java:241)
    at endpoints.repackaged.com.google.api.config.ServiceConfigFetcher.fetch(ServiceConfigFetcher.java:41)
    at com.google.api.control.ServiceManagementConfigFilter$1.load(ServiceManagementConfigFilter.java:33)
    at com.google.api.control.ConfigFilter.init(ConfigFilter.java:90)
    at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:140)
    at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)
    at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
    at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
    at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:273)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:219)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:225)
    at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(A… [message truncated due to size]

After researching this, it seems like one workaround is to comment out the lines in the web.xml (see below).

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>EndpointsServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>com.company.api.OurAppApi</param-value>
        </init-param>
        <init-param>
            <param-name>restricted</param-name>
            <param-value>false</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>EndpointsServlet</servlet-name>
        <url-pattern>/_ah/api/*</url-pattern>
    </servlet-mapping>

<!-- COMMENTING THIS OUT WORKS. 
    <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-name>endpoints-api-controller</filter-name>
        <filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class>
        <init-param>
            <param-name>endpoints.projectId</param-name>
            <param-value>test2-ourappapi</param-value>
        </init-param>
        <init-param>
            <param-name>endpoints.serviceName</param-name>
            <param-value>test2-ourappapi.appspot.com</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>endpoints-api-controller</filter-name>
        <servlet-name>EndpointsServlet</servlet-name>
    </filter-mapping>
</web-app>

appengine-web.xml

  </system-properties>
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">

  <sessions-enabled>false</sessions-enabled>
  <runtime>java17</runtime>
  <app-engine-apis>true</app-engine-apis>
  <automatic-scaling>
    <min-instances>1</min-instances>
  </automatic-scaling>

  <system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>

  <env-variables>
    <env-var name="ENDPOINTS_SERVICE_NAME" value="test2-ourappapi.appspot.com" />
  </env-variables>

</appengine-web-app>

I can confirm this works. However, the documentation indicates removing these lines bypassess GCE's management of the endpoint.

What is going on?

Note that I've updated to the latest Google Cloud SDK. I've also run "gcloud auth application-default login" after setting the project.

Share Improve this question edited Jan 20 at 4:58 Mike Dee asked Jan 19 at 15:37 Mike DeeMike Dee 5801 gold badge7 silver badges16 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

I think I discovered the problem. This was in the POM.

<dependency>
    <groupId>com.google.endpoints</groupId>
    <artifactId>endpoints-management-control-appengine-all</artifactId>
    <version>1.0.14</version>
</dependency>

It seems to work when the version is changed to 1.0.15. I don't quite trust it yet. So, I'll have to work with it for a while longer.

发布评论

评论列表(0)

  1. 暂无评论