Apache Solr 启动过程中涉及一些关键类
2021-03-11 10:52:10 Author: xz.aliyun.com(查看原文) 阅读量:160 收藏

CoreContainer,顾名思义为盛放core的容器

类属性中有很多 Handler,

无参构造方法,会先调用SolrResourceLoader的locateSolrHome方法,

1.1 SolrResourceLoader

关于SolrResourceLoader,通过类名来看是Solr的资源加载类,负责加载各种资源到运行环境中,通过ClassLoader以及文件读取加载类、文件资源等,也支持jndi的方式加载,以及一些url以及文件路径处理的方法。

无参构造方法新建了一个SolrResourceLoader对象后,接下来还会调用它本身下一个构造方法,public CoreContainer(SolrResourceLoader loader),然后继续往下嵌套,

这里调用了SolrXmlConfig.fromSolrHome,

1.2 SolrXmlConfig

这里先看下SolrXmlConfig,Solr中解析并加载solr.xml的文件的类。

分成两段看,首先是返回NodeConfig以from开头的一些静态方法,这些方法是配置加载的核心方法,通过名字来看Solr支持通过不同方式加载配置文件

1.3 NodeConfig

这里再看下NodeConfig对象,类似于一个javaBean属性的文件,每个私有属性都对应着solr.xml定义的字段,构造方法接收参数初始化这些字段,这些类属性有各自的get set方法。

1.4 Config(Backto SolrXmlConfig)

回头我们再看SolrXmlConfig,首先是Config对象,JavaBean属性的类,类初始化时根据接收的参数不同,初始化私有类属性,并提供get set方法操作属性。先来看下类属性都存储了哪些信息(哪些Config,也就是Solr的哪些配置放在这里面),我们主要看下参数最多的构造方法,Solr启动时,solrconfig.xml elevate.xml配置文件的加载都用到了Config类,这里说一下solrconfig.xml并没有用到这个SolrXmlConfig

接下来大概看下Config类里都有什么

1.5 Back to SolrXmlConfig from*方法

再回来看SolrXmlConfig的from*方法就很容易懂了

fromConfig:从Config类中初始化NodeConfig 也是formFile 进入formInputStream 然后被调用的

formFile:从File文件中初始化NodeConfig

formInputStream:new了一个Config对象,然后调用了formConfig

formSolrHome :调用了FromFile

fromFile ——> solr.xml

fromConfig <—— formInputStream <—— fromFile

整体调试下来,SolrXmlConfig,就是用来加载处理Solr.xml的类,看一开始的SOLR_XML_FILE也知道

这时再看这些构造方法就好理解多了,看到倒是第二个构造方法从参数看起来,还涉及到看起来比较陌生的一个类CoresLocator

2.1 CoresLocator

CoresLocator是一个接口,我想把它翻译成core定位器。只有一个唯一实现的子类CorePropertiesLocator,先看这个接口,CorePropertiesLocator里面超多方法都有CoreDescriptor,所以需要CoreDescriptor的前置知识

2.2 CoreDescriptor

Solr核心描述符,描述一个core,看它的私有属性就是用来描述Core的,并接受参数对core进行初始化,支持通过不同方式初始化core

可以看到这些值,是从现成的配置文件中来进行值的读取初始化,

2.2 Back to CoreLocator

回头在看CoreLocator,提供了如下方法

creat:创建一个core

persist:core的持久化,服务重启后core仍能够被找到

delete:删除core

rename:core的重命名

swap:交换两个core

discover:从持久性存储中加载所有CoreDescriptor(也就是core)

2.3 Back to CorePropertiesLocator

映入眼帘的 就是:

public static final String PROPERTIES_FILENAME = "core.properties";

回忆一下core.properties配置文件的作用:代表一个核心,保存了core的基本配置。里面支持配置core。大概长这个样子

CorePropertiesLocator除了实现了CoresLocator的几个方法外,增加了writePropertiesFiles、buildCoreDescriptor、buildCoreProperties、createName

buildCoreDescriptor:获取CoreDescriptor ,也就是core的信息

writePropertiesFiles:讲core的基本信息写到coreDiscoveryRoot中,默认为C:\Solr\solr-6.4.0\server\solr

buildCoreDescriptor:加载core,并返回build好的core为CoreDescriptor对象

其实分析到这里,讲我们不认识的类都看了一遍,CoreContainer的构造方法也差不都就看完了

其实只不过是this this的一层层调用

4.1 initializeAuthorizationPlugin、addHttpConfigurer、securityNodeChanged

初始化身份认证插件,关于Solr的身份认证另起一篇文章。

4.2createAndLoad

创建一个新的CoreContainer并加载其core,其中代码很简单,loader就是SolrResourceLoader,solrHome,SolrXmlConfig加载配置去加载core,但是solr启动时并没有调用到这个方法。

4.3 load()

将core加载到CoreContainer.这里仔细跟一下流程

首先时libDir下的资源文件的加载

然后初始化metricManager,Solr报告度量标准,这里略。

然后进行shardHandlerFactory的初始化,shardHandlerFactory在solr.xml文件中有配置,用于处理创建自定义分片处理程序。

然后是zk初始化

然后是admin系列的Handler的初始化

然后读取core放进SolrCores中

4.4 一些小方法

readVersion 获取版本

checkForDuplicateCoreNames 检查core名称是否重复

还有一些生命周期相关的 star shutdown等

一个存放cores的...类,感觉跟Corecontainer好像,应该算是Corecontainer中真正存放core的地方。


文章来源: http://xz.aliyun.com/t/9248
如有侵权请联系:admin#unsafe.sh