十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
1. 整體架構
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供渭濱網站建設、渭濱做網站、渭濱網站設計、渭濱網站制作等企業(yè)網站建設、網頁設計與制作、渭濱企業(yè)網站模板建站服務,10余年渭濱做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。
kingshard采用Go開發(fā),充分地利用了Go語言的并發(fā)特性。Go語言在并發(fā)方面,做了很好的封裝,這大大簡化了kingshard的開發(fā)工作。kingshard的整體工作流程入下所述:
讀取配置文件并啟動,在配置文件中設置的監(jiān)聽端口監(jiān)聽客戶端請求。
收到客戶端連接請求后,啟動一個goroutine單獨處理該請求。
首選進行登錄驗證,驗證過程完全兼容MySQL認證協(xié)議,由于用戶名和密碼在配置文件中已經設置好,所以可以利用該信息驗證連接請求是否合法。
當用戶名和密碼都正確時,轉入下面的步驟,否則返回出錯信息給客戶端。
認證通過后,客戶端發(fā)送SQL語句。
讀取配置文件并啟動,在配置文件中設置的監(jiān)聽端口監(jiān)聽客戶端請求。
收到客戶端連接請求后,啟動一個goroutine單獨處理該請求。
首選進行登錄驗證,驗證過程完全兼容MySQL認證協(xié)議,由于用戶名和密碼在配置文件中已經設置好,所以可以利用該信息驗證連接請求是否合法。?
當用戶名和密碼都正確時,轉入下面的步驟,否則返回出錯信息給客戶端。
認證通過后,客戶端發(fā)送SQL語句。
kingshard對客戶端發(fā)送過來的SQL語句,進行詞法和語義分析,識別出SQL的類型和生成SQL的路由計劃。如果有必要還會改寫SQL,然后轉發(fā)到相應的DB。也有可能不做詞法和語義分析直接轉發(fā)到相應的后端DB。如果轉發(fā)SQL是分表且跨多個DB,則每個DB對應啟動一個goroutine發(fā)送SQL和接收該DB返回的結果。
接收并合并結果,然后轉發(fā)給客戶端。
Gorm是Go語言開發(fā)用的比較多的一個ORM。它的功能比較全:
但是這篇文章中并不會直接看Gorm的源碼,我們會先從database/sql分析。原因是Gorm也是基于這個包來封裝的一些功能。所以只有先了解了database/sql包才能更加好的理解Gorm源碼。
database/sql 其實也是一個對于mysql驅動的上層封裝?!眊ithub.com/go-sql-driver/mysql”就是一個對于mysql的驅動,database/sql 就是在這個基礎上做的基本封裝包含連接池的使用
下面這個是最基本的增刪改查操作
操作分下面幾個步驟:
因為Gorm的連接池就是使用database/sql包中的連接池,所以這里我們需要學習一下包里的連接池的源碼實現(xiàn)。其實所有連接池最重要的就是連接池對象、獲取函數(shù)、釋放函數(shù)下面來看一下database/sql中的連接池。
DB對象
獲取方法
釋放連接方法
連接池的實現(xiàn)有很多方法,在database/sql包中使用的是chan阻塞 使用map記錄等待列表,等到有連接釋放的時候再把連接傳入等待列表中的chan 不在阻塞返回連接。
之前我們看到的Redigo是使用一個chan 來阻塞,然后釋放的時候放入空閑列表,在往這一個chan中傳入struct{}{},讓程序繼續(xù) 獲取的時候再從空閑列表中獲取。并且使用的是鏈表的結構來存儲空閑列表。
database/sql 是對于mysql驅動的封裝,然而Gorm則是對于database/sql的再次封裝。讓我們可以更加簡單的實現(xiàn)對于mysql數(shù)據(jù)庫的操作。