SpringBoot 启动运行成功,localhost无法访问连接
问题描述
本项目是一个物联网项目,技术框架 SpringBoot+Netty+MySql+MybatisPlus+Swagger
今天运行SpringBoot项目过程中,项目代码没有出现报错情况,在SpringBoot初始化成功之后,在web端访问api文档时,出现了无法访问此网站——localhost拒绝连接访问请求。针对这一问题我开始进行排查解决。
问题的排除
对于这一出现的问题,我脑海中可能出现了几中假设通过这些假设,对出现问题原因的范围进行缩小。有利于进行问题排查
- 电脑关于网络设置出现了问题?
- 浏览器设置出现问题?
- 项目程序代码出现了问题
在网上针对假设1、假设2的问题我也发现了自己电脑中丢失了host文件,进行了解决之后,运行项目之后,仍然无法访问。于是开始针对本项目程序代码问题进行各种方向排查。
项目工程代码可能的原因
查询中文网站的帖子,花了一下午的时间,一 一进行排查解决,但是问题仍然没有得解决。我于是新建了一个SpringBoot工程demo ,写了一个例子发现能够在浏览器正常访问,之后在demo项目中的maven文件中加入swagger相关依赖包进行测试排查。在运行项目之后,可以正常在浏览器上访问。经过这一步可以再次缩小出现原因的范围。
原因的发现和锁定
在咨询实验室同学进行讨论无果之后,我开始仔细比较demo工程和问题代码文件的异同,进行细致比较,我还怀疑是不是pom依赖包版本不兼容出现的问题。当进一步排查之后,我开始查看demo工程SpringBoot启动日志的时候与我自己出现问题的工程文件的SpringBoot启动日志进行比较。我注意到两边项目运行日志有不同。问题工程的SpringBoot的内嵌tomcat只是完成了初始化并没有实现开始启动,而且项目工程的Application也没有正式start。
于是,我根据日志的不同,对问题进行分析,因为本菜鸟的工程是一个物联网项目,需要使用Netty,同时需要开启一个端口监听下位机设备发送的数据信息。而tomcat也需要一个端口(默认8080)才能在浏览器访问。
之所以出现问题,就是因为我只开了一个线程,而且是项目工程是先完成的tcp端口数据收发,之后把项目进行tomcat部署。所以问题的原因在于,单线程的情况下,程序访问监听了TCP的端口,tomcat在初始化之后无法访问到8080端口。问题的原因就是线程。
后来百度发现这一个帖子也再一次印证了问题所在,关于SpringBoot+Netty打war包部署外部tomcat导致Tomcat不能访问的解决办法
问题的解决
原来是在项目入口原代码设置了一个监听器,完成对tcpserver的监听 netty中完成数据的接收和指令下发。
/程序入口
@SpringBootApplication
@MapperScan("com.xxx.miot.mapper")
//@EnableConfigurationProperties
//@EnableTransactionManagement
@EnableSwagger2
@ComponentScan("com.xxx.miot.*")
public class MiotApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(MiotApplication.class, args);
}
@Autowired
private TcpServer server;
@Override
public void run(String... args