开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):NameServer 启动步骤一】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12461
NameServer 启动步骤一
启动流程
NameServer的启动流程主要分为三步,第一步创建NameServerController,第二步进行NameServerController实例化,第三步在退出时完成释放资源操作。
步骤一:
解析配置文件,填充NameServerConfig、NettyServerConfig属性值,并创建NamesrvControllerI
NameServerController是介绍、响应、请求的核心类
下图为原码流程图:
首先,在NamesrvStartup中会有main方法,main方法会调用main0,mian0当中会执行NameServerController创建工作。createNameServer操作最终是以返回controller结束 ,controller的创建需要用到两个配置类,一个是nameserverConfig,一个是nettyserverConfig,这两个配置类,一个是NameServer的属性配置,一个是nettyServer的属性配置。
final Namesrvconfig namesrvconfig = new Namesrvconfig();
final NettyServerconfig nettyServerconfig = new NettyServerconfig();
这两行代码是nameserverConfig和nettyserverConfig配置类
nameserverConfig中的配置信息:
private string rocketmqHome=System.getProperty(NixAll.ROCKETNQ_HOME_PROPERTY,System.getenv(NixAll.ROCKETNg_HOME_ENV));
private string kevConfigPath = System.get?riperty("user .home")+ File.separator + "namesr"+ File.separator + "kvConfig.json";
private string configstorePath = system.getproperty("user .home")+ File.separator + "namesrv" + File.separator + "namesrv.propertiv
private string productEnvName = "center";
private boolean clusterTest = false;
private boolean orderMessageEnable = false;
第一个属性配置是rocketmqHome,加载环境变量,获取rocketmq原码的根路径;第二个属性配置是kevConfigPath,默认在个人home里指定目录;
rocketmqHome: rocketmq主目录
kvConfig: NamjeServer存储KV配置属性的持久化路径
configStorePath: nameServer默认配置文件路径
orderMessageEnable:是否支持顺序消息
NettyServer是请求、响应的服务端。
nettyserverConfig配置信息:
private int listenPort = 8888;
private int serverworkerThreads = 8;
private int serverca11backExecutorThreads = 0;
private int serverselectorThreads = 3;
private int serveronewaysemaphorevalue = 256;
private int serverAsyncsemaphorevalue = 64;
private int serverchanne1MaxIdleTiheseconds = 120;
private int serversocketsndBufsize = Nettysystemconfig.socketsndbufsize;
private int serversocketRcvBufsize = Nettysystemconfig.socketRcvbufsize;
private boolean serverpooledByteBufA11ocatorEnab1e = true;
private boolean useEpo11Nativeselector = fa1se;
listenPort: NameServer监听端口,该值默认会被初始化为9876
serverWorkerThreads: Netty业务线程池线程个数
serverCallbackExecutorThreads: Netty public任务线程池线程个数,Netty网络设计,根据业务类型会创建不同的线程池,比如处理消息发送、消息消费、心跳检测等。如果该业务类型未注册线程池,则由public线程池执行。
serverSelectorThreads: lO线程池个数,主要是NameServer、Broker端解析请求、返回相应的线程个数,这类线程主要是处理网路请求的,解析请求包,然后转发到各个业务线程池完成具体的操作,然后将结果返回给调用方;
serverOnewaySemaphoreValue: send oneway消息请求并发读(Broker端参数);
serverAsyncSemaphoreValue:异步消息发送最大并发度;
serverChannelMaxldleTimeSeconds :网络连接最大的空闲时间,默认120s。
serverSocketSndBufSize:网络socket发送缓冲区大小。
serverSocketRcvBufSize:网络接收端缓存区大小。
serverPooledByteBufAllocatorEnable: ByteBuffer是否开启缓存;
useEpollNativeselector:是否启用Epoll IO模型。
刚刚分析了配置类中的一些属性,下面讲述属性值是如何来的:
nettyServerConfig.setListenPort(9876);
nettyServerConfig默认端口号为9876
if ( commandLine.hasoption( "c')) {
//指定属性配置文件位置
string file = commandLine.getoptionvalue( 'c");
if (file != null) {
Inputstream in = new BufferedInputstream(rew FileInputstream(file));
properties = new Properties();
properties.load(in);
MixAll.properties20bject(properties, namesrvconfig);
MixAll.properties2object(properties,nettyserverconfig);
namesrvconfig.setconfigstorePath(file);
system.out.printf("1oad config properties file oK,%s%n", file);
in.close();
}
}
if ( commandLine.hasoption( 'p’) {
//属性名=属性值
InternalLogger console = InternalLoggerFactory.getLogger(LoggerName .NANIESRV_CONSOLE_NANIE);
MixAll.printobjectProperties(console,namesrvConfig);
MixAll.printobjectProperties(console,nettyServerConfig);
system.exit( status: e);
}
一个是解析命令行中-c参数,另一个if是解析命令行中-p参数
-c参数指,指定属性值时,可以通过一个属性配置文件去指定,在-c后面写上属性配置文件的路径,之后会读取属性配置文件并将其加载到properties中,然后会用properties对象填充namesrvconfig和nettyserverconfig。
除了-c方式还可以通过-p方式指定,就是在-p后面直接写属性值,亚同样会解析到namesrvconfig和nettyserverconfig中。
也可以通过控制台指定,它也可以进行处理并封装到namesrvconfig当中。
final NamesrvController controller = new NamesrvController(nameprvconfig,nettyServerconfig);
这行代码是在进行namesrvController的创建,是通过namesrvConfig的构造参数完成对象的创建
public NamesrvController(NamesnyConfig namesrvConfig,NettyServerConfig nettyServerConfig){
this.namesrvconfig = namesrvConfig;
this.nettyserverConfig = nettyserverconfig;
this.kvConfigMagager=newKVConfigManager( namesrvController. this);
this.routeInfoMainager = new RouteInfoManager();
this.brokerHousekeepingService=newBrokerHousekeepingService( namesrvController.this);
this.configuration = new Configuration(
Log,
this.namesrvConfig, this.nettyserverconfig
);
this.configuration.setStorePathFromConfig(this.namesrvConfig,fieldName:, "configStorePath");
}