SpringBoot项目war包部署无法注册nacos
问题
最近在进行Eureka迁移Nacos架构升级的时候。就在项目改造完成后,发现启动正常,访问不正常,在nacos客户端服务列表中也看不到这个服务。
解决方案
从Nacos的注册类NacosAutoServiceRegistration 进去之后可以发现它继承了SpringCloud的AbstractAutoServiceRegistration 注册类,在AbstractAutoServiceRegistration 中有一个绑定监听事件,他的作用就是监听到内置容器启动完成之后获取容器端口向注册中心注册,如下图:
因为这个接口只可以监听内置容器,所以我们就可以得出结论:之所以会出现上面的问题,就是因为使用外部容器时,不会触发监听事件,所以也就注册不到nacos中。
因此我们可以借助SpringBoot提供的ApplicationRunner接口,这个接口的作用就是在应用启动完成之后执行一些定义好的初始化操作。所以我们可以在服务启动成功之后,通过这个接口将我们的项目注册到Nacos中,下面看代码:
/**
* @author shy
* @date 2021/11/29 16:23
*/
@Component
public class NacosConfig implements ApplicationRunner {
@Autowired(required = false)
private NacosAutoServiceRegistration registration;
@Value("${server.port}")
Integer port;
@Override
public void run(ApplicationArguments args) {
if (registration != null && port != null) {
//如果getTomcatPort()端口获取异常,就采用配置文件中配置的端口
Integer tomcatPort = port;
try {
tomcatPort = new Integer(getTomcatPort());
} catch (Exception e) {
e.printStackTrace();
}
registration.setPort(tomcatPort);
registration.start();
}
}
/**
* 获取外置tomcat端口
*/
public String getTomcatPort() throws Exception {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
String port = objectNames.iterator().next().getKeyProperty("port");
return port;
}
}
加上这个配置类启动之后,我们就可以在Nacos客户端服务列表中看到相应的服务
原文链接
https://blog.csdn.net/shy_1762538422/article/details/121613931