自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

重構(gòu)中的外部和內(nèi)部準(zhǔn)備工作

開(kāi)發(fā) 開(kāi)發(fā)工具
重構(gòu)中的準(zhǔn)備工作有很多,今天我們就講一講外部和內(nèi)部的準(zhǔn)備工作有哪些。

[[185018]]

一、重構(gòu)中的外部準(zhǔn)備工作

技改在任何時(shí)候都是個(gè)敏感的事情。大量的問(wèn)題需要擺平,天時(shí)地利人和,缺一不可。

1. 天時(shí)

即選擇合適時(shí)機(jī)進(jìn)行技術(shù)改造工作。在時(shí)機(jī)的選擇上,我們經(jīng)歷了三個(gè)階段。

(1)空閑時(shí)段

在開(kāi)發(fā)企業(yè)應(yīng)用時(shí),技術(shù)改進(jìn)也是常見(jiàn)的工作。企業(yè)應(yīng)用開(kāi)發(fā)的特點(diǎn)是有忙有閑。在版本發(fā)布前都緊鑼密鼓進(jìn)行開(kāi)發(fā)工作;在老版本發(fā)布之后,新版本剛剛啟動(dòng)開(kāi)發(fā)時(shí),有相對(duì)空閑時(shí)間,可以進(jìn)行技術(shù)改進(jìn)。 而當(dāng)這一套方法搬到互聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)上時(shí),卻發(fā)現(xiàn)基本行不通?;ヂ?lián)網(wǎng)應(yīng)用開(kāi)發(fā)是兩種情況:很忙和非常忙。預(yù)留大片的時(shí)間進(jìn)行技術(shù)改進(jìn),幾乎是不現(xiàn)實(shí)的。如果有業(yè)務(wù)可以有空閑時(shí)間做技改,那基本上也就沒(méi)必要改了,因?yàn)檫@也意味著這個(gè)業(yè)務(wù)進(jìn)入穩(wěn)定和衰退期。

(2)隨需改進(jìn)

既然找不到空閑時(shí)段,另一個(gè)選擇是隨需進(jìn)行,也就是在項(xiàng)目開(kāi)發(fā)過(guò)程中,對(duì)涉及到的模塊進(jìn)行改進(jìn)。而在實(shí)踐中,我們也發(fā)現(xiàn)這種做法難度很大。

  • 遺留系統(tǒng)的模塊依賴關(guān)系往往令人匪夷所思,改進(jìn)過(guò)程中,經(jīng)常會(huì)發(fā)現(xiàn)需要對(duì)所依賴的底層模塊進(jìn)行大調(diào)整,導(dǎo)致改進(jìn)工作無(wú)法進(jìn)行。
  • 就算是所依賴的模塊沒(méi)有問(wèn)題,改進(jìn)工作也會(huì)導(dǎo)致更多的時(shí)間開(kāi)銷(xiāo),2~3倍都是正常的。這個(gè)延遲不是所有項(xiàng)目都能夠承受的。

(3)優(yōu)化團(tuán)隊(duì)

比較適合互聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)的做法,是組建專門(mén)團(tuán)對(duì)進(jìn)行技術(shù)改進(jìn)。預(yù)留大約30%的開(kāi)發(fā)能力來(lái)進(jìn)行技改。這些人可以是專門(mén)負(fù)責(zé)架構(gòu)改進(jìn)的,也可以從項(xiàng)目組中抽調(diào)輪崗。

  • 改進(jìn)前,制定改進(jìn)計(jì)劃,循序?qū)⒔M(jìn)行。涉及到具體模塊改進(jìn)時(shí),抽調(diào)負(fù)責(zé)該模塊的技術(shù)人員來(lái)參與。
  • 如果模塊改進(jìn)和業(yè)務(wù)開(kāi)發(fā)工作同時(shí)開(kāi)展,則可以考慮將這兩個(gè)工作合并進(jìn)行。

技改不能一哄而上,也不能蜻蜓點(diǎn)水的做。他是一個(gè)持續(xù)的過(guò)程,循序?qū)⒔?,不要中斷。?xiàng)目緊的時(shí)候挑選風(fēng)險(xiǎn)小的任務(wù)來(lái)執(zhí)行,少安排幾個(gè)重構(gòu)點(diǎn)。項(xiàng)目松的時(shí)候重構(gòu)下核心接口,多安排些重構(gòu)。但是不要中斷。 一旦中斷,往往結(jié)果是沒(méi)有人會(huì)愿意繼續(xù)。重構(gòu)往往是個(gè)前人栽樹(shù) 后人乘涼的事,風(fēng)險(xiǎn)又大,短期看不到效果,大家做著做著,往往就放棄了。所以持續(xù)改進(jìn)是必須的,避免半途而廢。

