问题:

devops的运维平台发布服务后,在服务运行一段时间后,服务器会自动进行重启。

解决一:

用的发布平台是有健康检查机制的,之前已经由于健康检查机制机制已经吃了一次亏,上次是因为这个平台无法自动识别健康检查的url,需要手动去配置这个springboot自动健康检查的路径(/actuator/health)。一开始不知道这个情况,在没有运维支持的情况下,后来从平台的帮助运维文件中才发现了这个问题的解决方法。这个问题从一开始出现到最后解决,足足经历了接近一周的时间。

解决二:

排查了一些配置的检查发现并没有自定义的,后来检查nacos中的配置文件发现有个无用的邮件配置,写在了spring的下面,这个邮件是无效的,导致了邮件检查失败("mail":{"status":"DOWN"}),整体返回失败。删除了这个无效的配置后,问题解决。

第一次健康检查在这个平台出现重启问题的时候,初始的问题排查方向根本没有考虑到健康检查的问题。由于在关闭的过程中nacos打印的日志较多,出现了线程池关闭的日志。一开始花了很长的时间去排查,nacos源码、线程池、系统中的pom依赖版本、数据库的连接、redis、mq等方向。由于是更换了一个发布环境,这些配置在原始的系统都是可以正常运行的。在经历了很长时间的排查失败后,最后在百度上几乎把解决方案的帖子翻了十遍左右,都没有我这个问题的解决方案。最后也是猛然想起客户方的技术说起的一句"健康检查"的话,后来才转变思路开始考虑devops平台的问题。一开始用的测试环境的devops也是正常的,但是给的正式环境就有这个问题。转回这个思路之后也是一头雾水,在对比测试环境和正式的配置、内存、资源等几个方向排查过后,依旧没有找到问题。这个时候,公司的其他的资源提供了0的支持,最后在心态爆炸后,跑路的想法非常强烈。开始想着不如就在这学学人家的平台吧,就在这看的过程中,发现了他们的devops的技术支持文档。在看到容器重启的问题可能情况后,又重新找到了一次救命稻草。虽然依然没有找到完全一模一样的问题,但是看到了一个设置健康检查路径的地方。山重水复疑无路,在配置上这个健康检查的路径后(/actuator/health),服务依然没能启动成功。后来重新检查了一下这个平台可配置项,发现有一个健康检查的延时设置。由于第一次健康检查的接口调用太早,部分服务启动的时间过长,导致第一次调用的时候健康检查调用失败了。后来这个配置后,重启的问题解决了。

第二次健康检查问题出现的时候,是一个单个的服务进行了自动重启,但是其他的服务都正常。这次检查了一下上次用过的三板斧,已经解决不了问题了。这次的问题处理还是体现出自己太嫩,其实还容易想到还是健康检查导致的问题,但是自己在用了上次的三板斧之后,又把排查问题的方向又转向nacos,因为nacos打印的服务ack server的日志实在太有迷惑性了。(在这两次的问题中没有抛出过一次异常)这次大概是花了一上午的时间,午饭的时间也用上了。最后看着服务调用的日志中,看到了健康检查的返回值,想着自己调用一下看看返回值。果然发现了问题(如图-健康检查的返回值),返回值("status":"DOWN"),果然是这个问题。排查了一些配置的检查发现并没有自定义的,后来检查nacos中的配置文件发现有个无用的邮件配置,写在了spring的下面,这个邮件是无效的,导致了邮件检查失败("mail":{"status":"DOWN"}),整体返回失败。删除了这个无效的配置后,问题解决。

有时候解决问题的时候,需要转换思维,不能一直重试。有时候出去走走是一件比较办法,我自己本身有时候容易上头,做一件事做不出来会很着急,如果去做别的事情也做不好。但是强制自己去个洗手间或者做点与工作无关的事情也是一个不错的办法。

失败后的容器关闭日志:

# 服务关闭打印的日志

