一步一步,mycat源码调试
MycatCore.java,源码分析重要的切入类
这个类是比较重要的一个类,里面定义了一个main方法,包含mycat启动的全过程:
-
加载mycat1.xml并进行相关配置,加载Mycat1.xml上面配置的数据端口(默认8066)、以及集群配置,包括cluster有多少个节点,集群IP,集群端口(9066),这里可以看出,集群里面的mycat实例就是从这里配置的,但是mycat集群到底是怎么实现的,还需要挖深代码去寻找。如果想进行集群配置管理,修改xml的配置方式,可以修改此处的代码来达到目的。
-
根据MycatConfig设置ProxyRuntime, ProxyRuntime应该就是Mycat程序的主要的类了
-
设置ProxyRuntime的sessionManager,sessionManager应该与报文通信有关
ProxyRuntime,程序初始化的更深的切入点
从MycatCore里面可以看到这个类十分重要,ProxyRuntime设置完MycatConfig以及sessionManager后,就会初始化M(物理机CPU核心数)个ProxyReactorThread(ProxyReactorThread继承java.util.Thread,里面有run方法),并且启动这些线程。程序就会开始执行。
备注
-
mycat的数据端口默认是8066,mysql workbench等Mysql数据库的管理工具可以通过这个端口经mycat代理获取Mysql的数据;但是MycatCore的main方法运行时没有日志暴露已经监听了8066端口, mysql workbench通过8066端口输入用户名密码可以连接mycat,通过mycat代理获取到mysql数据库的信息;当Mysql workbench进行查询时,可以看到MycatCore的终端打印出对应的SQL
-
配置hibernate或者类似的框架的mysql url连接需要加上useUnicode=true&characterEncoding=UTF8,例如
spring.datasource.url=jdbc:mysql://127.0.0.1:8066/health?useUnicode=true&characterEncoding=UTF8
否则会提示字符编码错误,原因未知 -
mycat的管理端口是9066,mycat的管理端口,MyCatCore的main方法运行时日志会暴露该端口
-
NameableExecutor
MycatCore的main方法首先使用了该类,因此可以先分析一下这个类到底是用来干什么的,并且做了些什么东西。这个类通过继承 java.util.concurrent.ThreadPoolExecutor,实现java.util.concurrent.ExecutorService,JAVA中,ThreadPoolExecutor和ExecutorService是实现线程池的方法,ThreadPoolExecutor一般会固定的配置最小线程数和最大线程数或者固定的配置线程数,然后通过ExcecutorService的execute方法执行Runnable对象的方法。但是这个目前的代码是预留的,没有在main方法里面有任何业务逻辑的处理。