還有一個(gè)大家容易忽略的地方,對(duì)于特別看重績(jī)效的團(tuán)隊(duì),按照產(chǎn)出來(lái)度量工作成果,那必須果斷避開(kāi)績(jī)效考評(píng)的這段敏感時(shí)期。

2. 地利

所謂地利,從軟件角度,主要是基礎(chǔ)設(shè)施的建設(shè)。在針對(duì)現(xiàn)有系統(tǒng)進(jìn)行改進(jìn),推動(dòng)微服務(wù)架構(gòu)前,需要評(píng)估下當(dāng)前的基礎(chǔ)設(shè)施建設(shè)是否能夠滿足要求。 服務(wù)所需要的基礎(chǔ)設(shè)施包括:

(1)虛機(jī)環(huán)境或者docker

不同服務(wù)的線上壓力和運(yùn)行環(huán)境需求不同,內(nèi)存,CPU,磁盤(pán)需求也不一樣。按照服務(wù)需要自動(dòng)彈性創(chuàng)建所需要的環(huán)境,是微服務(wù)部署的前置條件。

(2)版本控制軟件

版本控制不僅僅是協(xié)調(diào)人和人之間的協(xié)作,同時(shí)也是保證線上運(yùn)行的系統(tǒng)必須是最終正式的版本。一旦出現(xiàn)問(wèn)題,開(kāi)發(fā)人員可以從版本控制服務(wù)器上下載到一致的代碼。現(xiàn)在一般用git來(lái)實(shí)現(xiàn)。為什么不用SVN,網(wǎng)上有很多對(duì)比文章,不是本文重點(diǎn)。

(3)代碼評(píng)審軟件

每個(gè)微服務(wù)作為獨(dú)立的項(xiàng)目來(lái)開(kāi)發(fā),統(tǒng)一編碼規(guī)范,審核代碼邏輯等,在這場(chǎng)景下猶為重要。和git相配合,gitlab是優(yōu)先考慮的codereview軟件。

(4)集成發(fā)布

集群對(duì)微服務(wù)是必不可少的基礎(chǔ)環(huán)境,將一個(gè)服務(wù)部署到幾十,甚至上千臺(tái)機(jī)器上是必要的。這種情況下,人工部署是不現(xiàn)實(shí)的,依賴于集成發(fā)布環(huán)境,實(shí)現(xiàn)獲取版本,集成編譯,備份老版本,發(fā)布新版本,啟動(dòng)服務(wù),暫停服務(wù)和重啟服務(wù)。推薦使用jenkins。

(5)系統(tǒng)監(jiān)控

監(jiān)控自動(dòng)化也是必要的基礎(chǔ)設(shè)施。對(duì)出問(wèn)題的服務(wù)報(bào)警,在高峰期對(duì)核心服務(wù)進(jìn)行監(jiān)控,都必須借助監(jiān)控系統(tǒng)來(lái)處理。推薦使用zabbix。

(6)日志分析

排查錯(cuò)誤和對(duì)系統(tǒng)進(jìn)行審查,日志處理是不可避免的。想跟蹤某個(gè)ID用戶的行為,在幾百臺(tái)機(jī)器上逐個(gè)查看日志也是不現(xiàn)實(shí)的。使用工具,如ELK,將日志收集到一個(gè)存儲(chǔ)中,提供檢索功能來(lái)查看日志,甚至對(duì)日志做統(tǒng)計(jì)分析,也是必須的設(shè)施。

(7)辦公環(huán)境

不用說(shuō),新老系統(tǒng)開(kāi)發(fā)人員得在一起辦公,隨時(shí)交流。如果條件無(wú)法滿足,那至少必須建立順暢的溝通方式,比如QQ群,微信群等。郵件并不是一個(gè)好的選擇,電話會(huì)議也是不錯(cuò)的。

3. 人和

最重要的因素??傮w上包括三個(gè)方面內(nèi)容,上級(jí)領(lǐng)導(dǎo)的支持,團(tuán)隊(duì)成員的認(rèn)可,合作部門(mén)的理解。

(1)上級(jí)的支持

