spring boot 应用程序实际上在端口 0 上运行,而不是随机运行

Ste*_*rCS 10 port spring spring-boot

我的 application.properties 文件包含

server.port=0
Run Code Online (Sandbox Code Playgroud)

应该由spring boot捕获并将其设置为随机端口。

相反,它实际上在端口 0 上启动它,甚至在 spring 日志中也是如此:

01/Mar/2019 12:50:43,600- TomcatEmbeddedServletContainer: Tomcat initialized with port(s): 0 (http)
Run Code Online (Sandbox Code Playgroud)

Eureka 将其视为“向上”服务,并提供该服务的链接 ( localhost:0/info),单击它会显示我的浏览器“ ERR_ADDRESS_INVALID”,猜测是因为它不是有效端口。

应用程序正在运行以向 Eureka 发送心跳,但为什么 spring 没有将其设置为随机端口号?

有什么设置可以防止随机吗?如果是这样如何取消它们?

编辑: server.port=0 的任何新启动应用程序都是随机的,它只是不适用于具有大量依赖项的现有 Spring Boot 应用程序

Fra*_*cio 10

它实际上并不是在端口 0 上启动它,而是在一个随机端口上启动它。在您的尤里卡服务器中,您将看到它位于端口 0 中,但如果您将自己置于最上面而不单击,您将在浏览器栏中看到端口不同。

在日志中它显示:

INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 0 (http)
Run Code Online (Sandbox Code Playgroud)

但后来改变了它:

INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 64039 (http) with context path ''
INFO  o.s.c.n.e.s.EurekaAutoServiceRegistration - Updating port to 64039
Run Code Online (Sandbox Code Playgroud)

因此,如果您在相互通信时遇到问题,那是因为在每个以随机端口启动的微服务中,您都必须在application.ymla 中配置以preferIpAddress通过 ip 而不是通过主机名找到它:

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:portServer/eureka/
  instance:
    preferIpAddress: true
Run Code Online (Sandbox Code Playgroud)


Mik*_*kov 5

尝试以编程方式设置端口:

@Configuration
public class ServletConfig {

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return (container -> {
            container.setPort(new Random().nextInt(65_535) + 1_000);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,这可能会有所帮助:Eureka 在随机端口上运行微服务时无法找到端口