神兵网站建设,互联网个人用户网站,网页设计工资统计,网络舆情工作流程的六个步骤问题说明 怎么解决Spring Boot项目部署到tomcat下无法Nacos中注册服务问题#xff0c;希望能够解决您遇到有关问题。
在使用Nacos作为注册中心的Spring Boot项目#xff0c;以war包形式部署到服务器上#xff0c;启动项目发现该服务无法在Nacos中注册。
分析 …问题说明 怎么解决Spring Boot项目部署到tomcat下无法Nacos中注册服务问题希望能够解决您遇到有关问题。
在使用Nacos作为注册中心的Spring Boot项目以war包形式部署到服务器上启动项目发现该服务无法在Nacos中注册。
分析 查看源码需从nacos的注册类找起查找后发现nacos注册类NacosAutoServiceRegistration继承了Spring Cloud中AbstractAutoServiceRegistration, 而在AbstractAutoServiceRegistration中绑定了一个监听事件监听内置容器启动完成事件监听到获取容器端口后向注册中心注册。
EventListener({WebServerInitializedEvent.class})public void bind(WebServerInitializedEvent event) {ApplicationContext context event.getApplicationContext();if (!(context instanceof ConfigurableWebServerApplicationContext) || !management.equals(((ConfigurableWebServerApplicationContext)context).getServerNamespace())) {this.port.compareAndSet(0, event.getWebServer().getPort());this.start();}}
而使用外部容器时不能监听到事件所以自动注册失败。
解决方案 Spring Boot提供了PostConstruct注解属性和ApplicationRunner接口并实现run方法即可前者比较简单是在应用起好之后执行一些初始化动作。通过这个接口我们可以实现启动项目后注册服务。使用这种方法需要在配置文件中配置端口号如果一个应用部署很多端口每个应用都要配置很不方便。故可获取外部tomcat自动设置端口。经测试方法可行。
代码如下
Component
Slf4j
public class NacosRegister {Autowiredprivate NacosRegistration registration;Autowiredprivate NacosAutoServiceRegistration nacosAutoServiceRegistration;Value(${server.port})String serverPort;PostConstructpublic void registerInstance() throws Exception {if (registration ! null serverPort ! null) {String tomcatPort serverPort;try {tomcatPort getPort();} catch (Exception e) {log.warn(获取外部Tomcat端口异常, e);}registration.setPort(Integer.parseInt(tomcatPort));nacosAutoServiceRegistration.start();}}/*** 获取外部tomcat端口*/public String getPort() {try {MBeanServer beanServer ManagementFactory.getPlatformMBeanServer();SetObjectName objectNames beanServer.queryNames(new ObjectName(*:typeConnector,*), Query.match(Query.attr(protocol), Query.value(HTTP/1.1)));String port objectNames.iterator().next().getKeyProperty(port);return port;} catch (Exception ex) {log.error(NacosRegister.getPort()动态获取端口异常:, ex.toString());return serverPort;}}提示 部署项目要注意版本问题如Spring Boot 2.0.6应该部署在tomcat8以上版本tomcat8以下版本可能有些变化导致项目启动报错。所以大家尽量使用tomcat8以上版本吧