毫無(wú)疑問(wèn),上級(jí)領(lǐng)導(dǎo)支持是前提條件。重構(gòu)是高風(fēng)險(xiǎn)的工作,往往不容易立即出新成果,而且還需要額外的投入。幾個(gè)月內(nèi),沒(méi)有新東西,出貨速度變慢,沒(méi)有其他因素,不是重構(gòu)就是在怠工。從公司層面,更高層的人越能知道什么時(shí)機(jī)適合開(kāi)展重構(gòu)工作。公司馬上要架構(gòu)調(diào)整了,系統(tǒng)快下架了,近期有重大活動(dòng)需要支持,有人需要盡快出成果來(lái)晉升….都需要慎重評(píng)估是否可以進(jìn)行重構(gòu),而這些事情,越高層的人掌握的信息越多,所以得到他們的支持是必須的。

(2)團(tuán)隊(duì)成員的認(rèn)可

其次是團(tuán)隊(duì)成員們認(rèn)可。特別是老系統(tǒng)的開(kāi)發(fā)人員,他們認(rèn)可和毫無(wú)保留的支持是必要的條件。他們最清楚系統(tǒng)有哪些坑,哪些是必須改動(dòng)的,哪些是沒(méi)有用的功能,哪些只是臨時(shí)的解決方案。這樣才可以在功能遷移時(shí),有目的地進(jìn)行調(diào)整。

二、重構(gòu)中的內(nèi)部準(zhǔn)備工作

隨著系統(tǒng)改進(jìn)工作的進(jìn)行,一些架構(gòu)性的問(wèn)題也越來(lái)越突出。在開(kāi)發(fā)中,一個(gè)遺留接口是否要遷移到微服務(wù)架構(gòu)上,哪些接口應(yīng)該放到同一個(gè)項(xiàng)目上,項(xiàng)目應(yīng)該如何組織,日志、監(jiān)控等基礎(chǔ)性的工作應(yīng)該怎么統(tǒng)一規(guī)劃,都需要從架構(gòu)的層面來(lái)進(jìn)行設(shè)計(jì)。

1. 確定目標(biāo)

公司每一年都會(huì)有一個(gè)明確的戰(zhàn)略目標(biāo),這個(gè)目標(biāo)最終會(huì)被分解到每個(gè)業(yè)務(wù)上去實(shí)施。 對(duì)于支付業(yè)務(wù),我們的目標(biāo)是:

(1)持續(xù)提升支付成功率

支付成功率是支付業(yè)務(wù)的***衡量指標(biāo)。提升成功率的首要措施是提升系統(tǒng)的穩(wěn)定性,在此基礎(chǔ)上,通過(guò)簡(jiǎn)化支付流程、優(yōu)化支付路由等措施,提升轉(zhuǎn)化率。

(2)持續(xù)降低支付成本

在保證支付的穩(wěn)定的前提下,引入更多底成本的渠道,通過(guò)支持渠道優(yōu)惠活動(dòng)等措施,來(lái)降低支付成本。

(3)支持進(jìn)入新市場(chǎng)

配合公司的市場(chǎng)拓展需求,為新市場(chǎng)提供支付支持。

2. 原則

為了和目標(biāo)保持一致,我們制定了一些微服務(wù)的架構(gòu)規(guī)則。當(dāng)然,這些規(guī)則也是隨著團(tuán)隊(duì)的進(jìn)步、業(yè)務(wù)的變更做調(diào)整。 我們的原則是參考Heroku的12 Factor而制定的。

以下原則是在剛啟動(dòng)微服務(wù)架構(gòu)改進(jìn)的時(shí)候制定的。

(1)虛機(jī)開(kāi)發(fā)

所有開(kāi)發(fā)工作必須在虛機(jī)上進(jìn)行,不得使用個(gè)人物理機(jī)開(kāi)發(fā)。這使得開(kāi)發(fā)人員能夠隨時(shí)在任何地方調(diào)起開(kāi)發(fā)環(huán)境,避免由于環(huán)境配置問(wèn)題而影響問(wèn)題修復(fù)。

(2)版本控制

使用Git做版本控制。 每個(gè)項(xiàng)目都有一個(gè)基準(zhǔn)代碼庫(kù),部署時(shí)從主干獲取代碼。上線時(shí)對(duì)主干打Tag,每個(gè)Tag對(duì)應(yīng)一個(gè)線上可執(zhí)行代碼。 測(cè)試環(huán)境、預(yù)部署環(huán)境和線上環(huán)境都使用相同的基準(zhǔn)代碼。

(3)代碼審核

