Spring Boot应用实际上在端口0上运行,而不是随机运行

时间:2019-03-01 18:57:07

标签: spring spring-boot port

我的application.properties文件包含

server.port=0

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

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

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

Eureka将其视为“启动”服务,并提供了指向该服务(localhost:0/info)的链接,单击该链接可得到我的浏览器“ ERR_ADDRESS_INVALID”,这是因为该端口无效。

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

有没有可以防止随机发生的设置?如果可以的话,如何取消它们?

编辑:server.port = 0的任何新引导应用程序都是随机的,它不适用于具有很多依赖性的现有spring boot应用程序

2 个答案:

答案 0 :(得分:7)

它实际上不是在端口0上启动,而是在随机端口上启动。 在您的eureka服务器中,您将看到它在端口0中,但是如果您将自己放在顶部而未单击,则会在浏览器栏中看到端口不同。

在日志中显示:

INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 0 (http)

但稍后对其进行更改:

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

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

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:portServer/eureka/
  instance:
    preferIpAddress: true

答案 1 :(得分:1)

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

@Configuration
public class ServletConfig {

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

此外,这可能会有所帮助:Eureka not able to find port when running microservices on random port