摘要:采用微服務(wù)架構(gòu)設(shè)計(jì)的原因很簡(jiǎn)單解放生產(chǎn)力。運(yùn)行時(shí)服務(wù)缺少標(biāo)準(zhǔn),各類實(shí)現(xiàn)區(qū)別很大,調(diào)試?yán)щy程度不一,集成測(cè)試更是難上加難。小伙伴們更進(jìn)一步的互相提供幫助集成測(cè)試及單元測(cè)試,極大的釋放了團(tuán)隊(duì)生產(chǎn)力。
Docker 自發(fā)布以來,它的影響力不容小覷,目前已經(jīng)在整個(gè)行業(yè)甚至于許多大企業(yè)都得到實(shí)際的應(yīng)用案例以及支持。Coding.net 作為一個(gè)創(chuàng)業(yè)公司,大量采用了微服務(wù)架構(gòu)解耦系統(tǒng),在提高開發(fā)效率的同時(shí)也引入了不少新的問題。今天在這里跟大家分享一下我們是如何采用 Docker 技術(shù)在內(nèi)部推行生產(chǎn)環(huán)境容器化,代碼化,自動(dòng)化的。
微服務(wù)架構(gòu)從2014年上線到如今,Coding.net 已經(jīng)由早期的一個(gè) Java war 發(fā)展成為一個(gè)系統(tǒng)結(jié)構(gòu)復(fù)雜,獨(dú)立模塊很多的大型分布式程序。網(wǎng)站的每個(gè)小功能,比如說 GIT 協(xié)議處理、Repo 信息讀取(網(wǎng)頁展示)、Push 動(dòng)態(tài)、郵件通知等等都作為一個(gè)個(gè)微型服務(wù)在云上運(yùn)行,互相通過 API / RPC 調(diào)用充分解耦,互不侵入,接口明確。 采用微服務(wù)架構(gòu)設(shè)計(jì)的原因很簡(jiǎn)單:解放生產(chǎn)力。傳統(tǒng) Java 基于 Application Server 的開發(fā)模型下,AS確實(shí)提供了很多運(yùn)行時(shí)服務(wù),很多功能都可以在其中實(shí)現(xiàn),但是這也帶來了 AS 負(fù)擔(dān)過重,組件隔離性不強(qiáng)的問題。AS 運(yùn)行時(shí)服務(wù)缺少標(biāo)準(zhǔn),各類實(shí)現(xiàn)區(qū)別很大,調(diào)試?yán)щy程度不一,集成測(cè)試更是難上加難。
在這種環(huán)境下,松耦合的實(shí)際是非常可行的提高團(tuán)隊(duì)生產(chǎn)力的方案。放開手腳讓小朋友們自己選擇合適的程序包裝方式,實(shí)現(xiàn)語言。小伙伴們更進(jìn)一步的互相提供 Mock/Stub 幫助集成測(cè)試及單元測(cè)試,極大的釋放了團(tuán)隊(duì)生產(chǎn)力。
容器化經(jīng)歷了早期野蠻式、爆發(fā)式的服務(wù)拆分后,Coding.net 不可避免的面臨著生產(chǎn)環(huán)境中越來越高的復(fù)雜度問題。早期 Coding.net 的部署方式簡(jiǎn)單,一個(gè) War 包拖入合適位置,網(wǎng)站就完全更新了。拆分后,變成了三五個(gè)小服務(wù)跑在十幾臺(tái)虛擬機(jī)上的問題。同時(shí)這三五個(gè)小服務(wù)又分別使用不同技術(shù)實(shí)現(xiàn),有的是 Jar 文件運(yùn)行,有的采用 Jetty+war 或者 Tomcat +war 。一批小伙伴用 Go 重寫了一部分服務(wù),還有幾個(gè)小伙伴采用 Ruby 重構(gòu)了另外一個(gè)核心功能。如此一來,生產(chǎn)環(huán)境的壓力可想而知。每個(gè)組件的編譯方式各不相同,啟動(dòng)方式和配置方式更是天差地別,甚至有好幾個(gè)組件就是源代碼直接運(yùn)行。運(yùn)維同學(xué)不光要記住所有組件的運(yùn)行位置、編譯方法,更要記住配置方式、依賴模型,壓力山大!同時(shí),某一天大家突然發(fā)現(xiàn),我們?cè)僖膊荒馨颜麄€(gè) Coding.net 在機(jī)器上跑起來了,因?yàn)檎l也不知道如何才能正確安裝配置各種依賴服務(wù)。
為了解決這些問題, 我們最終采用了 Docker container 技術(shù)來降低生產(chǎn)環(huán)境的復(fù)雜度。有個(gè)比喻很形象,Docker 把程序裝進(jìn)了盒子里,每個(gè) Docker 鏡像包含了完整的程序代碼,運(yùn)行時(shí)狀態(tài),而且有一個(gè)標(biāo)準(zhǔn)的啟動(dòng)接口。不管小伙伴設(shè)計(jì)的牛X程序多復(fù)雜,一個(gè) docker run 也能把他正常運(yùn)行起來。同時(shí) Docker 還帶來了版本化的集成,從此告別了不知道運(yùn)行什么版本代碼的問題。
代碼化應(yīng)用程序裝進(jìn)盒子后,我們還面臨著盒子在哪里運(yùn)行的問題。非常實(shí)在的說十幾個(gè) Container 和十幾臺(tái)VM 存在著比較復(fù)雜的對(duì)應(yīng)關(guān)系,原因是很現(xiàn)實(shí)的:設(shè)計(jì)之初程序之間的 RPC 是依靠主機(jī) DNS 地址互相通信的,就算裝進(jìn)了盒子里,盒子也不能輕易挪動(dòng)。如果挪動(dòng)盒子A,可能涉及到更改盒子B、C、D的配置。所以實(shí)際上 Explicit knowledge 在小伙伴的日常工作里變成了非常嚴(yán)重的問題。 這個(gè)問題的解決之道就是將依賴關(guān)系代碼化。服務(wù)之間關(guān)聯(lián)復(fù)雜不要緊,只要我們把各種依賴關(guān)系變成代碼,計(jì)算機(jī)可以幫助自動(dòng)處理相當(dāng)一部分的工作。
代碼化分為兩大塊:第一塊是用一個(gè)腳本從云服務(wù)提供商那里抓去了所有機(jī)器的 host/IP 配置。 第二塊是定義了一個(gè) protobuf 文件將 Coding.net 生產(chǎn)環(huán)境的服務(wù)主機(jī)的對(duì)應(yīng)關(guān)系記錄下來。我們進(jìn)一步設(shè)計(jì)了一個(gè) Service IP 體制,自動(dòng)為生產(chǎn)環(huán)境中的每個(gè)服務(wù)創(chuàng)建一個(gè) DNS CNAME 記錄,指向服務(wù)實(shí)際使用的機(jī)器 DNS A 記錄。于是當(dāng)有服務(wù)挪動(dòng)操作的時(shí)候,DNS記錄會(huì)刷新,所有的下游依賴都會(huì)重新解析DNS 到新的地址。同時(shí),我們還自己開發(fā)了一個(gè)工具,根據(jù)記錄的信息檢查生產(chǎn)環(huán)境是否與記錄存在差異,進(jìn)一步可以將常用操作(如啟動(dòng)停止,更新,移動(dòng)主機(jī))等等包裝起來,為操作人員提供一個(gè)標(biāo)準(zhǔn)的 CLI 工具,將復(fù)雜的生產(chǎn)環(huán)境操作變成程序。
同樣道理,我們也可以按代碼生成一個(gè)開發(fā)環(huán)境的定義,用一套工具同時(shí)操作開發(fā)環(huán)境和生產(chǎn)環(huán)境。小伙伴們一鍵可以在自己電腦上起停整個(gè) Coding.net 服務(wù)云,也可以同樣的命令一鍵起停生產(chǎn)環(huán)境(前提當(dāng)然是有足夠權(quán)限)。這樣環(huán)境的統(tǒng)一所帶來的生產(chǎn)力變革是非常深刻的,對(duì)公司研發(fā)的組織架構(gòu)也有很深遠(yuǎn)的影響,有機(jī)會(huì)的話可以在另一篇文章里詳細(xì)再說。
自動(dòng)化裝進(jìn)盒子,能挪動(dòng),只描述了 Coding.net 宏偉藍(lán)圖的一小部分,而管理大規(guī)模生產(chǎn)環(huán)境的關(guān)鍵在于自動(dòng)化。做好代碼化之后,我們馬上上馬 Continuous Deployment ,讓每一行更改過的代碼一分鐘內(nèi)進(jìn)入 Staging, 再結(jié)合自動(dòng)化的 Regresssion testing 工具,自動(dòng)匯報(bào)未預(yù)見的錯(cuò)誤更改。 同時(shí)我們還有一個(gè)一鍵發(fā)布和回退服務(wù),讓更新變得更簡(jiǎn)單,容易。自動(dòng)化的服務(wù)系統(tǒng)還包括 Log 的轉(zhuǎn)發(fā)存儲(chǔ),metrics 的自動(dòng)收集, Application healthcheck 等等,這些都極大的降低了小組件的運(yùn)維難度,鼓勵(lì)大家開發(fā)更小更獨(dú)立的組件,而不是又笨又大的單體程序。
以上就是 Coding.net 服務(wù)架構(gòu)的演進(jìn), 希望能對(duì)大家有所啟發(fā)。在 4月23 日 QCon 全球軟件開發(fā)大會(huì)“挑戰(zhàn)全棧開發(fā)”專題上,Coding.net 架構(gòu)師 孫宇聰也將會(huì)給大家分享一下如何利用 Docker等的相關(guān)技術(shù)為創(chuàng)業(yè)公司的全棧開發(fā)加分,提高產(chǎn)品質(zhì)量,創(chuàng)造一個(gè)可持續(xù)的全棧開發(fā)環(huán)境。敬請(qǐng)關(guān)注4月23日下午 15:50 《Coding.net 全棧開發(fā)實(shí)踐分享》。歡迎大家交流,郵件 : [email protected]。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26373.html
摘要:說起,必須要介紹是什么東西,為什么中小企業(yè)私有云適合使用。看一下現(xiàn)在的架構(gòu)圖開個(gè)玩笑。上面這四點(diǎn)導(dǎo)致我們必須要統(tǒng)一架構(gòu),最終把整個(gè)業(yè)務(wù)系統(tǒng)遷移到基于的類似于的私有云的平臺(tái)。 本文系 ArchSummit 大會(huì) CODING 工程師王振威演講實(shí)錄。 showImg(https://dn-coding-net-production-pp.qbox.me/c2f81423-54b9-4a7b...
摘要:是一個(gè)典型的模式架構(gòu),用戶通過終端將字符流傳遞給。仿照的工作原理,我們?cè)趨f(xié)議之上設(shè)計(jì)了,見下圖真實(shí)實(shí)現(xiàn)中,是應(yīng)用層的通訊協(xié)議。僵尸進(jìn)程問題我們知道由于缺少而導(dǎo)致僵尸進(jìn)程無法回收的問題迄今存在。進(jìn)入構(gòu)建環(huán)境執(zhí)行命令。 Coding WebIDE 做個(gè)國內(nèi)首個(gè)基于 Docker 技術(shù)的云端開發(fā)平臺(tái)于4月1日正式上線。本文主要和大家分享和探討 Docker 在 Web IDE 中運(yùn)用的一些經(jīng)...
摘要:期待大家的參與上海站圓滿結(jié)束,嘉賓和觀眾熱情不減,現(xiàn)場(chǎng)分享也讓上海觀眾收獲到滿滿的干貨,期望我們未來為大家?guī)砀嘤腥さ脑掝}。 SegmentFault D-Day Docker 主題沙龍上海站,在五角場(chǎng) VMware 上海研發(fā)中心完美結(jié)束,本次沙龍我們邀請(qǐng)具有實(shí)踐經(jīng)驗(yàn)的四位嘉賓,分享滿滿的干貨,為開發(fā)者們介紹 Docker 技術(shù)及其應(yīng)用。 showImg(https://segmen...
摘要:面對(duì)平臺(tái)化的競(jìng)爭(zhēng),推出了調(diào)度引擎,但從未真正流行起來,因?yàn)檎麄€(gè)行業(yè)更傾向于采用,這是第一次死亡它失去了平臺(tái)之戰(zhàn)。左耳朵耗子說過一段話,讓人深以為然:我清楚地看到了 Go 和 Docker 這兩種技術(shù)的生態(tài)圈發(fā)展過程。讓我收獲最大的并不是這些技術(shù)本身,而是技術(shù)的變遷和行業(yè)的發(fā)展。從中,我看到了非常具體的各種思潮和思路,這些更有價(jià)值...... 這些關(guān)鍵新技術(shù),可以讓你拿到技術(shù)的先機(jī)。這些對(duì)一個(gè)...
摘要:在中采用的共識(shí)算法是算法可以在信任程度較低的場(chǎng)景下避免拜占庭問題。但是由于算法本身特性限制,,才能容忍一個(gè)拜占庭節(jié)點(diǎn),因此在版本下,節(jié)點(diǎn)數(shù)量至少是個(gè)。 作者: TopJohn原文連接:https://www.xuanzhangjiong.to... Fabric架構(gòu)演變之路 Hyperledger Fabric是目前主流的開源聯(lián)盟鏈產(chǎn)品之一,自2016年5月12日開辟代碼倉庫之日起,...
閱讀 2941·2021-10-08 10:12
閱讀 4042·2021-09-22 15:45
閱讀 2614·2019-08-30 15:52
閱讀 2681·2019-08-29 18:44
閱讀 2694·2019-08-29 12:37
閱讀 1214·2019-08-26 13:36
閱讀 2611·2019-08-26 13:34
閱讀 1523·2019-08-26 12:20