dubbo的注册中心和zookeeper里都有jetty的成分,jetty的默认端口又是8080,当二者与springboot进行整合时,springboot内嵌的tomcat的端口8080就会被jetty占用。
如果尝试使用命令来杀死8080所在进程,那杀死的可能是zookeeper的服务。
为了解决jetty占用8080端口的问题,需要对dubbo注册中心配置文件、zookeeper的配置文件进行修改。
dubbo的注册中心路径:
dubbo-admin\incubator-dubbo-ops-master\dubbo-monitor-simple
从最开始使用注册中心说起
通过使用dubbo注册中心的常规操作,来看一下注册中心里的jetty是怎么占用端口号:
需要来到dubbo-monitor-simple文件夹下,接着cmd进入命令模式:
这时会生成target文件夹
打开target
解压dubbo-monitor-simple-2.0.0的压缩包产生dubbo-monitor-simple-2.0.0,
之后复制dubbo-monitor-simple-2.0.0到incubator-dubbo-ops-master文件夹下
打开dubbo-monitor-simple-2.0.0,找到conf配置文件,jetty原本的端口号是8080,所以造成注册中心对8080的占用。因此修改jetty服务器的端口号为8081,如下:
这样就可以避免注册中心启动jetty时与tomcat8080端口冲突。
接下来修改zookeeper
通过反复操作发现zookeeper服务占用了8080端口,因为提供服务的应用点击运行总是被提示这样的信息:
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
Description:
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
Action:
Verify the connector's configuration, identify and stop any process that's listening on port 8080, or configure this application to listen on another port.
我每次用命令先查看8080的进程
接着杀死进程
可是每次关闭进程后,zookeeper的服务也被关闭了,不知道为什么会这样,一开始认为zookeeper没有道理占用8080端口。
但一想到8080端口,又使我想起一件怪事,就是之前dubbo里监控台所用的jetty端口号被改成8081后可以访问。而访问8080端口时,显示8080在仍然被jetty占用。
这就是奇怪的地方,jetty分明端口号已经不再是8080,却显示jetty在占用8080。
如图jetty可以在8081访问:
如下图:这里仍然显示8080被jetty占用,那这个jetty又是怎么回事儿??我终于开始怀疑zookeeper了......
于是查了百度,有人给出了答案,就是zookeeper里从某个版本开始内置了jetty,所以是zookeeper里还有jetty在占用8080端口,而我当前的版本是最新版——3.6.0。
解决方法,修改zookeeper的配置文件zoo.cfg:
添加一条配置信息:admin.serverPort=8008
修改之后看看效果:
首先关闭之前的zookeeper服务(关闭终端),之后通过命令重新启动zkServer.cmd
再次访问8080端口:
很好,无法访问说明zookeeper里的jetty不再占用8080端口号了,看来一切都因为自己安装最新版的zookeeper的缘故。
那我的提供者是否恢复、可以通过tomcat的8080端口启动了呢?
如图,启动提供者应用后,访问监控中心显示已经有提供者了,所以tomcat终于启动了。
再看jetty被改成的8008端口:
也没问题。
只是我还有疑问就是在消费者应用里,application.properties里指定tomcat的server.port时,期间发生了什么,为什么就直接改变了tomcat的端口号。
之前指定server.port是为了tomcat与jetty避免冲突,那现在已经不冲突了,所以我觉得,这里已经不需要指定server.port了,默认8080即可。
终于可以为我的应用通过地址栏传参:
springboot内嵌的tomcat端口号占用问题解决方案
jetty的问题解决了,但是真是一波未平呀,springboot里内嵌tomcat又来捣乱了。
还是端口号占用问题,消费者每次启动,tomcat的端口只能用一次,第二次产出端口占用,因此由于tomcat的限制,每次只能产生一个服务提供者了。
那么有没有什么办法让tomcat的端口号可以重复使用呢?
除了换成外部tomcat以外,暂时没有办法。如果不解决端口占用的问题,虽然可以手动更改application.properties里server.port,但还是有些麻烦。
不过还有一种方法可以简化开发过程,尤其springboot与dubbo相结合的时候大概比较完美:
很多时候dubbo自身的端口号20880也存在占用的情况,处理这种问题,我使用其中一种方案是将application.properties中的端口号设为-1
这样做可以产生从20880开始递增的端口号,比如下一个就会生成20881...
由此可以想象得到可以自己定义的一个tomcat端口号,
很简单,在springboot的启动类上添加一段代码即可:
package com.changping.mall; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; @SpringBootApplication @EnableDubbo public class SpringbootUserserviceProviderApplication implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { public static void main(String[] args) { SpringApplication.run(SpringbootUserserviceProviderApplication.class, args); } @Override public void customize(ConfigurableServletWebServerFactory factory) { factory.setPort(getRandomPort()); } // 获得8000到9999随机端口号 public static int getRandomPort() { int a = 8000; int b = 10000; int randomPort = (int) (Math.random() * (b - a)) + a; return randomPort; } }
高亮的部分是后加的一段代码,功能是给内嵌tomcat定义随机的端口号,这样,就不会产生端口占用的现象了。
启动springboot项目,控制台可以看到端口号为8171:
Tomcat started on port(s): 8171 (http) with context path '' SpringbootUserserviceProviderApplication : Started SpringbootUserserviceProviderApplication in 17.489 seconds (JVM running for 19.357)
这样就达到了我的最终目的——连续启动三次毫无阻碍:
如果想看端口占用的情况键入命令即可:netstat -ano
就这样吧,虽然花了点时间,但还是小有收获,我的springboot+dubbo+zookeeper搭建也进入了尾声>>>