V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
telnetning
V2EX  ›  Java

Spring 启动阶段接口 500

  •  
  •   telnetning · 2021-03-17 11:32:58 +08:00 · 2905 次点击
    这是一个创建于 1348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Spring 新人,请教下这个问题,搜索相关问题只搜索到 dubbo 延迟暴露 相关的,但是这个项目不是 dubbo 的,就是一般的 Spring Boot 应用。

    问题是,在 Spring 启动阶段,会有大概 10s 的端口已监听但是访问 500 的情况。

    具体是:

    • 0-10s,Spring 还未监听端口
    • 10-20s,Spring 已经监听端口,但是整个应用未加载启动好,访问接口 500
    • 20s 以后,端口访问正常

    请教下大家,这个问题应该如何解决呢,正常的理想情况是,在整个应用启动完整之后,才监听端口,保证监听即可用。

    22 条回复    2021-03-19 10:39:36 +08:00
    huifer
        1
    huifer  
       2021-03-17 11:34:46 +08:00
    Bean 实例化顺序
    chendy
        2
    chendy  
       2021-03-17 11:44:20 +08:00
    你确定是因为未启动好报的 500 么?应用的报错是什么?
    启动 20s 多少慢了点吧……
    telnetning
        3
    telnetning  
    OP
       2021-03-17 11:53:07 +08:00
    @chendy 应该是的,中间报错的请求,是 getBean 的结果为 null
    telnetning
        4
    telnetning  
    OP
       2021-03-17 11:54:50 +08:00
    @huifer 多谢,我了解下。是需要让对应的 Bean 在 Web 容器之前加载完成吗?
    Kasumi20
        5
    Kasumi20  
       2021-03-17 12:44:04 +08:00
    Spring 监听端口吗?是 Servlet 容器在监听吧。。。
    huifer
        6
    huifer  
       2021-03-17 12:50:04 +08:00
    @telnetning 不如放出代码在看看,getBean 为 null 就说明 bean 没有加载
    scxiazi
        7
    scxiazi  
       2021-03-17 12:51:56 +08:00   ❤️ 1
    你倒是把报错信息放出来
    telnetning
        8
    telnetning  
    OP
       2021-03-17 14:45:43 +08:00
    @Kasumi20 嗯嗯,是的
    telnetning
        9
    telnetning  
    OP
       2021-03-17 14:46:04 +08:00
    @scxiazi 公司网络限制,贴不出来。。。
    telnetning
        10
    telnetning  
    OP
       2021-03-17 14:46:32 +08:00
    @huifer 公司网络限制,贴不出来。。。
    yRebelHero
        11
    yRebelHero  
       2021-03-17 16:31:46 +08:00
    另外的端口监听吗?试试在 Application 这个类 implements CommandLineRunner,再重写 run 方法新建一个线程来监听。我之前也遇到过类似的情况,就是需要监听另外的端口,但是这个端口始终没法监听到,具体报没报错忘了,但是我是这么解决的。
    chenqh
        12
    chenqh  
       2021-03-17 16:48:27 +08:00
    java 启动这么慢的吗?
    telnetning
        13
    telnetning  
    OP
       2021-03-17 16:55:15 +08:00
    @chenqh 我一直以为 Spring 应用就是这么慢来着。。。
    chenqh
        14
    chenqh  
       2021-03-17 17:01:57 +08:00
    @telnetning 我用 py,启动不到 1s 钟的呀,可能是我用轻型框架的原因
    qwerthhusn
        15
    qwerthhusn  
       2021-03-17 17:34:57 +08:00
    报 500 看日志堆栈啊
    arvinsilm
        16
    arvinsilm  
       2021-03-17 18:06:27 +08:00
    加个 filter 之类的东西,系统没启动完成返回统一错误信息
    qinxi
        17
    qinxi  
       2021-03-17 18:10:54 +08:00
    @chenqh #12 解释型语言都快. 没运行到的 py 代码甚至不知道能不能跑
    chenqh
        18
    chenqh  
       2021-03-17 18:33:57 +08:00
    @qinxi 原来是这个原因的吗,嗯嗯,应该是这个原因吧
    bianjp
        19
    bianjp  
       2021-03-17 21:03:34 +08:00
    先使用 Spring Boot Actuator 的健康检查接口检查应用状态,应用就绪后再开放给外部访问。

    https://docs.spring.io/spring-boot/docs/2.4.3/reference/htmlsingle/#boot-features-application-availability-managing
    jimrok
        20
    jimrok  
       2021-03-17 22:07:25 +08:00
    先初始化 bean,再启动 tomcat
    telnetning
        21
    telnetning  
    OP
       2021-03-19 10:31:38 +08:00
    @chenqh Spring 启动肯定比 py 应用启动慢多了的
    telnetning
        22
    telnetning  
    OP
       2021-03-19 10:39:36 +08:00
    @bianjp 是指让网关或者负载均衡器在开放应用给外部之前先检查接口应用状态?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:47 · PVG 20:47 · LAX 04:47 · JFK 07:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.