我的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应用程序
答案 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