Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/d6619309/article/details/52746430

在研究mycat源码之前必须先把环境搭建好。这篇文章的目标就是搭建mycat源码调试环境。环境主要包括:

  • git
  • jdk
  • maven
  • eclipse
  • mysql

这里假设你知道上面的知识点。我们搭建的环境所处于的操作系统是Windows7+。下面将一步一步讲解如何搭建源码调试环境:

1. 环境搭建

1.1 获取mycat源码

mycat源码托管在github上面,为了以后实时获取源码,我们需要先安装并配置好git客户端,请根据以下教程安装配置好git:

git安装教程

安装成功后,我们在本地某个文件路径下,鼠标右键打开Git Bash,执行以下命令将代码克隆到当前文件路径:

git clone https://github.com/MyCATApache/Mycat-Server.git

使用以下命令切换到最新1.6分支:

git checkout -b 1.6 origin/1.6

如果你对这个项目感兴趣并希望为mycat贡献代码,那么可以fork mycat代码到你个人的github上,然后从你自己fork的项目地址上面拉取代码。

1.2 安装jdk

jdk版本要求7或者更高。我们需要安装jdk并配置java环境变量。jdk的安装和环境变量的配置请参考:

JDK安装与环境变量配置

1.3 安装maven

mycat项目源码使用maven进行依赖管理、编译打包。因此我们需要安装maven并配置好,请参考以下教程进行配置:

Maven的安装及配置

1.4 安装配置eclipse

eclipse是开发Java项目常用的IDE,我们使用它来进行源码阅读和调试。eclipse可以在eclipse官网下载: https://www.eclipse.org/downloads/

我个人习惯使用STS——Spring Tool Suite,也是eclipse的一个扩展,可以在这个地址下载: http://spring.io/tools/sts/

完成后打开eclipse,配置maven使用我们自己下载的maven:

Windows -> Preferences -> Maven -> Installations

点击Add添加你的maven根目录,勾选你自己的maven,如下所示:

eclipse-maven-setting

最后点击OK确定即可。

eclipse和maven都依赖jdk环境,所以务必在安装之前先安装好jdk并配置好相应的环境变量。

1.5 导入mycat源码

完成上面配置后,就可以导入我们之前拉取的mycat源码:

File -> Import 选择 Existing Maven Projects,浏览选择我们clone的mycat源码,点击确定开始进行导入。第一次导入需要等待maven下载插件以及mycat项目需要用到的第三方依赖库,等待时间相对长一点。成功完成导入后的项目如下所示:

eclipse-mycat-project-structure

1.6 安装配置mysql

为了能够更方便地在本地开发环境调试mycat,我们最后还需要在我们的机器上安装mysql。建议windows下下载mysql绿色版,然后通过简单配置完成mysql的安装,具体参考以下教程:

Windows 下绿色安装Mysql 5.7 (zip压缩包)

根据上面教程使用root账号成功登陆mysql之后,建议修改root密码,eg:

mysql > set password = password('your password');

好了,到这里,我们的环境就算搭建完成了,下面我们将介绍如何在eclipse中根据mycat源码启动mycat。

2. IDE启动mycat

2.1 配置mycat

为了能够让mycat顺利启动,我们首先需要进行必要的配置。从github上面clone的源码在src/main/resources目录下存在mycat运行所需要配置的文件,有schema.xmlrule.xmlserver.xml。这里我们采用最简方式进行配置:

(1) schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
               rule="mod-long" />
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="mysql">
            <!-- can have multi read hosts -->
            <!-- <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> -->
        </writeHost>
        <!-- <writeHost host="hostS1" url="localhost:3316" user="root"
                   password="123456" /> -->
        <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>

</mycat:schema>

这里使用本地mysql(localhost:3306)进行测试,user为root,密码是mysql,根据实际情况修改。

(2) rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

</mycat:rule>

(3) server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="useSqlStat">1</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
    <property name="defaultSqlParser">druidparser</property>
        <property name="sequnceHandlerType">0</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!-- 
    <property name="processors">1</property> 
    <property name="processorExecutor">32</property> 
     -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
        <property name="processorBufferPoolType">0</property>
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!-- 
            <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
            <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
            <property name="processors">32</property> <property name="processorExecutor">32</property> 
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>

            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            单位为m
        -->
        <property name="memoryPageSize">1m</property>

        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>
    </system>

    <user name="root">
        <property name="password">mysql</property>
        <property name="schemas">TESTDB</property>
    </user>

</mycat:server>

2.2 mysql数据库准备

登录到本地mysql,创建需要的database和table:

create database db1 default charset 'utf8';
create database db2 default charset 'utf8';
create database db3 default charset 'utf8';

分别在db1、db2、db3下创建hotnews表:

create table hotnews (
    id int primary key,
    title varchar(100),
    author_id int,
    create_tm datetime,
    content text
) engine = innodb default character set = 'utf8';

2.3 启动mycat

到了这一步,所有的准备已经到位,在Eclipse的mycat项目下找到MycatStartup这个类,Run As -> Java Application即可跑起一个mycat server。默认mycat server端口8066,管理端口9066。

Eclipse里面使用Ctrl+Shift+T快捷键,输入类名,就可以快速定位到对应的源码文件。

这个时候使用mysql客户端工具,执行以下命令登录mycat:

> mysql -uroot -hlocalhost -P8066 -p
> 键入密码mysql

成功则表示mycat server调试环境已经部署成功了。好了,接下来以Debug默认运行,然后在你希望debug的位置打上断点,就可以尽情地阅读mycat源码了。

eg:
所有发往mycat的sql都会经过ServerQueryHandlerquery方法,在这个方法首行代码处打上断点,然后使用mysql客户端工具登录mycat并执行一个sql,程序就会定位到你设置的断点那里。

3. (可选)编译mycat软件包

我们可以通过mycat源码来编译得到mycat软件包,只要我们安装了maven即可。方法如下:

cmd进入到mycat源码根目录,即pom.xml所在目录,执行以下命令进行编译打包:

mvn package -Dmaven.test.skip=true

-Dmaven.test.skip=true表示忽略mycat的单元测试的执行,这样可以节省编译打包时间。

等待执行成功后,可以在mycat源码根目录的target子目录里面,看到如下格式的压缩包:

Mycat-server-${version}-${buildtime}-${platform}.tar.gz

其中${version}表示mycat版本号,${buildtime}为我们执行编译打包的日期时间,${platform}表示使用的操作系统平台,取值有winlinuxmacsolarisunix。这样我们就可以拿对应的软件包到对应的平台上去部署了。

阅读更多
换一批

没有更多推荐了,返回首页