Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建
在研究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
- 1
使用以下命令切換到最新1.6分支:
git checkout -b 1.6 origin/1.6- 1
- 1
如果你對這個項目感興趣并希望為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,如下所示:
最后點擊OK確定即可。
eclipse和maven都依賴jdk環境,所以務必在安裝之前先安裝好jdk并配置好相應的環境變量。
1.5 導入mycat源碼
完成上面配置后,就可以導入我們之前拉取的mycat源碼:
File -> Import?選擇?Existing Maven Projects,瀏覽選擇我們clone的mycat源碼,點擊確定開始進行導入。第一次導入需要等待maven下載插件以及mycat項目需要用到的第三方依賴庫,等待時間相對長一點。成功完成導入后的項目如下所示:
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.xml、rule.xml和server.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都會經過ServerQueryHandler的query方法,在這個方法首行代碼處打上斷點,然后使用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}表示使用的操作系統平臺,取值有win、Linux、mac、solaris和unix。這樣我們就可以拿對應的軟件包到對應的平臺上去部署了。
總結
以上是生活随笔為你收集整理的Mycat源码篇 : 起步,Mycat源码阅读调试环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关系数据库是如何工作的
- 下一篇: go初学者安装echo框架