【问题标题】:Spring Boot service shuts down automatically in idle or after service too many requestsSpring Boot 服务在空闲或服务过多请求后自动关闭
【发布时间】:2021-09-13 06:51:20
【问题描述】:

我有基于 v2.1.4.RELEASE 的“my-app”spring boot 服务。该服务充当我所有微服务的控制器。我正在使用 eureka 来注册所有其他微服务以及这个我的应用程序(控制器)。我从这项服务中遇到了一些不寻常的行为。

  1. 在空闲模式下它会自动停止响应。

  2. 当服务过多请求时,它会在一段时间后停止响应。

    在挖掘日志后,我发现了以下堆栈跟踪:

01-07-2021 09:32:19.675 [AsyncResolver-bootstrap-executor-0] INFO  c.n.d.s.r.aws.ConfigClusterResolver.getClusterEndpoints - Resolving eureka endpoints via configuration
01-07-2021 09:32:20.057 [Thread-13] INFO  c.n.l.PollingServerListUpdater.run - Shutting down the Executor Pool for PollingServerListUpdater
01-07-2021 09:32:20.058 [Thread-9] INFO  o.s.c.n.e.s.EurekaServiceRegistry.deregister - Unregistering application MY-APP with eureka with status DOWN
01-07-2021 09:32:20.058 [Thread-9] WARN  c.netflix.discovery.DiscoveryClient.notify - Saw local status change event StatusChangeEvent [timestamp=1625112140058, current=DOWN, previous=UP]
01-07-2021 09:32:20.059 [DiscoveryClient-InstanceInfoReplicator-0] INFO  c.netflix.discovery.DiscoveryClient.register - DiscoveryClient_MY-APP/MY-APP:9c84f59eab3882519f16fd7be15bb138: registering service...
01-07-2021 09:32:20.061 [Thread-9] INFO  c.n.u.c.ShutdownEnabledTimer.cancel - Shutdown hook removed for: NFLoadBalancer-PingTimer-CALLMASTERS
01-07-2021 09:32:20.063 [DiscoveryClient-InstanceInfoReplicator-0] INFO  c.netflix.discovery.DiscoveryClient.register - DiscoveryClient_MY-APP/MY-APP:9c84f59eab3882519f16fd7be15bb138 - registration status: 204
01-07-2021 09:32:20.073 [Thread-9] INFO  c.n.u.c.ShutdownEnabledTimer.cancel - Exception caught (might be ok if at shutdown)
    java.lang.IllegalStateException: Shutdown in progress
            at java.lang.ApplicationShutdownHooks.remove(ApplicationShutdownHooks.java:82)
            at java.lang.Runtime.removeShutdownHook(Runtime.java:239)
            at com.netflix.util.concurrent.ShutdownEnabledTimer.cancel(ShutdownEnabledTimer.java:70)
            at com.netflix.loadbalancer.BaseLoadBalancer.cancelPingTask(BaseLoadBalancer.java:613)
            at com.netflix.loadbalancer.BaseLoadBalancer.shutdown(BaseLoadBalancer.java:864)
            at com.netflix.loadbalancer.DynamicServerListLoadBalancer.shutdown(DynamicServerListLoadBalancer.java:285)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:337)
            at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:271)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:571)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:543)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1055)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:504)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1062)
            at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1057)
            at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1026)
            at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:975)

我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.4.发布 com.akash 我的控制器 0.0.1-快照 我的控制器 1.8
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- new dependency -->

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.12.Final</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.netflix.ribbon</groupId>
        <artifactId>ribbon-core</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.9.1</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<description>core Controller</description>

application.properties

spring.application.name=MY-APP-CONTROLLER
port.no=8585
host.name=localhost
logging.config=configuration/logback.xml
server.ip=http://my-app.eureka.com/eureka/
eureka.client.service-url.default-zone=http://my- 
app.eureka.com/eureka
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=510MB
server.tomcat.max-threads=500
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true

这里有什么需要做的配置吗?

提前感谢您的帮助! :)

【问题讨论】:

  • 你能同时显示eureka的pom依赖和你的application.properties吗?
  • @L_Cleo 我用 pom 和 application.properties 更新了问题

标签: java spring spring-boot microservices netflix-eureka


【解决方案1】:

可能是依赖版本问题

尝试将此添加到您的 pom 中

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然后删除 spring cloud 依赖项中指定的所有版本。例如

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

【讨论】:

  • 感谢@L_Cleo 的帮助。这对我有用。会多观察一段时间。但是您能否解释一下添加上述块的目的是什么?
  • 所以基本上你的 spring-cloud 依赖版本与你的 spring 父版本​​不兼容。虽然它可能不是一个严重的不兼容,但它仍然可能会导致一些错误,比如你的情况。在这种情况下,依赖管理块只是让自动处理 spring-cloud 依赖的版本控制的一种方式。所以所有的spring-cloud依赖都会引用依赖管理标签中的那个特定的pom
  • 好的 知道了。谢谢你的解释:)
  • 如果它解决了您的问题,请将其标记为正确答案,以帮助我和其他有相同问题的用户:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2014-12-13
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多