本發(fā)明屬于計(jì)算機(jī)領(lǐng)域,尤其涉及一種代碼管理系統(tǒng)及方法。
背景技術(shù):
現(xiàn)有的代碼管理系統(tǒng),其應(yīng)用與數(shù)據(jù)存儲在同一個硬件上。隨著訪問量的上升,單臺硬件服務(wù)已不能滿足需求。代碼管理系統(tǒng)不同于一般的web應(yīng)用,因?yàn)樗写a數(shù)據(jù)并沒有存儲在分布式數(shù)據(jù)庫上,而是存在本地磁盤中。由此,面臨最棘手的問題是:因?yàn)楣蚕泶鎯Φ膯栴},普通的負(fù)載均衡技術(shù)不能直接應(yīng)用在代碼管理系統(tǒng)上,況且代碼管理系統(tǒng)需要頻繁地讀寫存儲設(shè)備,如果不能妥善地存儲代碼數(shù)據(jù),將影響響應(yīng)速度和穩(wěn)定性。
以使用git(一款免費(fèi)、開源的分布式版本控制系統(tǒng))做為版本管理工具為例,進(jìn)行項(xiàng)目的合作開發(fā)時需要借助遠(yuǎn)程倉庫,通過遠(yuǎn)程倉庫和本地倉庫之間的同步,供項(xiàng)目的不同成員統(tǒng)一存儲代碼及變更。遠(yuǎn)程倉庫將運(yùn)行在一臺機(jī)器上,而本地倉庫會隨著開發(fā)人員的增多而不斷的增多,這種模式對于開發(fā)人數(shù)并不是很多的中小團(tuán)隊(duì)非常適用,而對于開發(fā)人數(shù)上千、上萬的公司,遠(yuǎn)程倉庫使用一臺機(jī)器的弊端將會徹底地暴露出來。因開發(fā)人數(shù)很多,本地倉庫會頻繁地和遠(yuǎn)程倉庫進(jìn)行交互,從而對服務(wù)端機(jī)器的配置和性能有很高的要求,并且萬一這臺服務(wù)器出現(xiàn)故障,將會影響所有的開發(fā)人員,容錯方面會非常糟糕。通常一個網(wǎng)站在遇到這種瓶頸時,會采用負(fù)載均衡的方式,將服務(wù)端的壓力由一臺分?jǐn)偟蕉嗯_機(jī)器,從而減輕單臺服務(wù)端機(jī)器的壓力,實(shí)現(xiàn)由多臺性能一般的機(jī)器代替一臺性能非常高的機(jī)器的目的。但是這個方案還存在致命的問題,因?yàn)間it的遠(yuǎn)程倉庫是存儲在磁盤上的,所以當(dāng)使用負(fù)載均衡器訪問遠(yuǎn)程倉庫時,因?yàn)椴⒉恢缹⒁L問的倉庫在哪個機(jī)器上,所以可能造成找不到要訪問的遠(yuǎn)程倉庫而導(dǎo)致訪問失敗。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題是為了克服現(xiàn)有技術(shù)中因?yàn)楣蚕泶鎯Φ膯栴},普通的負(fù)載均衡技術(shù)不能直接應(yīng)用在代碼管理系統(tǒng)上,否則容易造成訪問代碼失敗的缺陷,提供一種可擴(kuò)展的高性能代碼管理系統(tǒng)及方法。
本發(fā)明是通過以下技術(shù)方案解決上述技術(shù)問題的:
一種代碼管理系統(tǒng),包括:
至少一服務(wù)器,每個服務(wù)器上分別存儲有至少一項(xiàng)目倉庫;
與所述服務(wù)器均連接的轉(zhuǎn)發(fā)器,用于記錄每一項(xiàng)目倉庫所在的服務(wù)器,還用于接收由請求端發(fā)送的請求操作項(xiàng)目倉庫的請求,以及查找所述請求請求操作的項(xiàng)目倉庫所在的服務(wù)器,并向查找到的服務(wù)器發(fā)送所述請求。
其中,所述項(xiàng)目倉庫用于存儲代碼;記錄每一項(xiàng)目倉庫所在的服務(wù)器即等于記錄項(xiàng)目倉庫與服務(wù)器的對應(yīng)關(guān)系。本方案中,轉(zhuǎn)發(fā)器設(shè)于服務(wù)器與請求端之間,通過轉(zhuǎn)發(fā)器將請求端的請求發(fā)送至相應(yīng)的服務(wù)器,即使遇到了因代碼數(shù)據(jù)過多而需要增加新的服務(wù)器的情況,也只需要在轉(zhuǎn)發(fā)器中增加新的對應(yīng)關(guān)系,而請求端的請求依舊是發(fā)送到轉(zhuǎn)發(fā)器,不必直接尋找想要訪問的服務(wù)器,這樣可以在幾乎不損耗性能的情況下將單臺服務(wù)器的壓力分?jǐn)偟蕉嗯_服務(wù)器,有利于整個代碼管理系統(tǒng)的擴(kuò)展,并在容錯方面有了很大的提升。
較佳地,所述服務(wù)器用于接收所述轉(zhuǎn)發(fā)器發(fā)送的請求,并根據(jù)所述請求返回相應(yīng)的代碼數(shù)據(jù)至所述轉(zhuǎn)發(fā)器;
所述轉(zhuǎn)發(fā)器還用于將返回的代碼數(shù)據(jù)發(fā)送至所述請求端。
較佳地,所述轉(zhuǎn)發(fā)器還用于將每一項(xiàng)目倉庫所在的服務(wù)器記錄在數(shù)據(jù)庫中,以及從所述數(shù)據(jù)庫中查找所述請求請求操作的項(xiàng)目倉庫所在的服務(wù)器。
較佳地,所述轉(zhuǎn)發(fā)器包括第一轉(zhuǎn)發(fā)器;
所述第一轉(zhuǎn)發(fā)器用于接收由所述請求端發(fā)送的第一請求,所述第一請求用于請求創(chuàng)建第一項(xiàng)目倉庫,所述第一轉(zhuǎn)發(fā)器還用于為所述第一項(xiàng)目倉庫分配用于存儲所述第一項(xiàng)目倉庫的服務(wù)器并進(jìn)行記錄;
和/或,所述第一轉(zhuǎn)發(fā)器用于接收由所述請求端發(fā)送的第二請求,所述第二請求用于請求使用第一協(xié)議訪問第二項(xiàng)目倉庫,所述第一轉(zhuǎn)發(fā)器還用于由所述第二請求生成所述第二項(xiàng)目倉庫的地址信息并從所述地址信息中取出所述第二項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并向查找到的服務(wù)器發(fā)送所述第二請求。
其中,所述第一協(xié)議為http協(xié)議。
較佳地,所述轉(zhuǎn)發(fā)器包括第二轉(zhuǎn)發(fā)器;
所述第二轉(zhuǎn)發(fā)器用于接收由所述請求端發(fā)送的第三請求,所述第三請求用于請求使用第二協(xié)議獲取第三項(xiàng)目倉庫的代碼數(shù)據(jù);
所述第二轉(zhuǎn)發(fā)器還用于由所述第三請求生成命令并從所述命令中截取出所述第三項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并生成第四請求,所述第四請求指示出從所述查找到的服務(wù)器上獲取所述第三項(xiàng)目倉庫的代碼數(shù)據(jù)。
其中,所述第二協(xié)議為ssh協(xié)議。
一種代碼管理方法,包括:
將項(xiàng)目倉庫存儲于服務(wù)器上;
記錄每一項(xiàng)目倉庫所在的服務(wù)器;
接收由請求端發(fā)送的請求操作項(xiàng)目倉庫的請求;
查找所述請求請求操作的項(xiàng)目倉庫所在的服務(wù)器,并向查找到的服務(wù)器發(fā)送所述請求。
較佳地,所述代碼管理方法還包括:
在所述服務(wù)器接收到所述轉(zhuǎn)發(fā)器發(fā)送的請求時,根據(jù)所述請求返回相應(yīng)的代碼數(shù)據(jù);
將返回的代碼數(shù)據(jù)發(fā)送至所述請求端。
較佳地,所述代碼管理方法還包括:
將每一項(xiàng)目倉庫所在的服務(wù)器記錄在數(shù)據(jù)庫中;
以及,從所述數(shù)據(jù)庫中查找所述請求請求操作的項(xiàng)目倉庫所在的服務(wù)器。
較佳地,所述代碼管理方法還包括:
接收由所述請求端發(fā)送的第一請求,所述第一請求用于請求創(chuàng)建第一項(xiàng)目倉庫,以及為所述第一項(xiàng)目倉庫分配用于存儲所述第一項(xiàng)目倉庫的服務(wù)器并進(jìn)行記錄;
和/或,接收由所述請求端發(fā)送的第二請求,所述第二請求用于請求使用第一協(xié)議訪問第二項(xiàng)目倉庫,由所述第二請求生成所述第二項(xiàng)目倉庫的地址信息并從所述地址信息中取出所述第二項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并向查找到的服務(wù)器發(fā)送所述第二請求。
較佳地,所述代碼管理方法還包括:
接收由所述請求端發(fā)送的第三請求,所述第三請求用于請求使用第二協(xié)議獲取第三項(xiàng)目倉庫的代碼數(shù)據(jù);
由所述第三請求生成命令并從所述命令中截取出所述第三項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并生成第四請求,所述第四請求指示出從所述查找到的服務(wù)器上獲取所述第三項(xiàng)目倉庫的代碼數(shù)據(jù)。
在符合本領(lǐng)域常識的基礎(chǔ)上,上述各優(yōu)選條件,可任意組合,即得本發(fā)明各較佳實(shí)例。
本發(fā)明的積極進(jìn)步效果在于:本發(fā)明請求端在訪問項(xiàng)目倉庫時并不直接訪問項(xiàng)目倉庫所在的服務(wù)器,而是直接訪問轉(zhuǎn)發(fā)器,將轉(zhuǎn)發(fā)器作為請求端與服務(wù)器之間的橋梁,由轉(zhuǎn)發(fā)器將請求端的請求發(fā)送至相應(yīng)的服務(wù)器,這樣具有以下優(yōu)點(diǎn):
一方面,請求端不需要知道請求的項(xiàng)目倉庫所在的服務(wù)器,只需要輸入請求的項(xiàng)目倉庫,節(jié)省了操作;
另一方面,在代碼數(shù)據(jù)過多時,只需要增加新的服務(wù)器來存儲代碼并在轉(zhuǎn)發(fā)器中增加新的對應(yīng)關(guān)系,不會對請求端造成任何影響,請求端的請求依舊是發(fā)送到轉(zhuǎn)發(fā)器,十分有利于整個代碼管理系統(tǒng)的擴(kuò)展,并在容錯方面有了很大的提升。
附圖說明
圖1為本發(fā)明一較佳實(shí)施例的代碼管理系統(tǒng)的系統(tǒng)示意圖。
圖2為本發(fā)明一較佳實(shí)施例的代碼管理系統(tǒng)的接收到第一請求時的系統(tǒng)工作示意圖。
圖3為本發(fā)明一較佳實(shí)施例的代碼管理系統(tǒng)的接收到第二請求時的系統(tǒng)工作示意圖。
圖4為本發(fā)明一較佳實(shí)施例的代碼管理系統(tǒng)的接收到第三請求時的系統(tǒng)工作示意圖。
圖5為本發(fā)明一較佳實(shí)施例的代碼管理方法的流程圖。
具體實(shí)施方式
下面通過實(shí)施例的方式進(jìn)一步說明本發(fā)明,但并不因此將本發(fā)明限制在所述的實(shí)施例范圍之中。
實(shí)施例
一種代碼管理系統(tǒng),如圖1所示,包括:
至少一服務(wù)器,每個服務(wù)器上分別存儲有至少一項(xiàng)目倉庫。其中,所述項(xiàng)目倉庫用于存儲代碼。圖1中示意性的繪出兩個服務(wù)器,分別為服務(wù)器1和服務(wù)器2,其中,服務(wù)器1上存儲有一個項(xiàng)目倉庫,為project1,服務(wù)器2上存儲有兩個項(xiàng)目倉庫,分別為project2和project3。
與所述服務(wù)器均連接的轉(zhuǎn)發(fā)器3,用于將每一項(xiàng)目倉庫所在的服務(wù)器記錄在數(shù)據(jù)庫4中,即記錄每一項(xiàng)目倉庫與服務(wù)器的對應(yīng)關(guān)系。
所述轉(zhuǎn)發(fā)器3,還用于接收由請求端5發(fā)送的請求操作項(xiàng)目倉庫的請求,以及從所述數(shù)據(jù)庫4中查找所述請求請求操作的項(xiàng)目倉庫所在的服務(wù)器,并向查找到的服務(wù)器發(fā)送所述請求。
所述服務(wù)器用于接收所述轉(zhuǎn)發(fā)器發(fā)送的請求,并根據(jù)所述請求返回相應(yīng)的代碼數(shù)據(jù)至所述轉(zhuǎn)發(fā)器。其中,所述服務(wù)器返回的代碼數(shù)據(jù)依所述請求而定,例如,所述請求請求讀取項(xiàng)目倉庫的某一代碼數(shù)據(jù),那么所述服務(wù)器返回的代碼數(shù)據(jù)就為項(xiàng)目倉庫的該代碼數(shù)據(jù)。
所述轉(zhuǎn)發(fā)器3還用于將返回的數(shù)據(jù)發(fā)送至所述請求端5。
以請求端5請求操作project1為例,請求端5發(fā)送請求至轉(zhuǎn)發(fā)器3,轉(zhuǎn)發(fā)器3從數(shù)據(jù)庫4中查找project1所在的服務(wù)器,查找結(jié)果為服務(wù)器1,轉(zhuǎn)發(fā)器3將請求發(fā)送至服務(wù)器1,服務(wù)器1接收請求,并根據(jù)所述請求返回相應(yīng)的代碼數(shù)據(jù)至轉(zhuǎn)發(fā)器3,轉(zhuǎn)發(fā)器3再將返回的代碼數(shù)據(jù)發(fā)送至請求端5。
具體地,所述轉(zhuǎn)發(fā)器包括第一轉(zhuǎn)發(fā)器和第二轉(zhuǎn)發(fā)器。以基于Gitlab(一個用于倉庫管理系統(tǒng)的開源項(xiàng)目)實(shí)現(xiàn)本實(shí)施例的代碼管理系統(tǒng)為例,所述第一轉(zhuǎn)發(fā)器為http(超文本傳輸協(xié)議)轉(zhuǎn)發(fā)器,即基于http協(xié)議的轉(zhuǎn)發(fā)器,所述第二轉(zhuǎn)發(fā)器為ssh(安全外殼協(xié)議)轉(zhuǎn)發(fā)器,即基于ssh協(xié)議的轉(zhuǎn)發(fā)器。
如圖2所示,所述第一轉(zhuǎn)發(fā)器31用于接收由所述請求端5發(fā)送的第一請求,所述第一請求用于請求創(chuàng)建第一項(xiàng)目倉庫,所述第一轉(zhuǎn)發(fā)器31還用于為所述第一項(xiàng)目倉庫分配用于存儲所述第一項(xiàng)目倉庫的服務(wù)器并進(jìn)行記錄,在數(shù)據(jù)庫4中記錄第一項(xiàng)目倉庫所在的服務(wù)器。
以請求端5請求創(chuàng)建project4為例,project4即為上述的第一項(xiàng)目倉庫,請求端5發(fā)送第一請求至第一轉(zhuǎn)發(fā)器31,第一轉(zhuǎn)發(fā)器31為project4隨機(jī)分配一個服務(wù)器,如服務(wù)器2,用于存儲創(chuàng)建的project4,然后記錄在數(shù)據(jù)庫4中,服務(wù)器2返回創(chuàng)建結(jié)果(如創(chuàng)建成功或失敗)至第一轉(zhuǎn)發(fā)器31,第一轉(zhuǎn)發(fā)器31再發(fā)送給請求端5。
如圖3所示,所述第一轉(zhuǎn)發(fā)器31還用于接收由所述請求端5發(fā)送的第二請求,所述第二請求用于請求使用http協(xié)議訪問第二項(xiàng)目倉庫,所述第一轉(zhuǎn)發(fā)器31還用于由所述第二請求生成所述第二項(xiàng)目倉庫的地址信息并從所述地址信息中取出所述第二項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并向查找到的服務(wù)器發(fā)送所述第二請求。
以請求端5請求使用http協(xié)議訪問并clone(生成被選元素的副本)project1至本地為例,project1即為上述的第二項(xiàng)目倉庫,請求端5發(fā)送第二請求至第一轉(zhuǎn)發(fā)器31,所述第二請求為git命令:git clone https://ex.com/ex/project1.git,第一轉(zhuǎn)發(fā)器31接收到該git命令后,生成project1的地址信息并訪問下述url:
https://ex.com/ex/project1.git/info/refs?service=git-upload-pack,從中取出項(xiàng)目名project1,然后從數(shù)據(jù)庫4中查找project1對應(yīng)的服務(wù)器,查找結(jié)果為服務(wù)器1,再將第二請求發(fā)送至服務(wù)器1,服務(wù)器1接收第二請求,并根據(jù)所述第二請求返回相應(yīng)的代碼數(shù)據(jù)至第一轉(zhuǎn)發(fā)器31,第一轉(zhuǎn)發(fā)器31再將返回的代碼數(shù)據(jù)發(fā)送至請求端5。
如圖4所示,所述第二轉(zhuǎn)發(fā)器32用于接收由所述請求端5發(fā)送的第三請求,所述第三請求用于請求使用ssh協(xié)議獲取第三項(xiàng)目倉庫的代碼數(shù)據(jù)。所述第二轉(zhuǎn)發(fā)器32還用于由所述第三請求生成命令并從所述命令中截取出所述第三項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并生成第四請求,所述第四請求指示出從所述查找到的服務(wù)器上獲取所述第三項(xiàng)目倉庫的代碼數(shù)據(jù)。
以請求端5請求使用ssh協(xié)議clone(生成被選元素的副本)project1至本地為例,project1即為上述的第三項(xiàng)目倉庫,請求端5發(fā)送第三請求至第二轉(zhuǎn)發(fā)器32,所述第二請求為git命令:git clone git@ex.com:/ex/project1.git,第二轉(zhuǎn)發(fā)器32接收到該git命令后,生成命令:ssh git@ex.com-x upload-pack ex/project1.git,這條命令的意思是在git@ex.com這臺服務(wù)器上執(zhí)行upload-pack ex/project1.git這條指令。然后,第二轉(zhuǎn)發(fā)器32從這條指令中取出項(xiàng)目名,即project1,然后在數(shù)據(jù)庫4中取出project1對應(yīng)的服務(wù)器1。此時再由第二轉(zhuǎn)發(fā)器32向服務(wù)器1發(fā)送ssh請求(第四請求):ssh git@server2.com-x upload-pack ex/project1.git,然后由第二轉(zhuǎn)發(fā)器32將從服務(wù)器1接收到的數(shù)據(jù)回復(fù)給請求端5,將從請求端5接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給服務(wù)器1。
本實(shí)施例的代碼管理方法,如圖5所示,包括以下步驟:
步驟001、將項(xiàng)目倉庫存儲于服務(wù)器上;
步驟002、將每一項(xiàng)目倉庫所在的服務(wù)器記錄在數(shù)據(jù)庫中;
步驟003、接收由請求端發(fā)送的請求操作項(xiàng)目倉庫的請求;
步驟004、從所述數(shù)據(jù)庫中查找所述請求請求操作的項(xiàng)目倉庫所在的服務(wù)器,并向查找到的服務(wù)器發(fā)送所述請求;
步驟005、在所述服務(wù)器接收到所述轉(zhuǎn)發(fā)器發(fā)送的請求時,根據(jù)所述請求返回相應(yīng)的代碼數(shù)據(jù);
步驟006、將返回的代碼數(shù)據(jù)發(fā)送至所述請求端。
其中,由請求端發(fā)送的請求包括第一請求、第二請求和第三請求;
所述第一請求用于請求創(chuàng)建第一項(xiàng)目倉庫;
所述第二請求用于請求使用第一協(xié)議訪問第二項(xiàng)目倉庫;
所述第三請求用于請求使用第二協(xié)議獲取第三項(xiàng)目倉庫的代碼數(shù)據(jù)。
步驟004具體包括:
在接收到所述第一請求時,為所述第一項(xiàng)目倉庫分配用于存儲所述第一項(xiàng)目倉庫的服務(wù)器并進(jìn)行記錄;
在接收到所述第二請求時,由所述第二請求生成所述第二項(xiàng)目倉庫的地址信息并從所述地址信息中取出所述第二項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并向查找到的服務(wù)器發(fā)送所述第二請求;
在接收到所述第三請求時,由所述第三請求生成命令并從所述命令中截取出所述第三項(xiàng)目倉庫的項(xiàng)目名,以及根據(jù)所述項(xiàng)目名查找對應(yīng)的服務(wù)器并生成第四請求,所述第四請求指示出從所述查找到的服務(wù)器上獲取所述第三項(xiàng)目倉庫的代碼數(shù)據(jù)。
雖然以上描述了本發(fā)明的具體實(shí)施方式,但是本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,這些僅是舉例說明,本發(fā)明的保護(hù)范圍是由所附權(quán)利要求書限定的。本領(lǐng)域的技術(shù)人員在不背離本發(fā)明的原理和實(shí)質(zhì)的前提下,可以對這些實(shí)施方式做出多種變更或修改,但這些變更和修改均落入本發(fā)明的保護(hù)范圍。