1、通过/eureka/apps查询注册信息
http://localhost:8761/eureka/apps
<port enabled="true">8762</port>
8762是工程注册的业务端口号
2、业务随机端口号
server:
port: 0
management:
port: 8087
<port enabled="true">8087</port>
8087是工程管理端口号
3、 原因
指定management.port后会有存在两个tomcat容器、两个spring context。ManagementContext是默认context的子节点。
都会发出EmbeddedServletContainerInitializedEvent
事件处理代码见
@EventListener(EmbeddedServletContainerInitializedEvent.class)
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
// TODO: take SSL into account when Spring Boot 1.2 is available
int localPort = event.getEmbeddedServletContainer().getPort();
if (this.port.get() == 0) {
log.info("Updating port to " + localPort);
this.port.compareAndSet(0, localPort);
start();
}
}
ManagementContext先触发,导致上报错误的端口号
4、 解决
参照https://github.com/spring-cloud/spring-cloud-netflix/issues/2732
ManagementContext的namespace为management
默认context的namespace为null
@EventListener(EmbeddedServletContainerInitializedEvent.class)
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
if (null != event.getApplicationContext().getNamespace()) {
return;
}
int localPort = event.getEmbeddedServletContainer().getPort();
if (this.port.get() == 0) {
log.info("Updating port to " + localPort);
this.port.compareAndSet(0, localPort);
start();
}
}
只处理默认context的namespace为null的情况,可以通过aop或者同名类覆盖源码解决