• RocketMq nameServer 启动流程


      启动源:

      nameServer 启动是使用 org.apache.rocketmq.namesrv.NamesrvStartup main 方法启动的,脚手架这里就不多说了。

      配置文件的配置信息请看这两个配置类的字段:

        org.apache.rocketmq.remoting.netty.NettyServerConfig

        org.apache.rocketmq.common.namesrv.NamesrvConfig 

    启动流程:

      1.设置脚手架进行初始化

      2.设置nameService Netty 默认启动端口为9876 ,也可以通过 -n 或者配置文件进行修改

      3.执行一些脚手架命令,进行配置NameSrvConfig 以及NettyServerConfig

      4.实例化 NamesrvController

      5.init NameSrv

      6.启动NameSrv

    public static NamesrvController main0(String[] args) {
             String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV));
             System.out.println(rocketmqHome);
    
            System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION));
            try {
                //PackageConflictDetect.detectFastjson();
                //1.脚手架命令
                Options options = ServerUtil.buildCommandlineOptions(new Options());
                commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser());
                if (null == commandLine) {
                    System.exit(-1);
                    return null;
                }
    
                final NamesrvConfig namesrvConfig = new NamesrvConfig();
                final NettyServerConfig nettyServerConfig = new NettyServerConfig();
                //2.nameService 地址默认是9876 端口
                nettyServerConfig.setListenPort(9876);
                if (commandLine.hasOption('c')) {
                    String file = commandLine.getOptionValue('c');
                    if (file != null) {
                        InputStream in = new BufferedInputStream(new FileInputStream(file));
                        properties = new Properties();
                        properties.load(in);
                        //3. -c 命令文件配置信息初始化到NamesrvConfig NettyServerConfig 中
                        MixAll.properties2Object(properties, namesrvConfig);
                        MixAll.properties2Object(properties, nettyServerConfig);
    
                        namesrvConfig.setConfigStorePath(file);
    
                        System.out.printf("load config properties file OK, " + file + "%n");
                        in.close();
                    }
                }
    
                if (commandLine.hasOption('p')) {
                    MixAll.printObjectProperties(null, namesrvConfig);
                    MixAll.printObjectProperties(null, nettyServerConfig);
                    System.exit(0);
                }
    
                MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), namesrvConfig);
    
                if (null == namesrvConfig.getRocketmqHome()) {
                    System.out.printf("Please set the %s variable in your environment to match the location of the RocketMQ installation%n", MixAll.ROCKETMQ_HOME_ENV);
                    System.exit(-2);
                }
    
                LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
                JoranConfigurator configurator = new JoranConfigurator();
                configurator.setContext(lc);
                lc.reset();
                configurator.doConfigure(namesrvConfig.getRocketmqHome() + "/conf/logback_namesrv.xml");
                final Logger log = LoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
    
                MixAll.printObjectProperties(log, namesrvConfig);
                MixAll.printObjectProperties(log, nettyServerConfig);
                //4.实例化 NamesrvController 
                final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);
    
                // remember all configs to prevent discard
                controller.getConfiguration().registerConfig(properties);
                //5.初始化NameSrv 的信息
                boolean initResult = controller.initialize();
                if (!initResult) {
                    controller.shutdown();
                    System.exit(-3);
                }
    
                Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        controller.shutdown();
                        return null;
                    }
                }));
                //6.启动NameSrv
                controller.start();
    
                String tip = "The Name Server boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer();
                log.info(tip);
                System.out.printf(tip + "%n");
    
                return controller;
            } catch (Throwable e) {
                e.printStackTrace();
                System.exit(-1);
            }
    
            return null;
        }

    实例化Srv:

      public NamesrvController(NamesrvConfig namesrvConfig, NettyServerConfig nettyServerConfig) {
            this.namesrvConfig = namesrvConfig;
            //nettyServer 配置信息
            this.nettyServerConfig = nettyServerConfig;
            this.kvConfigManager = new KVConfigManager(this);
            //broker 路由信息管理器,用来管理存储broker 给我们发送的toipc 信息,这个很重要
            this.routeInfoManager = new RouteInfoManager();
            //连接检测
            this.brokerHousekeepingService = new BrokerHousekeepingService(this);
            this.configuration = new Configuration(
                log,
                this.namesrvConfig, this.nettyServerConfig
            );
            this.configuration.setStorePathFromConfig(this.namesrvConfig, "configStorePath");
        }

    init NameSrv:

     public boolean initialize() {
            //加载 kvConfig.json 文件
            this.kvConfigManager.load();
            //Netty Server 初始化
            this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService);
    
            this.remotingExecutor =
                Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactoryImpl("RemotingExecutorThread_"));
            //注册nameSrv处理器
            this.registerProcessor();
    
            this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
    
                @Override
                public void run() {
                    NamesrvController.this.routeInfoManager.scanNotActiveBroker();
                }
            }, 5, 10, TimeUnit.SECONDS);
            //kv 打印定时任务
            this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
    
                @Override
                public void run() {
                    NamesrvController.this.kvConfigManager.printAllPeriodically();
                }
            }, 1, 10, TimeUnit.MINUTES);
    
            return true;
        }

    启动NameSrv

        public void start() throws Exception {
            //Netty 服务端bind 9876 开始服务
            this.remotingServer.start();
        }

     从启动流程可以看到,NameSrv 只有一个服务端,没有客户端,不会主动与broker 以及consumer producer 进行交互 。

    RouteInfoManager

     RouteInfoManager 维护了broker 中topic  ip  queue 等信息,是namesrv 重要的一个组成部分,Broker 向 namesrv 报告自身信息全部维护在 RouteInfoManager 中,以及consumer 

    producter 都会从这里取到相关的信息。

    private static final Logger log = LoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
        private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2;
        private final ReadWriteLock lock = new ReentrantReadWriteLock();
        //topic 对应的queueData 信息
        private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
        //brokerName 与Broker信息映射
        private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
        //clipperName 与brokerName 映射
        private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
        private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
        private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
    
        public RouteInfoManager() {
            this.topicQueueTable = new HashMap<String, List<QueueData>>(1024);
            this.brokerAddrTable = new HashMap<String, BrokerData>(128);
            this.clusterAddrTable = new HashMap<String, Set<String>>(32);
            this.brokerLiveTable = new HashMap<String, BrokerLiveInfo>(256);
            this.filterServerTable = new HashMap<String, List<String>>(256);
        }
  • 相关阅读:
    MySQL中查询表及索引大小的方法
    转:一套大而全的系统架构体系与具体落地方案
    [转]1年时间业务量疯长40倍,谈人人车的平台架构演进之路
    [转]如何实现“持续集成”?闲鱼把研发效率翻了个翻
    微服务介绍
    Python2.X和Python3.X的w7同时安装使用
    黑客与画家阅读体会
    Open Source 开发工具集
    volatile和不加volatile的区别
    VMware改变硬盘空间大小的方法
  • 原文地址:https://www.cnblogs.com/iscys/p/13124058.html
Copyright © 2020-2023  润新知