為了保證代碼質(zhì)量,所有代碼必須通過(guò)至少兩位工程師的審核才可以簽入到主干版本中。執(zhí)行日常代碼審核,避免在部署前進(jìn)行突擊式審核。

(4)自動(dòng)部署

開(kāi)發(fā)人員不得直接將開(kāi)發(fā)機(jī)上的構(gòu)件推送到測(cè)試、線上環(huán)境。 build, release和run必須分離。 自動(dòng)部署系統(tǒng)(Jenkins)將從版本控制服務(wù)器上下載代碼,編譯并發(fā)布到各個(gè)stage server上。

(5)橫向擴(kuò)展

所有系統(tǒng)必須可以通過(guò)多進(jìn)程部署的方式進(jìn)行擴(kuò)展。 這就要求:

  • 所有系統(tǒng)可以運(yùn)行在一個(gè)或多個(gè)進(jìn)程中。 但所有進(jìn)程必須是無(wú)狀態(tài)的,進(jìn)程之間是無(wú)共享的。 對(duì)于Web來(lái)說(shuō),特別注意避免依賴session。如有需要,session需保存在membcached或者redis等內(nèi)存緩存中。
  • 所有進(jìn)程運(yùn)行時(shí)動(dòng)態(tài)綁定到端口來(lái)提供服務(wù)。
  • 避免使用守護(hù)進(jìn)程或者PID文件。

(6)同構(gòu)環(huán)境

確保開(kāi)發(fā)、測(cè)試和線上環(huán)境的同構(gòu)。這包括如下內(nèi)容:

  • 各stage下所使用的操作系統(tǒng)環(huán)境是一致的。
  • 各stage下所使用的容器是一致的,包括JVM版本、容器版本;
  • 各stage下所使用的數(shù)據(jù)庫(kù)及其版本是一致的。
  • 測(cè)試和線上環(huán)境可以在部署實(shí)例數(shù)量上不同,但在測(cè)試環(huán)境中,對(duì)于每個(gè)系統(tǒng),至少部署2個(gè)實(shí)例。
  • 各個(gè)stage下的唯一差異是通過(guò)配置參數(shù)來(lái)控制的。

隨著基礎(chǔ)設(shè)施的完善,我們補(bǔ)充了如下原則:

(7)配置參數(shù)

與環(huán)境相關(guān)的配置信息,必須與代碼嚴(yán)格分離,包括數(shù)據(jù)庫(kù)、第三方證書(shū)、域名、和性能有關(guān)的配置(線程數(shù)、重試間隔等)。配置信息統(tǒng)一使用環(huán)境變量來(lái)存儲(chǔ)。

(8)冪等原則

所有的接口必須實(shí)現(xiàn)為冪等的,這包括:

  • 該接口在同一個(gè)server上可以多次調(diào)用;
  • 如果某一個(gè)server上調(diào)用出現(xiàn)網(wǎng)絡(luò)問(wèn)題,客戶端可以進(jìn)行重試并將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)server上執(zhí)行。

(9)啟動(dòng)關(guān)閉

每個(gè)系統(tǒng)需提供啟動(dòng)、關(guān)閉和驗(yàn)證腳本。

  • 系統(tǒng)在啟動(dòng)時(shí)執(zhí)行必要的環(huán)境檢查,包括不得使用root賬戶來(lái)啟動(dòng)應(yīng)用、端口是否被占用等。
  • 啟動(dòng)成功后,可以通過(guò)驗(yàn)證腳本來(lái)確認(rèn)運(yùn)行狀態(tài)。
  • 關(guān)閉腳本必須能夠優(yōu)雅終止進(jìn)程,這包括回退所有的連接、停止接收消息,完成所有待處理的消息,必要時(shí)執(zhí)行回滾等操作。

(10)收集日志

所有日志信息都必須通過(guò)終端收集到日志服務(wù)器上。

(11)監(jiān)控報(bào)警

所有線上運(yùn)行的系統(tǒng),必須配置監(jiān)控和報(bào)警,并落實(shí)報(bào)警處理人員。

3. 制定規(guī)范

在原有的Java編碼規(guī)范的基礎(chǔ)上,針對(duì)本次技改,我們又制定如下規(guī)范:

  • 支付系統(tǒng)監(jiān)控報(bào)警規(guī)范。在支付系統(tǒng)的監(jiān)控與報(bào)警 一文中有介紹。
  • 支付系統(tǒng)Restful 接口設(shè)計(jì)規(guī)范。
  • 支付系統(tǒng)RPC接口設(shè)計(jì)規(guī)范。 在微服務(wù)與RPC一文中有介紹。