2023-01-14 14:18:05.333 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [149] -| com.alibaba.nacos.client.naming.beat.BeatReactor do shutdown stop
2023-01-14 14:18:05.333 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [413] -| com.alibaba.nacos.client.naming.core.HostReactor do shutdown begin
2023-01-14 14:18:08.368 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [132] -| com.alibaba.nacos.client.naming.core.PushReceiver do shutdown begin
2023-01-14 14:18:11.405 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [136] -| com.alibaba.nacos.client.naming.core.PushReceiver do shutdown stop
2023-01-14 14:18:11.405 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [132] -| com.alibaba.nacos.client.naming.backups.FailoverReactor do shutdown begin
2023-01-14 14:18:11.406 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [134] -| com.alibaba.nacos.client.naming.backups.FailoverReactor do shutdown stop
2023-01-14 14:18:11.406 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [418] -| com.alibaba.nacos.client.naming.core.HostReactor do shutdown stop
2023-01-14 14:18:11.406 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [719] -| com.alibaba.nacos.client.naming.net.NamingProxy do shutdown begin
2023-01-14 14:18:11.406 [WARN] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [72] -| [NamingHttpClientManager] Start destroying NacosRestTemplate
2023-01-14 14:18:11.406 [WARN] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [79] -| [NamingHttpClientManager] Destruction of the end
2023-01-14 14:18:11.407 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.identify.CredentialWatcher [105] -| [null] CredentialWatcher is stopped
2023-01-14 14:18:11.407 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.identify.CredentialService [98] -| [null] CredentialService is freed
2023-01-14 14:18:11.407 [INFO] [SpringContextShutdownHook] com.alibaba.nacos.client.naming [723] -| com.alibaba.nacos.client.naming.net.NamingProxy do shutdown stop
2023-01-14 14:18:11.410 [INFO] [SpringContextShutdownHook] org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor [218] -| Shutting down ExecutorService 'taskExecutor'
2023-01-14 14:18:11.411 [WARN] [SpringContextShutdownHook] org.springframework.beans.factory.support.DisposableBeanAdapter [290] -| Destroy method 'close' on bean with name 'nacosServiceRegistry' threw an exception: java.lang.NullPointerException
2023-01-14 14:18:11.417 [INFO] [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource [350] -| HikariPool-1 - Shutdown initiated...
2023-01-14 14:18:11.484 [INFO] [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource [352] -| HikariPool-1 - Shutdown completed.
2023-01-14 14:18:11.568 [INFO] [SpringContextShutdownHook] org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler [218] -| Shutting down ExecutorService 'taskScheduler'
2023-01-14 14:18:11.694 [INFO] [SpringContextShutdownHook] org.springframework.integration.monitor.IntegrationMBeanExporter [495] -| Summary on shutdown: nullChannel
2023-01-14 14:18:11.695 [INFO] [SpringContextShutdownHook] org.springframework.integration.monitor.IntegrationMBeanExporter [495] -| Summary on shutdown: bean 'errorChannel'
2023-01-14 14:18:11.695 [INFO] [SpringContextShutdownHook] org.springframework.integration.monitor.IntegrationMBeanExporter [498] -| Summary on shutdown: bean '_org.springframework.integration.errorLogger.handler' for component '_org.springframework.integration.errorLogger'
# 健康检查失败的返回值
{
    "status":"DOWN",
    "components":{
        "db":{
            "status":"UP",
            "details":{
                "database":"MySQL",
                "validationQuery":"isValid()"
            }
        },
        "discoveryComposite":{
            "status":"UP",
            "components":{
                "discoveryClient":{
                    "status":"UP",
                    "details":{
                        "services":[
                            "mplm-cloud-fee"
                        ]
                    }
                }
            }
        },
        "diskSpace":{
            "status":"UP",
            "details":{
                "total":333042499584,
                "free":327410126848,
                "threshold":10485760,
                "exists":true
            }
        },
        "livenessState":{
            "status":"UP"
        },
        "mail":{
            "status":"DOWN",
            "details":{
                "location":"xxx.xxx.163.com:-1",
                "error":"javax.mail.MessagingException: Could not convert socket to TLS"
            }
        },
        "nacosConfig":{
            "status":"UP"
        },
        "nacosDiscovery":{
            "status":"UP"
        },
        "ping":{
            "status":"UP"
        },
        "rabbit":{
            "status":"UP",
            "details":{
                "version":"3.7.8"
            }
        },
        "reactiveDiscoveryClients":{
            "status":"UP",
            "components":{
                "Simple Reactive Discovery Client":{
                    "status":"UP",
                    "details":{
                        "services":[

                        ]
                    }
                }
            }
        },
        "readinessState":{
            "status":"UP"
        },
        "redis":{
            "status":"UP",
            "details":{
                "version":"5.0.3"
            }
        },
        "refreshScope":{
            "status":"UP"
        }
    },
    "groups":[
        "liveness",
        "readiness"
    ]
}
#  第二次导致问题的配置,删除后问题恢复
spring:
  mail:
    host: smtp.xxx.163.com
    username: "xxxx@xxx.com"
    password: "fffffff"
    properties:
      mail:
        smtp:
          smtp: true
          starttls:
            enable: true
            required: true