【Mycat1.6之三大配置文件加载源码阅读】

一、三大配置文件介绍

1)rule.xml 片键规则函数映射

2)schema.xml 数据库节点主机映射

3)server.xml  全局参数配置(用户/防火墙/内存/端口等配置)

 

二、三大配置文件加载过程

1)启动类MycatStartup部分代码
MycatStartup {
    private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
    private static final Logger LOGGER = LoggerFactory.getLogger(MycatStartup.class);
    public static void main(String[] args) {
        //use zk ?
    	//使用单例模式加静态代码块加载/myid.properties配置文件
    	//如果配置文件中loadZk取值为true则会调用ZktoXmlMain类的loadZktoFile方法,
    	// 否则不使用ZK,这段代码小刘的注释写的很漂亮,值得学习和表扬
        ZkConfig.getInstance().initZk();
        
		//检查是否设置SystemConfig中的SYS_HOME = "MYCAT_HOME"变量值
		String home = SystemConfig.getHomePath();
		if (home == null) {
			System.out.println(SystemConfig.SYS_HOME + "  is not set.");
			System.exit(-1);
		}
		// init
		//使用单例模式初始化配置文件为启动做准备:读取配置文件和启用scheduler调度器,
		//	其中配置文件的加载使用的是java中的w3c的DocumentBuilderFactory-->DocumentBuilder,
		//这种代码比较底层。 dom  sax  dom4j的区别呢?此处没有用dom4j,估计是考虑到dtd验证问题
		MycatServer server = MycatServer.getInstance();

}

2)MycatServer类
private MycatServer() {	
	//读取文件配置,配置文件加载入口
	this.config = new MycatConfig();
}

3)MycatConfig类
public MycatConfig() {
	//读取schema.xml,rule.xml和server.xml
	ConfigInitializer confInit = new ConfigInitializer(true);
	this.system = confInit.getSystem();
	this.users = confInit.getUsers();
	this.schemas = confInit.getSchemas();
	this.dataHosts = confInit.getDataHosts();

	this.dataNodes = confInit.getDataNodes();
	for (PhysicalDBPool dbPool : dataHosts.values()) {
		dbPool.setSchemas(getDataNodeSchemasOfDataHost(dbPool.getHostName()));
	}
	
	this.firewall = confInit.getFirewall();
	this.cluster = confInit.getCluster();
		
		 
}

4)ConfigInitializer类
public ConfigInitializer(boolean loadDataHost) {
		//读取rule.xml和schema.xml
		SchemaLoader schemaLoader = new XMLSchemaLoader();
		
		//读取server.xml
		XMLConfigLoader configLoader = new XMLConfigLoader(schemaLoader);
		
		schemaLoader = null;
		
		//加载配置
		this.system = configLoader.getSystemConfig();
		this.users = configLoader.getUserConfigs();
		this.schemas = configLoader.getSchemaConfigs();
		
		//是否重新加载DataHost和对应的DataNode
		if (loadDataHost) {
			this.dataHosts = initDataHosts(configLoader);
			this.dataNodes = initDataNodes(configLoader);
		}
		
		//权限管理
		this.firewall = configLoader.getFirewallConfig();
		this.cluster = initCobarCluster(configLoader);
		
		//不同类型的全局序列处理器的配置加载
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_MYSQLDB) {
			IncrSequenceMySQLHandler.getInstance().load();
		}
		
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_LOCAL_TIME) {
			IncrSequenceTimeHandler.getInstance().load();
		}
		
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_ZK_DISTRIBUTED) {
			DistributedSequenceHandler.getInstance(system).load();
		}
		
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_ZK_GLOBAL_INCREMENT) {
			IncrSequenceZKHandler.getInstance().load();
		}
		
		/**
		 * 配置文件初始化, 自检
		 */
		this.selfChecking0();
	}
5)XMLSchemaLoader类	
     public XMLSchemaLoader() {
	this(null, null);
      }
	
	
      public XMLSchemaLoader(String schemaFile, String ruleFile) {
		//先读取rule.xml
		XMLRuleLoader ruleLoader = new XMLRuleLoader(ruleFile);
		//将tableRules拿出,用于这里加载Schema做rule有效判断,以及之后的分片路由计算
		this.tableRules = ruleLoader.getTableRules();
		//释放ruleLoader
		ruleLoader = null;
		this.dataHosts = new HashMap<String, DataHostConfig>();
		this.dataNodes = new HashMap<String, DataNodeConfig>();
		this.schemas = new HashMap<String, SchemaConfig>();
		//读取加载schema配置
	this.load(DEFAULT_DTD, schemaFile == null ? DEFAULT_XML : schemaFile);
	}

	
	//读取schema配置,加载【dataHosts/dataNodes/schemas】
	private void load(String dtdFile, String xmlFile) {
		InputStream dtd = null;
		InputStream xml = null;
		dtd = XMLSchemaLoader.class.getResourceAsStream(dtdFile);
		xml = XMLSchemaLoader.class.getResourceAsStream(xmlFile);
		Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();
		//先加载所有的DataHost
		loadDataHosts(root);
		//再加载所有的DataNode
		loadDataNodes(root);
		//最后加载所有的Schema
		loadSchemas(root);
	} 
6)XMLSchemaLoader类
	public XMLRuleLoader(String ruleFile) {
		// this.rules = new HashSet();
		//rule名 -> rule
		this.tableRules = new HashMap<String, TableRuleConfig>();
		//function名 -> 具体分片算法
		this.functions = new HashMap<String, AbstractPartitionAlgorithm>();
		load(DEFAULT_DTD, ruleFile == null ? DEFAULT_XML : ruleFile);
	}
	
7)XMLConfigLoader
	public XMLConfigLoader(SchemaLoader schemaLoader) {
            XMLServerLoader serverLoader = new XMLServerLoader();
            //下面四个个属性【system/users/firewall/cluster】来自Server.xml文件
	    this.system = serverLoader.getSystem();
            this.users = serverLoader.getUsers();
            this.firewall = serverLoader.getFirewall();
            this.cluster = serverLoader.getCluster();
	    //下面三个属性【dataHosts/dataNodes/schemas】来自schema文件
            this.dataHosts = schemaLoader.getDataHosts();
            this.dataNodes = schemaLoader.getDataNodes();
            this.schemas = schemaLoader.getSchemas();
        schemaLoader = null;
    }
8)XMLServerLoader
    public XMLServerLoader() {
        this.system = new SystemConfig();
        this.users = new HashMap<String, UserConfig>();
        this.firewall = new FirewallConfig();
	//加载函数
        this.load();
    }
	
	//读取server.xml配置,加载【system/users/cluster/firewall】
	private void load() {
               InputStream dtd = null;
               InputStream xml = null;
		dtd = XMLServerLoader.class.getResourceAsStream("/server.dtd");
		xml = XMLServerLoader.class.getResourceAsStream("/server.xml");
		Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();
		
		//加载System标签
		loadSystem(root);
		
		//加载User标签
		loadUsers(root);
		
		//加载集群配置
		this.cluster = new ClusterConfig(root, system.getServerPort());
		
		//加载全局SQL防火墙
		loadFirewall(root);
        
	}

猜你喜欢

转载自gaojingsong.iteye.com/blog/2373935