這些規(guī)范在執(zhí)行過(guò)程中也會(huì)不斷地進(jìn)行補(bǔ)充和調(diào)整。除了在code review中確保這些規(guī)范被落地執(zhí)行外,每周周會(huì)也會(huì)對(duì)異常執(zhí)行情況進(jìn)行分析,確保規(guī)范制定是符合實(shí)際需求的,并能夠與時(shí)俱進(jìn)地進(jìn)行調(diào)整。 當(dāng)然,最重要的規(guī)范,是軟件過(guò)程的規(guī)范:支付系統(tǒng)開(kāi)發(fā)的軟件過(guò)程規(guī)范。在微服務(wù)開(kāi)發(fā)的軟件過(guò)程一文中有詳細(xì)介紹。

4. 團(tuán)隊(duì)建設(shè)

微服務(wù)架構(gòu)是否能夠順利實(shí)施,離不開(kāi)團(tuán)隊(duì)成員的支持,以及團(tuán)隊(duì)能力的提升。團(tuán)隊(duì)建設(shè)一直是整個(gè)技改過(guò)程的重中之重。 團(tuán)隊(duì)建設(shè)本身是一個(gè)大話題。這里重點(diǎn)介紹我們?cè)趫F(tuán)隊(duì)分工上的工作。

團(tuán)隊(duì)的分工和整個(gè)架構(gòu)設(shè)計(jì)需保持一致(又是康威定律)。在架構(gòu)設(shè)計(jì)上,我們采取的整體策略,是參考原有的SSH架構(gòu),將業(yè)務(wù)邏輯和接口實(shí)現(xiàn)分離,將進(jìn)程內(nèi)調(diào)用改造成進(jìn)程外調(diào)用,并在此基礎(chǔ)上做切分。 這樣,在團(tuán)隊(duì)劃分上,前期,是按照層來(lái)分工,分為如下三個(gè)小團(tuán)隊(duì):

  • 接口服務(wù)團(tuán)隊(duì),開(kāi)發(fā)對(duì)外的接口,對(duì)接業(yè)務(wù)系統(tǒng)以及Android,IOS,PCWeb等各端。隨著業(yè)務(wù)的發(fā)展在,這個(gè)團(tuán)隊(duì)也會(huì)逐步按照端來(lái)進(jìn)一步分解。
  • 基礎(chǔ)服務(wù)團(tuán)隊(duì),為對(duì)外接口提供業(yè)務(wù)邏輯服務(wù)。這也是***的一個(gè)團(tuán)隊(duì),隨著業(yè)務(wù)的發(fā)展,這個(gè)團(tuán)隊(duì)也會(huì)逐步按照業(yè)務(wù)進(jìn)行拆分,分裂成賬戶、支付、交易等小團(tuán)隊(duì)。
  • 基礎(chǔ)設(shè)施團(tuán)隊(duì),負(fù)責(zé)支持上述工作的各種規(guī)范的制定,以及支持這些規(guī)范實(shí)現(xiàn)的基礎(chǔ)設(shè)施。

【本文為51CTO專欄作者“鳳凰牌老熊”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)“鳳凰牌老熊”聯(lián)系作者本人】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2011-03-25 10:25:19

2010-05-19 13:45:41

IIS組件

2018-01-25 16:23:58

JavaScript寫(xiě)庫(kù)初始化

2011-06-30 15:45:55

SEO

2022-01-06 10:48:16

硬盤(pán)操作系統(tǒng)數(shù)據(jù)

2009-09-01 10:59:22

C#項(xiàng)目

2011-03-22 10:10:16

CentOSNagios安裝

2011-08-01 14:08:17

admt活動(dòng)目錄遷移

2013-02-27 10:35:03

RHEV 3.1

2013-05-16 15:04:55

系統(tǒng)升級(jí)

2009-07-23 12:22:41

ASP.NET MVC

2009-03-01 22:27:21

2017-09-20 16:07:31

Facebook

2011-09-01 10:20:56

2010-02-26 15:46:31

MID Linux

2016-01-15 10:28:43

PaaS運(yùn)維運(yùn)維服務(wù)

2010-11-01 16:19:59

大型UPS電源準(zhǔn)備工作

2023-04-27 08:04:19

2011-03-30 11:31:10

MRTG

2012-12-28 10:24:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)