zoukankan      html  css  js  c++  java
  • dubbo+zookeeper对8080端口的占用问题

    dubbo的注册中心和zookeeper里都有jetty的成分,jetty的默认端口又是8080,当二者与springboot进行整合时,springboot内嵌的tomcat的端口8080就会被jetty占用。

    如果尝试使用命令来杀死8080所在进程,那杀死的可能是zookeeper的服务。

    为了解决jetty占用8080端口的问题,需要对dubbo注册中心配置文件、zookeeper的配置文件进行修改。

    dubbo的注册中心路径:

    dubbo-adminincubator-dubbo-ops-masterdubbo-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搭建也进入了尾声>>>

  • 相关阅读:
    *滚动条cs
    *关于JS动态添加事件
    *JS获取地址栏参数
    *关于Iframe内嵌页面右边总是有空白滚动条的处理
    JAVASCRIPT中使用DOM操作XML文档
    页面间传递变量的方法及使用范围的讨论
    javascript打开模式窗口的用法
    *关于Session*
    *NUnit使用
    Eclipse jQuery plugin spket
  • 原文地址:https://www.cnblogs.com/timingstarts/p/12604211.html
Copyright © 2011-2022 走看看