成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

傳統(tǒng)企業(yè)請(qǐng)注意:不夠痛就別微服務(wù),有坑

開(kāi)發(fā) 架構(gòu) 開(kāi)發(fā)工具
在多家傳統(tǒng)行業(yè)的企業(yè)走訪(fǎng)和落地了微服務(wù)之后,我發(fā)現(xiàn)落地微服務(wù)是一個(gè)非常復(fù)雜的問(wèn)題,甚至都不完全是技術(shù)問(wèn)題,它牽扯到 IT 架構(gòu),應(yīng)用架構(gòu),組織架構(gòu)多個(gè)方面。

 在多家傳統(tǒng)行業(yè)的企業(yè)走訪(fǎng)和落地了微服務(wù)之后,我發(fā)現(xiàn)落地微服務(wù)是一個(gè)非常復(fù)雜的問(wèn)題,甚至都不完全是技術(shù)問(wèn)題,它牽扯到 IT 架構(gòu),應(yīng)用架構(gòu),組織架構(gòu)多個(gè)方面。

當(dāng)時(shí)我想微服務(wù)既然是改造應(yīng)用,做微服務(wù)治理,類(lèi)似注冊(cè),發(fā)現(xiàn),熔斷,限流,降級(jí)等,當(dāng)然應(yīng)該從應(yīng)用開(kāi)發(fā)組切入。

 

一般一開(kāi)始聊的會(huì)比較開(kāi)心,從單體架構(gòu),到 SOA,再到微服務(wù)架構(gòu),從 Dubbo 聊到 Spring Cloud,但是必然會(huì)涉及到微服務(wù)的發(fā)布和運(yùn)維問(wèn)題,涉及到 DevOps 和容器層。

這些都不在開(kāi)發(fā)組的控制范圍內(nèi),一旦拉進(jìn)運(yùn)維組,對(duì)于容器的接受程度就成了一個(gè)問(wèn)題,和傳統(tǒng)物理機(jī),虛擬機(jī)的差別,會(huì)帶來(lái)什么風(fēng)險(xiǎn)等等。

尤其是容器絕對(duì)不是輕量級(jí)的虛擬化這件事情,就不是一時(shí)半會(huì)兒能說(shuō)的明白的。

更何況就算說(shuō)明白了,還有線(xiàn)上應(yīng)用容器,一旦出了事情,誰(shuí)背鍋的問(wèn)題,容器往往會(huì)導(dǎo)致應(yīng)用層和基礎(chǔ)設(shè)施層界限模糊,這使得背鍋雙方都會(huì)猶豫不決。

有的企業(yè)的微服務(wù)化是運(yùn)維部門(mén)發(fā)起的,運(yùn)維部門(mén)已經(jīng)意識(shí)到了各種各樣不統(tǒng)一的應(yīng)用給運(yùn)維帶來(lái)的苦,也樂(lè)意接受容器的運(yùn)維模式。

這就涉及到容器直接的服務(wù)發(fā)現(xiàn)是否應(yīng)該運(yùn)維在容器層搞定,還是應(yīng)用應(yīng)該自己搞定的問(wèn)題,還涉及 Dockerfile 到底是開(kāi)發(fā)寫(xiě)還是運(yùn)維寫(xiě)的問(wèn)題。

一旦容器化的過(guò)程中,開(kāi)發(fā)不配合,運(yùn)維單方面去做這個(gè)事情,是徒增煩惱卻收益有限的。

下圖是微服務(wù)實(shí)施的過(guò)程中涉及到的層次,具體的描述參考《云架構(gòu)師進(jìn)階攻略》:

 

在一些相對(duì)先進(jìn)的企業(yè),會(huì)在運(yùn)維組和開(kāi)發(fā)組之間,有個(gè)中間件組,或者叫做架構(gòu)組來(lái)負(fù)責(zé)推動(dòng)微服務(wù)化改造的事情。

架構(gòu)組既需要負(fù)責(zé)勸說(shuō)業(yè)務(wù)開(kāi)發(fā)實(shí)施微服務(wù)化,也要?jiǎng)裾f(shuō)運(yùn)維組實(shí)施容器化,如果架構(gòu)組的權(quán)威性不足,推動(dòng)往往也會(huì)比較困難。

所以微服務(wù),容器,DevOps 的推動(dòng),不單單是一個(gè)技術(shù)問(wèn)題,更是一個(gè)組織問(wèn)題。

在推動(dòng)微服務(wù)的過(guò)程中,更加能夠感覺(jué)到康威定律的作用,需要更高層次技術(shù)總監(jiān)或者 CIO 的介入,方能夠推動(dòng)微服務(wù)的落地。

然而到了 CIO 層,在很多企業(yè)又體會(huì)不到技術(shù)層面的痛點(diǎn)了,而更加關(guān)注業(yè)務(wù)的層面了。

只要業(yè)務(wù)能賺錢(qián),架構(gòu)的痛,中間件的痛,運(yùn)維的痛,高層不是非常能夠感知,也就體會(huì)不到微服務(wù),容器化的技術(shù)優(yōu)勢(shì)了。

而微服務(wù)和容器化對(duì)于業(yè)務(wù)的優(yōu)勢(shì),很多廠(chǎng)家在說(shuō),能夠說(shuō)到表面,說(shuō)不到心里。

因而微服務(wù)和容器化的改造,更加容易發(fā)生在一個(gè)扁平化的組織里面,由一個(gè)能夠體會(huì)到基層技術(shù)細(xì)節(jié)的痛的 CIO,高瞻遠(yuǎn)矚的推動(dòng)這件事情。

這也是為什么微服務(wù)的落地一般率先落地在互聯(lián)網(wǎng)公司,因?yàn)榛ヂ?lián)網(wǎng)公司的組織架構(gòu)實(shí)在太平臺(tái),哪怕是高層,也離一線(xiàn)非常的近,了解一線(xiàn)的痛。

然而在傳統(tǒng)行業(yè)就沒(méi)有那么幸運(yùn)了,層級(jí)往往會(huì)比較多,這個(gè)時(shí)候就需要技術(shù)上的痛足夠痛,能夠痛到影響業(yè)務(wù),能夠痛到影響收入,能夠痛到被競(jìng)爭(zhēng)對(duì)手甩在后面,才能上達(dá)天聽(tīng)。

我們接下來(lái)就梳理一下,在這個(gè)過(guò)程中的那些痛。

階段一:?jiǎn)误w架構(gòu)群,多個(gè)開(kāi)發(fā)組,統(tǒng)一運(yùn)維組

 

階段一的組織狀態(tài)

階段一的組織狀態(tài)相對(duì)簡(jiǎn)單,統(tǒng)一的運(yùn)維組,管理物理機(jī),物理網(wǎng)絡(luò),Vmware 虛擬化等資源,同時(shí)部署上線(xiàn)由運(yùn)維部負(fù)責(zé)。

開(kāi)發(fā)組每個(gè)業(yè)務(wù)都是獨(dú)立的,負(fù)責(zé)寫(xiě)代碼,不同的業(yè)務(wù)溝通不多,開(kāi)發(fā)除了做自己的系統(tǒng)外,還需要維護(hù)外包公司開(kāi)發(fā)的系統(tǒng),由于不同的外包公司技術(shù)選型差異較大,因而處于煙囪式的架構(gòu)狀態(tài)。

傳統(tǒng)煙囪式架構(gòu)如下圖所示:

 

階段一的運(yùn)維模式

在傳統(tǒng)架構(gòu)下,基礎(chǔ)設(shè)施層往往采取物理機(jī)或者虛擬化進(jìn)行部署,為了不同的應(yīng)用之間方便相互訪(fǎng)問(wèn),多采取橋接扁平二層機(jī)房網(wǎng)絡(luò),即所有的機(jī)器的 IP 地址都是可以相互訪(fǎng)問(wèn)的,不想互相訪(fǎng)問(wèn)的,多采用防火墻進(jìn)行隔離。

無(wú)論是使用物理機(jī),還是虛擬化,配置是相對(duì)復(fù)雜的,不是做過(guò)多年運(yùn)維的人員,難以獨(dú)立的創(chuàng)建一臺(tái)機(jī)器,而且網(wǎng)絡(luò)規(guī)劃也需要非常小心,分配給不同業(yè)務(wù)部門(mén)的機(jī)器,網(wǎng)段不能沖突。

所有這一切,都需要運(yùn)維部門(mén)統(tǒng)一進(jìn)行管理,一般的 IT 人員或者開(kāi)發(fā)人員既沒(méi)有專(zhuān)業(yè)性,也不可能給他們權(quán)限進(jìn)行操作,要申請(qǐng)機(jī)器怎么辦,走個(gè)工單,審批一下,過(guò)一段時(shí)間,機(jī)器就能創(chuàng)建出來(lái)。

階段一的應(yīng)用架構(gòu)

傳統(tǒng)架構(gòu)數(shù)據(jù)庫(kù)層,由于外包公司獨(dú)立開(kāi)發(fā),或者不同開(kāi)發(fā)部門(mén)獨(dú)立開(kāi)發(fā),不同業(yè)務(wù)使用不同的數(shù)據(jù)庫(kù),有用 Oracle 的,有用 SQL Server 的,有用 MySQL 的,有用 MongoDB 的,各不相同。

傳統(tǒng)架構(gòu)的中間件層,每個(gè)團(tuán)隊(duì)獨(dú)立選型中間件:

  • 文件:NFS,F(xiàn)TP,Ceph,S3。
  • 緩存:Redis Cluster,主備,Sentinel,Memcached。
  • 分布式框架:Spring Cloud,Dubbo,Restful or RPC 不同的部門(mén)自己選型。
  • 分庫(kù)分表:Sharding-jdbc,Mycat。
  • 消息隊(duì)列:RabbitMQ,Kafka。
  • 注冊(cè)中心:ZK,Euraka,Consul。

傳統(tǒng)架構(gòu)的服務(wù)層,系統(tǒng)或者由外包公司開(kāi)發(fā),或者由獨(dú)立團(tuán)隊(duì)開(kāi)發(fā)。傳統(tǒng)架構(gòu)前端,各自開(kāi)發(fā)各自的前端。

階段一有什么問(wèn)題?

階段一沒(méi)有任何問(wèn)題,我們甚至能找出一萬(wàn)個(gè)理由說(shuō)明這種模式的好處。運(yùn)維部和開(kāi)發(fā)部是天然分開(kāi)的,誰(shuí)也不想管對(duì)方,兩邊的老大也是平級(jí)的,本相安無(wú)事。

機(jī)房當(dāng)然只能運(yùn)維人員能碰,這里面有安全的問(wèn)題,專(zhuān)業(yè)性的問(wèn)題,線(xiàn)上系統(tǒng)嚴(yán)肅的問(wèn)題。

如果交給沒(méi)有那么專(zhuān)業(yè)的開(kāi)發(fā)去部署環(huán)境,一旦系統(tǒng)有漏洞,誰(shuí)能擔(dān)責(zé)任,一旦線(xiàn)上系統(tǒng)掛了,又是誰(shuí)的責(zé)任,這個(gè)問(wèn)題問(wèn)出來(lái),能夠讓任何爭(zhēng)論鴉雀無(wú)聲。

數(shù)據(jù)庫(kù)無(wú)論使用 Oracle,DB2,還是 SQL Server 都沒(méi)有問(wèn)題,只要公司有足夠的預(yù)算,而且性能也的確杠杠的,里面存儲(chǔ)了大量存儲(chǔ)過(guò)程,會(huì)使得應(yīng)用開(kāi)發(fā)簡(jiǎn)單很多。

而且有專(zhuān)業(yè)的乙方幫忙運(yùn)維,數(shù)據(jù)庫(kù)如此關(guān)鍵,如果替換為 MySQL,一旦抗不出掛了,或者開(kāi)源的沒(méi)人維護(hù),線(xiàn)上出了事情,誰(shuí)來(lái)負(fù)責(zé)?

中間件,服務(wù)層,前端,全部由外包商或者乙方搞定,端到端維護(hù),要改什么招手即來(lái),而且每個(gè)系統(tǒng)都是完整的一套,部署方便,運(yùn)維方便。

其實(shí)沒(méi)有任何問(wèn)題,這個(gè)時(shí)候上容器或者上微服務(wù),的確自找麻煩。

什么情況下才會(huì)覺(jué)得階段一有問(wèn)題?

當(dāng)然最初的痛點(diǎn)應(yīng)該在業(yè)務(wù)層面,當(dāng)用戶(hù)的需求開(kāi)始變的多種多樣,業(yè)務(wù)方時(shí)不時(shí)的就要上一個(gè)新功能。

做一個(gè)新系統(tǒng)的時(shí)候,你會(huì)發(fā)現(xiàn)外包公司不是能完全搞定所有的事情,他們是瀑布模型的開(kāi)發(fā),而且開(kāi)發(fā)出來(lái)的系統(tǒng)很難變更,至少很難快速變更。

于是你開(kāi)始想自己招聘一些開(kāi)發(fā),開(kāi)發(fā)自己能夠把控的系統(tǒng),至少能夠?qū)⑼獍鹃_(kāi)發(fā)的系統(tǒng)接管過(guò)來(lái),這個(gè)時(shí)候,應(yīng)對(duì)業(yè)務(wù)部門(mén)的需求,就會(huì)靈活的多。

但是自己開(kāi)發(fā)和維護(hù)就帶來(lái)了新的問(wèn)題,多種多樣的數(shù)據(jù)庫(kù),根本不可能招聘到如此多樣的 DBA,人都非常的貴,而且隨著系統(tǒng)的增多,這些數(shù)據(jù)庫(kù)的 Lisense 也非常的貴。

多種多樣的中間件,每個(gè)團(tuán)隊(duì)獨(dú)立選型中間件,沒(méi)有統(tǒng)一的維護(hù),沒(méi)有統(tǒng)一的知識(shí)積累,無(wú)法統(tǒng)一保障 SLA。

一旦使用的消息隊(duì)列,緩存,框架出了問(wèn)題,整個(gè)團(tuán)隊(duì)沒(méi)有人能夠搞定這個(gè)事情,因?yàn)榇蠹叶济τ跇I(yè)務(wù)開(kāi)發(fā),沒(méi)人有時(shí)間深入的去研究這些中間件的背后原理,常見(jiàn)的問(wèn)題,如何調(diào)優(yōu)等等。

前端框架也有相同的問(wèn)題,技術(shù)棧不一致,界面風(fēng)格不一致,根本無(wú)法自動(dòng)做 UI 測(cè)試。

當(dāng)維護(hù)了多套系統(tǒng)之后,你會(huì)發(fā)現(xiàn),這些系統(tǒng)各個(gè)層次都有很多的共同點(diǎn),很多能力是可以復(fù)用的,很多數(shù)據(jù)是可以打通的。

同樣一套邏輯,這里也有,那里也有,同樣類(lèi)型的數(shù)據(jù),這里一份,那里一份,但是信息是隔離的,數(shù)據(jù)模型不統(tǒng)一,根本無(wú)法打通。

當(dāng)出現(xiàn)這些問(wèn)題的時(shí)候,才是您考慮進(jìn)入第二個(gè)階段的時(shí)候。

階段二:組織服務(wù)化,架構(gòu) SOA 化,基礎(chǔ)設(shè)施云化

 

階段二的組織形態(tài)

怎么解決上面的問(wèn)題呢?根據(jù)康威定理,組織方面就需要有一定的調(diào)整,整個(gè)公司還是分運(yùn)維組和開(kāi)發(fā)組。由于痛點(diǎn)是從業(yè)務(wù)層面發(fā)生的,開(kāi)始調(diào)整的應(yīng)該是開(kāi)發(fā)組。

應(yīng)該建立獨(dú)立的前端組,統(tǒng)一前端框架,界面一致,所有人掌握統(tǒng)一的前端開(kāi)發(fā)能力,積累前端代碼,在有新的需求的時(shí)候,能夠快速的進(jìn)行開(kāi)發(fā)。

建立中間件組,或者架構(gòu)師組,這部分人不用貼近業(yè)務(wù)開(kāi)發(fā),每天的任務(wù)就是研究如何使用這些中間件,如何調(diào)優(yōu),遇到問(wèn)題如何 Debug,形成知識(shí)積累。

如果有統(tǒng)一的一幫人專(zhuān)注中間件,就可以根據(jù)自身的情況,選擇有限幾個(gè)中間件集中研究,限定業(yè)務(wù)組只使用這些中間件,可保證選型的一致性,如果中間件被這個(gè)組統(tǒng)一維護(hù),也可以提供可靠的 SLA 給業(yè)務(wù)方。

將業(yè)務(wù)開(kāi)發(fā)組分出一部分來(lái),建立中臺(tái)組,將可以復(fù)用的能力和代碼,交由這幾個(gè)組開(kāi)發(fā)出服務(wù)來(lái),給業(yè)務(wù)組使用。

這樣數(shù)據(jù)模型會(huì)統(tǒng)一,業(yè)務(wù)開(kāi)發(fā)的時(shí)候,首先先看看有哪些現(xiàn)成的服務(wù)可以使用,不用全部從零開(kāi)發(fā),也會(huì)提高開(kāi)發(fā)效率。

階段二的應(yīng)用架構(gòu)

要建立中臺(tái),變成服務(wù)為其他業(yè)務(wù)使用,就需要使用 SOA 架構(gòu),將可以復(fù)用的組件服務(wù)化,注冊(cè)到服務(wù)的注冊(cè)中心。

對(duì)于有錢(qián)的企業(yè),可能會(huì)采購(gòu)商用的 ESB 總線(xiàn),也有使用 Dubbo 自己封裝稱(chēng)為服務(wù)注冊(cè)中心。

接下來(lái)就是要考慮,哪些應(yīng)該拆出來(lái)? ***考慮的是如何拆出來(lái)?

這兩個(gè)題目的答案,不同的企業(yè)不同,其實(shí)分為兩個(gè)階段,***個(gè)階段是嘗試階段,也即整個(gè)公司對(duì)于服務(wù)化拆分沒(méi)有任何經(jīng)驗(yàn),當(dāng)然不敢拿核心業(yè)務(wù)上手,往往選取一個(gè)邊角的業(yè)務(wù),先拆拆看。

這個(gè)時(shí)候拆本身是重要的,其實(shí)是為了拆而拆,拆的比較理想化,符合領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的***,如何拆呢?

當(dāng)然是弄一個(gè)兩個(gè)月,核心員工大家閉門(mén)開(kāi)發(fā),進(jìn)行拆分和組合,來(lái)積累經(jīng)驗(yàn)。很多企業(yè)目前處于這個(gè)階段。

但是其實(shí)這個(gè)階段的拆法也只能用來(lái)積累經(jīng)驗(yàn),因?yàn)樵蹅冏畛跻鸱郑菫榱丝焖夙憫?yīng)業(yè)務(wù)請(qǐng)求,而這個(gè)邊角的模塊,往往不是最痛的核心業(yè)務(wù)。

本來(lái)業(yè)務(wù)就邊角,拆不拆收益不大,而且也沒(méi)辦法很好的做能力復(fù)用。復(fù)用當(dāng)然都想復(fù)用核心能力。

所以其實(shí)最重要的是第二個(gè)階段,業(yè)務(wù)真正的服務(wù)化的階段。當(dāng)然要拿業(yè)務(wù)需求最多的核心業(yè)務(wù)邏輯下手,才能起到快速響應(yīng)業(yè)務(wù)請(qǐng)求,復(fù)用能力的作用。

例如考拉最初也是一個(gè)使用 Oracle,對(duì)外只有一個(gè) Online 業(yè)務(wù)的單體應(yīng)用,而真正的拆分,就是圍繞核心的下單業(yè)務(wù)邏輯進(jìn)行的。

 

那核心業(yè)務(wù)邏輯中,哪些應(yīng)該拆出來(lái)呢?很多企業(yè)會(huì)問(wèn)我們,其實(shí)企業(yè)自己的開(kāi)發(fā)最清楚。

這個(gè)時(shí)候經(jīng)常犯的錯(cuò)誤是,先將核心業(yè)務(wù)邏輯從單體應(yīng)用中拆分出來(lái)。例如將下單邏輯形成下單服務(wù),從 Online 服務(wù)中拆分出來(lái)。

當(dāng)然不應(yīng)該這樣,例如兩軍打仗,當(dāng)炊事班的煙熏著戰(zhàn)士了,是將中軍大營(yíng)搬出去,還是講炊事班搬出去呢?當(dāng)然是炊事班了。

另外一點(diǎn)是,能夠形成復(fù)用的組件,往往不是核心業(yè)務(wù)邏輯。這個(gè)很好理解,兩個(gè)不同的業(yè)務(wù),當(dāng)然是核心業(yè)務(wù)邏輯不同(要不就成一種業(yè)務(wù)了)。

核心業(yè)務(wù)邏輯往往是組合邏輯,雖然復(fù)雜,但是往往不具備復(fù)用性,就算是下單,不同的電商也是不一樣的。

這家推出了什么什么豆,那家推出了什么什么券,另一家有個(gè)什么什么活動(dòng),都是核心業(yè)務(wù)邏輯的不同,會(huì)經(jīng)常變。

能夠復(fù)用的,往往是用戶(hù)中心,支付中心,倉(cāng)儲(chǔ)中心,庫(kù)存中心等等核心業(yè)務(wù)的周邊邏輯。

所以拆分,應(yīng)該將這些核心業(yè)務(wù)的周邊邏輯,從核心業(yè)務(wù)里面拆出來(lái),最終 Online 就剩下下單的核心路徑了,就可以改成下單服務(wù)了。

當(dāng)業(yè)務(wù)方突然有了需求推出一個(gè)搶購(gòu)活動(dòng),就可以復(fù)用剛才的周邊邏輯了。搶購(gòu)就成了另一個(gè)應(yīng)用的核心邏輯,其實(shí)核心邏輯是穿針引線(xiàn)的,周邊邏輯是保存數(shù)據(jù),提供原子化接口的。

那哪些周邊邏輯應(yīng)該先拆出來(lái)呢?問(wèn)自己的開(kāi)發(fā)吧,那些戰(zhàn)戰(zhàn)兢兢,自己修改后生怕把核心邏輯搞掛了的組,是自己有動(dòng)力從核心邏輯中拆分出來(lái)的。

這個(gè)不需要技術(shù)總監(jiān)和架構(gòu)師去督促,他們有自己的原有動(dòng)力,是一個(gè)很自然的過(guò)程。

 

這里的原有動(dòng)力,一個(gè)是開(kāi)發(fā)獨(dú)立,一個(gè)是上線(xiàn)獨(dú)立,就像考拉的 Online 系統(tǒng)里面,倉(cāng)庫(kù)組就想自己獨(dú)立出去。

因?yàn)樗麄円獙?duì)接各種各樣的倉(cāng)儲(chǔ)系統(tǒng),全球這么多的倉(cāng)庫(kù),系統(tǒng)都很傳統(tǒng),接口不一樣,每新對(duì)接一個(gè),開(kāi)發(fā)的時(shí)候,都擔(dān)心把下單核心邏輯搞掛了,造成線(xiàn)上事故。

其實(shí)倉(cāng)儲(chǔ)系統(tǒng)可以定義自己的重試和容災(zāi)機(jī)制,沒(méi)有下單那么嚴(yán)重。物流組也想獨(dú)立出去,因?yàn)閷?duì)接的物流公司太多了,也要經(jīng)常上線(xiàn),也不想把下單搞掛。

您也可以梳理一下貴公司的業(yè)務(wù)邏輯,也會(huì)有自行愿意拆分的業(yè)務(wù),形成中臺(tái)服務(wù)。

當(dāng)周邊的邏輯拆分之后,一些核心的邏輯,互相怕影響,也可以拆分出去,例如下單和支付,支付對(duì)接多個(gè)支付方的時(shí)候,也不想影響下單,也可以獨(dú)立出去。

然后我們?cè)倏矗绾尾鸱值膯?wèn)題?

關(guān)于拆分的前提,時(shí)機(jī),方法,規(guī)范等,參考文章《微服務(wù)化之服務(wù)拆分與服務(wù)發(fā)現(xiàn)》

 

首先要做的,就是原有工程代碼的標(biāo)準(zhǔn)化,我們常稱(chēng)為“任何人接手任何一個(gè)模塊都能看到熟悉的面孔”。

例如打開(kāi)一個(gè) Java 工程,應(yīng)該有以下的 Package:

  • API 接口包:所有的接口定義都在這里,對(duì)于內(nèi)部的調(diào)用,也要實(shí)現(xiàn)接口,這樣一旦要拆分出去,對(duì)于本地的接口調(diào)用,就可以變?yōu)檫h(yuǎn)程的接口調(diào)用。
  • 訪(fǎng)問(wèn)外部服務(wù)包:如果這個(gè)進(jìn)程要訪(fǎng)問(wèn)其他進(jìn)程,對(duì)于外部訪(fǎng)問(wèn)的封裝都在這里。
  • 對(duì)于單元測(cè)試來(lái)講,對(duì)于這部分的 Mock,可以使得不用依賴(lài)第三方,就能進(jìn)行功能測(cè)試。對(duì)于服務(wù)拆分,調(diào)用其他的服務(wù),也是在這里。
  • 數(shù)據(jù)庫(kù) DTO:如果要訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),在這里定義原子的數(shù)據(jù)結(jié)構(gòu)。
  • 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)包:訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的邏輯全部在這個(gè)包里面。
  • 服務(wù)與商務(wù)邏輯:這里實(shí)現(xiàn)主要的商業(yè)邏輯,拆分也是從這里拆分出來(lái)。
  • 外部服務(wù):對(duì)外提供服務(wù)的邏輯在這里,對(duì)于接口的提供方,要實(shí)現(xiàn)在這里。

另外是測(cè)試文件夾,每個(gè)類(lèi)都應(yīng)該有單元測(cè)試,要審核單元測(cè)試覆蓋率,模塊內(nèi)部應(yīng)該通過(guò) Mock 的方法實(shí)現(xiàn)集成測(cè)試。

接下來(lái)是配置文件夾,配置 profile,配置分為幾類(lèi):

  • 內(nèi)部配置項(xiàng)(啟動(dòng)后不變,改變需要重啟)。
  • 集中配置項(xiàng)(配置中心,可動(dòng)態(tài)下發(fā))。
  • 外部配置項(xiàng)(外部依賴(lài),和環(huán)境相關(guān))。

當(dāng)一個(gè)工程的結(jié)構(gòu)非常標(biāo)準(zhǔn)化之后,接下來(lái)在原有服務(wù)中,先獨(dú)立功能模塊 ,規(guī)范輸入輸出,形成服務(wù)內(nèi)部的分離。

在分離出新的進(jìn)程之前,先分離出新的 Jar,只要能夠分離出新的 Jar,基本也就實(shí)現(xiàn)了松耦合。

接下來(lái),應(yīng)該新建工程,新啟動(dòng)一個(gè)進(jìn)程,盡早的注冊(cè)到注冊(cè)中心,開(kāi)始提供服務(wù),這個(gè)時(shí)候,新的工程中的代碼邏輯可以先沒(méi)有,只是轉(zhuǎn)調(diào)用原來(lái)的進(jìn)程接口。

為什么要越早獨(dú)立越好呢?哪怕還沒(méi)實(shí)現(xiàn)邏輯先獨(dú)立呢?因?yàn)榉?wù)拆分的過(guò)程是漸進(jìn)的,伴隨著新功能的開(kāi)發(fā),新需求的引入,這個(gè)時(shí)候,對(duì)于原來(lái)的接口,也會(huì)有新的需求進(jìn)行修改。

如果你想把業(yè)務(wù)邏輯獨(dú)立出來(lái),獨(dú)立了一半,新需求來(lái)了,改舊的,改新的都不合適,新的還沒(méi)獨(dú)立提供服務(wù),舊的如果改了,會(huì)造成從舊工程遷移到新工程,邊遷移邊改變,合并更加困難。

如果盡早獨(dú)立,所有的新需求都進(jìn)入新的工程,所有調(diào)用方更新的時(shí)候,都改為調(diào)用新的進(jìn)程,對(duì)于老進(jìn)程的調(diào)用會(huì)越來(lái)越少,最終新進(jìn)程將老進(jìn)程全部代理。

接下來(lái)就可以將老工程中的邏輯逐漸遷移到新工程,由于代碼遷移不能保證邏輯的完全正確,因而需要持續(xù)集成,灰度發(fā)布,微服務(wù)框架能夠在新老接口之間切換。

最終當(dāng)新工程穩(wěn)定運(yùn)行,并且在調(diào)用監(jiān)控中,已經(jīng)沒(méi)有對(duì)于老工程的調(diào)用的時(shí)候,就可以將老工程下線(xiàn)了。

階段二的運(yùn)維模式

經(jīng)過(guò)業(yè)務(wù)層的的服務(wù)化,也對(duì)運(yùn)維組造成了壓力。應(yīng)用逐漸拆分,服務(wù)數(shù)量增多。

在服務(wù)拆分的***實(shí)踐中,有一條就是,拆分過(guò)程需要進(jìn)行持續(xù)集成,保證功能一致。

 

而持續(xù)集成的流程,往往需要頻繁的部署測(cè)試環(huán)境。隨著服務(wù)的拆分,不同的業(yè)務(wù)開(kāi)發(fā)組會(huì)接到不同的需求,并行開(kāi)發(fā)功能增多,發(fā)布頻繁,會(huì)造成測(cè)試環(huán)境,生產(chǎn)環(huán)境更加頻繁的部署。

而頻繁的部署,就需要頻繁創(chuàng)建和刪除虛擬機(jī)。如果還是采用上面審批的模式,運(yùn)維部就會(huì)成為瓶頸,要不就是影響開(kāi)發(fā)進(jìn)度,要不就是被各種部署累死。

這就需要進(jìn)行運(yùn)維模式的改變,也即基礎(chǔ)設(shè)施層云化。虛擬化到云化有什么不一樣呢?

首先要有良好的租戶(hù)管理,從運(yùn)維集中管理到租戶(hù)自助使用模式的轉(zhuǎn)換。

 

即人工創(chuàng)建,人工調(diào)度,人工配置的集中管理模式已經(jīng)成為瓶頸,應(yīng)該變?yōu)樽鈶?hù)自助的管理,機(jī)器自動(dòng)的調(diào)度,自動(dòng)的配置。

其次,要實(shí)現(xiàn)基于 Quota 和 QoS 的資源控制。

也即對(duì)于租戶(hù)創(chuàng)建的資源的控制,不用精細(xì)化到運(yùn)維手動(dòng)管理一切,只要給這個(gè)客戶(hù)分配了租戶(hù),分配了 Quota,設(shè)置了 Qos,租戶(hù)就可以在運(yùn)維限定的范圍內(nèi),自由隨意的創(chuàng)建,使用,刪除虛擬機(jī),無(wú)需通知運(yùn)維,這樣迭代速度就會(huì)加快。

再次,要實(shí)現(xiàn)基于虛擬網(wǎng)絡(luò),VPC,SDN 的網(wǎng)絡(luò)規(guī)劃。

 

原來(lái)的網(wǎng)絡(luò)使用的都是物理網(wǎng)絡(luò),問(wèn)題在于物理網(wǎng)絡(luò)是所有部門(mén)共享的,沒(méi)辦法交給一個(gè)業(yè)務(wù)部門(mén)自由的配置和使用。

因而要有 VPC 虛擬網(wǎng)絡(luò)的概念,每個(gè)租戶(hù)可以隨意配置自己的子網(wǎng),路由表,和外網(wǎng)的連接等,不同的租戶(hù)的網(wǎng)段可以沖突,互不影響,租戶(hù)可以根據(jù)自己的需要,隨意的在界面上,用軟件的方式做網(wǎng)絡(luò)規(guī)劃。

除了基礎(chǔ)設(shè)施云化之外,運(yùn)維部門(mén)還應(yīng)該將應(yīng)用的部署自動(dòng)化。

 

因?yàn)槿绻朴?jì)算不管應(yīng)用,一旦出現(xiàn)擴(kuò)容,或者自動(dòng)部署的需求,云平臺(tái)創(chuàng)建出來(lái)的虛擬機(jī)還是空的,需要運(yùn)維手動(dòng)上去部署,根本忙不過(guò)來(lái)。因而云平臺(tái),也一定要管理應(yīng)用。

云計(jì)算如何管理應(yīng)用呢?我們將應(yīng)用分成兩種,一種稱(chēng)為通用的應(yīng)用,一般指一些復(fù)雜性比較高,但大家都在用的,例如數(shù)據(jù)庫(kù)。

幾乎所有的應(yīng)用都會(huì)用數(shù)據(jù)庫(kù),但數(shù)據(jù)庫(kù)軟件是標(biāo)準(zhǔn)的,雖然安裝和維護(hù)比較復(fù)雜,但無(wú)論誰(shuí)安裝都是一樣。

這樣的應(yīng)用可以變成標(biāo)準(zhǔn)的 PaaS 層的應(yīng)用放在云平臺(tái)的界面上。當(dāng)用戶(hù)需要一個(gè)數(shù)據(jù)庫(kù)時(shí),一點(diǎn)就出來(lái)了,用戶(hù)就可以直接用了。

 

所以對(duì)于運(yùn)維模式的第二個(gè)改變是,通用軟件 PaaS 化。前面說(shuō)過(guò)了,在開(kāi)發(fā)部門(mén)有中間件組負(fù)責(zé)這些通用的應(yīng)用,運(yùn)維也自動(dòng)部署這些應(yīng)用,兩個(gè)組的界限是什么樣的呢?

一般的實(shí)踐方式是,云平臺(tái)的 PaaS 負(fù)責(zé)創(chuàng)建的中間件的穩(wěn)定,保證 SLA,當(dāng)出現(xiàn)問(wèn)題的時(shí)候,會(huì)自動(dòng)修復(fù)。

而開(kāi)發(fā)部門(mén)的中間件組,主要研究如何正確的使用這些 PaaS,配置什么樣的參數(shù),使用的正確姿勢(shì)等等,這個(gè)和業(yè)務(wù)相關(guān)。

 

除了通用的應(yīng)用,還有個(gè)性化的應(yīng)用,應(yīng)該通過(guò)腳本進(jìn)行部署,例如工具 Puppet,Chef,Ansible,SaltStack 等。

這里有一個(gè)實(shí)踐是,不建議使用裸機(jī)部署,因?yàn)檫@樣部署非常的慢,推薦基于虛擬機(jī)鏡像的自動(dòng)部署。

在云平臺(tái)上,任何虛擬機(jī)的創(chuàng)建都是基于鏡像的,我們可以在鏡像里面,將要部署的環(huán)境大部分部署好,只需要做少量的定制化,這些由部署工具完成。

 

下圖是 OpenStack 基于 Heat 的虛擬機(jī)編排,除了調(diào)用 OpenStack API 基于鏡像創(chuàng)建虛擬機(jī)之外,還要調(diào)用 SaltStack 的 Master,將定制化的指令下發(fā)給虛擬機(jī)里面的 Agent。

 

基于虛擬機(jī)鏡像和腳本下發(fā),可以構(gòu)建自動(dòng)化部署平臺(tái) NDP:

 

這樣可以基于虛擬機(jī)鏡像,做完整的應(yīng)用的部署和上線(xiàn),稱(chēng)為編排。基于編排,就可以進(jìn)行很好的持續(xù)集成,例如每天晚上,自動(dòng)部署一套環(huán)境,進(jìn)行回歸測(cè)試,從而保證修改的正確性。

 

進(jìn)行完第二階段之后,整個(gè)狀態(tài)如上圖所示。這里運(yùn)維部門(mén)的職能有了一定的改變,除了最基本的資源創(chuàng)建,還要提供自助的操作平臺(tái),PaaS 化的中間件,基于鏡像和腳本的自動(dòng)部署。

開(kāi)發(fā)部門(mén)的職能也有了一定的改變,拆分稱(chēng)為前端組,業(yè)務(wù)開(kāi)發(fā)組,中臺(tái)組,中間件組,其中中間件組和運(yùn)維部門(mén)的聯(lián)系最緊密。

階段二有什么問(wèn)題?

大部分的企業(yè),到了這個(gè)階段,已經(jīng)可以解決大部分的問(wèn)題了。能夠做到架構(gòu) SOA 化,基礎(chǔ)設(shè)施云化的公司已經(jīng)是傳統(tǒng)行業(yè)在信息化領(lǐng)域的佼佼者了。

中臺(tái)開(kāi)發(fā)組基本能夠解決中臺(tái)的能力復(fù)用問(wèn)題,持續(xù)集成也基本跑起來(lái)了,使得業(yè)務(wù)開(kāi)發(fā)組的迭代速度明顯加快。

集中的中間件組或者架構(gòu)組,可以集中選型,維護(hù),研究消息隊(duì)列,緩存等中間件。

在這個(gè)階段,由于業(yè)務(wù)的穩(wěn)定性要求,很多公司還是會(huì)采用 Oracle 商用數(shù)據(jù)庫(kù),也沒(méi)有什么問(wèn)題。

實(shí)現(xiàn)到了階段二,在同行業(yè)內(nèi),已經(jīng)有一定的競(jìng)爭(zhēng)優(yōu)勢(shì)了。

什么情況下才會(huì)覺(jué)得階段二有問(wèn)題?

我們發(fā)現(xiàn),當(dāng)傳統(tǒng)行業(yè)不再滿(mǎn)足于在本行業(yè)的領(lǐng)先地位,希望能夠?qū)拥交ヂ?lián)網(wǎng)業(yè)務(wù)的時(shí)候,上面的模式才出現(xiàn)新的痛點(diǎn)。

對(duì)接互聯(lián)網(wǎng)所面臨的***的問(wèn)題,就是巨大的用戶(hù)量所帶來(lái)的請(qǐng)求量和數(shù)據(jù)量,會(huì)是原來(lái)的 N 倍,能不能撐得住,大家都心里沒(méi)底。

例如有的客戶(hù)推出互聯(lián)網(wǎng)理財(cái)秒殺搶購(gòu),原來(lái)的架構(gòu)無(wú)法承載近百倍的瞬間流量。

有的客戶(hù)對(duì)接了互聯(lián)網(wǎng)支付,甚至對(duì)接了國(guó)內(nèi)***的外賣(mài)平臺(tái),而原來(lái)的 ESB 總線(xiàn),就算擴(kuò)容到***規(guī)模(13 個(gè)節(jié)點(diǎn)),也可能撐不住。

有的客戶(hù)雖然已經(jīng)用了 Dubbo 實(shí)現(xiàn)了服務(wù)化,但是沒(méi)有熔斷,限流,降級(jí)的服務(wù)治理策略,有可能一個(gè)請(qǐng)求慢,高峰期波及一大片,或者請(qǐng)求全部接進(jìn)來(lái),***都撐不住而掛一片。

有的客戶(hù)希望實(shí)現(xiàn)工業(yè)互連網(wǎng)平臺(tái),可是接入的數(shù)據(jù)量動(dòng)輒 PB 級(jí)別,如果扛不住是一個(gè)很大的問(wèn)題。

有的客戶(hù)起初使用開(kāi)源的緩存和消息隊(duì)列,分布式數(shù)據(jù)庫(kù),但是讀寫(xiě)頻率到了一定的程度,就會(huì)出現(xiàn)各種奇奇怪怪的問(wèn)題,不知道應(yīng)該如何調(diào)優(yōu)。

有的客戶(hù)發(fā)現(xiàn),一旦到了互聯(lián)網(wǎng)大促級(jí)別,Oracle 數(shù)據(jù)庫(kù)是肯定扛不住的,需要從 Oracle 遷移到 DDB 分布式數(shù)據(jù)庫(kù),可是怎么個(gè)遷移法,如何平滑過(guò)渡,心里沒(méi)底。

有的客戶(hù)服務(wù)拆分之后,原來(lái)原子化的操作分成了兩個(gè)服務(wù)調(diào)用,如何仍然保持原子化,要不全部成功,要不全部失敗,需要分布式事務(wù),雖然業(yè)內(nèi)有大量的分布式方案,但是能夠承載高并發(fā)支付的框架還沒(méi)有。

當(dāng)出現(xiàn)這些問(wèn)題的時(shí)候,才應(yīng)該考慮進(jìn)入第三個(gè)階段,微服務(wù)化。

階段三:組織 DevOps 化,架構(gòu)微服務(wù)化,基礎(chǔ)設(shè)施容器化

 

階段三的應(yīng)用架構(gòu)

從 SOA 到微服務(wù)化這一步非常關(guān)鍵,復(fù)雜度也比較高,上手需要謹(jǐn)慎。

為了能夠承載互聯(lián)網(wǎng)高并發(fā),業(yè)務(wù)往往需要拆分的粒度非常的細(xì),細(xì)到什么程度呢?我們來(lái)看下面的圖:

 

在這些知名的使用微服務(wù)的互聯(lián)網(wǎng)公司中,微服務(wù)之間的相互調(diào)用已經(jīng)密密麻麻相互關(guān)聯(lián)成為一個(gè)網(wǎng)狀,幾乎都看不出條理來(lái)。

為什么要拆分到這個(gè)粒度呢?主要是高并發(fā)的需求。但是高并發(fā)不是沒(méi)有成本的,拆分成這個(gè)粒度會(huì)有什么問(wèn)題呢?

你會(huì)發(fā)現(xiàn)等拆完了,下面的這些措施一個(gè)都不能少:

  • 拆分如何保證功能不變,不引入 Bug——持續(xù)集成。
  • 靜態(tài)資源要拆分出來(lái),緩存到接入層或者 CDN,將大部分流量攔截在離用戶(hù)近的邊緣節(jié)點(diǎn)或者接入層緩存。
  • 應(yīng)用的狀態(tài)要從業(yè)務(wù)邏輯中拆分出來(lái),使得業(yè)務(wù)無(wú)狀態(tài),可以基于容器進(jìn)行橫向擴(kuò)展。
  • 核心業(yè)務(wù)和非核心業(yè)務(wù)要拆分,方便核心業(yè)務(wù)的擴(kuò)展以及非核心業(yè)務(wù)的降級(jí)。
  • 數(shù)據(jù)庫(kù)要讀寫(xiě)分離,要分庫(kù)分表,才能在超大數(shù)據(jù)量的情況下,數(shù)據(jù)庫(kù)具有橫向擴(kuò)展的能力,不成為瓶頸。
  • 要層層緩存,只有少數(shù)的流量到達(dá)中軍大營(yíng)數(shù)據(jù)庫(kù)。
  • 要使用消息隊(duì)列,將原來(lái)連續(xù)調(diào)用的多個(gè)服務(wù)異步化為監(jiān)聽(tīng)消息隊(duì)列,從而縮短核心邏輯。
  • 服務(wù)之間要設(shè)定熔斷,限流,降級(jí)策略,一旦調(diào)用阻塞應(yīng)該快速失敗,而不應(yīng)該卡在那里,處于亞健康狀態(tài)的服務(wù)要被及時(shí)熔斷,不產(chǎn)生連鎖反應(yīng)。
  • 非核心業(yè)務(wù)要進(jìn)行降級(jí),不再調(diào)用,將資源留給核心業(yè)務(wù)。要在壓測(cè)到的容量范圍內(nèi)對(duì)調(diào)用限流,寧可慢慢處理,也不用一下子都放進(jìn)來(lái),把整個(gè)系統(tǒng)沖垮。
  • 拆分成的服務(wù)太多了,沒(méi)辦法一個(gè)個(gè)配置,需要統(tǒng)一的一個(gè)配置中心,將配置下發(fā)。
  • 拆分成的服務(wù)太多了,沒(méi)辦法一個(gè)個(gè)看日志,需要統(tǒng)一的日志中心,將日志匯總。
  • 拆分成的服務(wù)太多了,很難定位性能瓶頸,需要通過(guò)APM全鏈路應(yīng)用監(jiān)控,發(fā)現(xiàn)性能瓶頸,及時(shí)修改。
  • 拆分成的服務(wù)太多了,不壓測(cè)一下,誰(shuí)也不知道到底能夠抗住多大的量,因而需要全鏈路的壓測(cè)系統(tǒng)。

 

應(yīng)用層需要處理這十二個(gè)問(wèn)題,***一個(gè)都不能少,實(shí)施微服務(wù),你做好準(zhǔn)備了嗎?你真覺(jué)得攢一攢 Spring Cloud,就能夠做好這些嗎?

階段三的運(yùn)維模式

業(yè)務(wù)的微服務(wù)化改造之后,對(duì)于運(yùn)維的模式是有沖擊的。

 

如果業(yè)務(wù)拆成了如此網(wǎng)狀的細(xì)粒度,服務(wù)的數(shù)目就會(huì)非常的多,每個(gè)服務(wù)都會(huì)獨(dú)立發(fā)布,獨(dú)立上線(xiàn),因而版本也非常多。

這樣環(huán)境就會(huì)非常的多,手工部署已經(jīng)不可能,必須實(shí)施自動(dòng)部署。好在在上一個(gè)階段,我們已經(jīng)實(shí)施了自動(dòng)部署,或者基于腳本的,或者基于鏡像的,但是到了微服務(wù)階段都有問(wèn)題。

如果基于腳本的部署,腳本原來(lái)多由運(yùn)維寫(xiě),由于服務(wù)太多,變化也多,腳本肯定要不斷的更新。

而每家公司的開(kāi)發(fā)人員都遠(yuǎn)遠(yuǎn)多于運(yùn)維人員,運(yùn)維根本來(lái)不及維護(hù)自動(dòng)部署的腳本。那腳本能不能由開(kāi)發(fā)寫(xiě)呢?

一般是不可行的,開(kāi)發(fā)對(duì)于運(yùn)行環(huán)境了解有限,而且腳本沒(méi)有一個(gè)標(biāo)準(zhǔn),運(yùn)維無(wú)法把控開(kāi)發(fā)寫(xiě)的腳本的質(zhì)量。

基于虛擬機(jī)鏡像的就會(huì)好很多,因?yàn)樾枰_本做的事情比較少,大部分對(duì)于應(yīng)用的配置都打在鏡像里面了。

如果基于虛擬機(jī)鏡像進(jìn)行交付,也能起到標(biāo)準(zhǔn)交付的效果。而且一旦上線(xiàn)有問(wèn)題,也可以基于虛擬機(jī)鏡像的版本進(jìn)行回滾。

但是虛擬機(jī)鏡像實(shí)在是太大了,動(dòng)不動(dòng)幾百個(gè) G,如果一共一百個(gè)服務(wù),每個(gè)服務(wù)每天一個(gè)版本,一天就是 10000G,這個(gè)存儲(chǔ)容量,誰(shuí)也受不了。

這個(gè)時(shí)候,容器就有作用了。鏡像是容器的根本性發(fā)明,是封裝和運(yùn)行的標(biāo)準(zhǔn),其他什么 namespace,cgroup,早就有了。

原來(lái)開(kāi)發(fā)交付給運(yùn)維的,是一個(gè) war 包,一系列配置文件,一個(gè)部署文檔,但是由于部署文檔更新不及時(shí),常常出現(xiàn)運(yùn)維部署出來(lái)出錯(cuò)的情況。

有了容器鏡像,開(kāi)發(fā)交付給運(yùn)維的,是一個(gè)容器鏡像,容器內(nèi)部的運(yùn)行環(huán)境,應(yīng)該體現(xiàn)在 Dockerfile 文件中,這個(gè)文件是應(yīng)該開(kāi)發(fā)寫(xiě)的。

這個(gè)時(shí)候,從流程角度,將環(huán)境配置這件事情,往前推了,推到了開(kāi)發(fā)這里,要求開(kāi)發(fā)完畢之后,就需要考慮環(huán)境部署的問(wèn)題,而不能當(dāng)甩手掌柜。

由于容器鏡像是標(biāo)準(zhǔn)的,就不存在腳本無(wú)法標(biāo)準(zhǔn)化的問(wèn)題,一旦單個(gè)容器運(yùn)行不起來(lái),肯定是 Dockerfile 的問(wèn)題。

而運(yùn)維組只要維護(hù)容器平臺(tái)就可以,單個(gè)容器內(nèi)的環(huán)境,交給開(kāi)發(fā)來(lái)維護(hù)。這樣做的好處就是,雖然進(jìn)程多,配置變化多,更新頻繁。

但是對(duì)于某個(gè)模塊的開(kāi)發(fā)團(tuán)隊(duì)來(lái)講,這個(gè)量是很小的,因?yàn)?5-10 個(gè)人專(zhuān)門(mén)維護(hù)這個(gè)模塊的配置和更新,不容易出錯(cuò)。自己改的東西自己知道。

如果這些工作量全交給少數(shù)的運(yùn)維團(tuán)隊(duì),不但信息傳遞會(huì)使得環(huán)境配置不一致,部署量會(huì)大非常多。

容器作用之一就是環(huán)境交付提前,讓每個(gè)開(kāi)發(fā)僅僅多做 5% 的工作,就能夠節(jié)約運(yùn)維 200% 的工作,并且不容易出錯(cuò)。


 

 

容器的另外一個(gè)作用,就是不可改變基礎(chǔ)設(shè)施。容器鏡像有個(gè)特點(diǎn),就是 SSH 到里面做的任何修改,重啟都不見(jiàn)了,恢復(fù)到鏡像原來(lái)的樣子,也就杜絕了原來(lái)我們部署環(huán)境,這改改,那修修***部署成功的壞毛病。

因?yàn)槿绻麢C(jī)器數(shù)目比較少,還可以登錄到每臺(tái)機(jī)器上改改東西,一旦出了錯(cuò)誤,比較好排查。

但是微服務(wù)狀態(tài)下,環(huán)境如此復(fù)雜,規(guī)模如此大,一旦有個(gè)節(jié)點(diǎn),因?yàn)槿藶樾薷呐渲脤?dǎo)致錯(cuò)誤,非常難排查,所以應(yīng)該貫徹不可改變基礎(chǔ)設(shè)施,一旦部署了,就不要手動(dòng)調(diào)整了,想調(diào)整從頭走發(fā)布流程。

這里面還有一個(gè)概念叫做一切即代碼,單個(gè)容器的運(yùn)行環(huán)境 Dockerfile 是代碼,容器之間的關(guān)系編排文件是代碼,配置文件是代碼,所有的都是代碼。

代碼的好處就是誰(shuí)改了什么,Git 里面一清二楚,都可以 Track,有的配置錯(cuò)了,可以統(tǒng)一發(fā)現(xiàn)誰(shuí)改的。

階段三的組織形態(tài)

到了微服務(wù)階段,實(shí)施容器化之后,你會(huì)發(fā)現(xiàn),本來(lái)原來(lái)運(yùn)維該做的事情開(kāi)發(fā)做了,開(kāi)發(fā)的老大愿意么?開(kāi)發(fā)的老大會(huì)投訴運(yùn)維的老大么?

這就不是技術(shù)問(wèn)題了,其實(shí)這就是 DevOps,DevOps 不是不區(qū)分開(kāi)發(fā)和運(yùn)維,而是公司從組織到流程,能夠打通,看如何合作,邊界如何劃分,對(duì)系統(tǒng)的穩(wěn)定性更有好處。

 

開(kāi)發(fā)和運(yùn)維變成了一個(gè)融合的過(guò)程,開(kāi)發(fā)會(huì)幫運(yùn)維做一些事情,例如環(huán)境交付的提前,Dockerfile 的書(shū)寫(xiě)。

運(yùn)維也可以幫助研發(fā)做一些事情,例如微服務(wù)之間的注冊(cè)發(fā)現(xiàn),治理,配置等,不可能公司的每一個(gè)業(yè)務(wù)都單獨(dú)的一套框架,可以下沉到運(yùn)維組來(lái)變成統(tǒng)一的基礎(chǔ)設(shè)施,提供統(tǒng)一的管理。

實(shí)施容器,微服務(wù),DevOps 后,整個(gè)分工界面就變成了下面的樣子:

 

在網(wǎng)易就是這個(gè)模式,杭州研究院作為公共技術(shù)服務(wù)部門(mén),有運(yùn)維部門(mén)管理機(jī)房,上面是云平臺(tái)組,基于 OpenStack 開(kāi)發(fā)了租戶(hù)可自助操作的云平臺(tái)。

PaaS 組件也是云平臺(tái)的一部分,點(diǎn)擊可得,提供 SLA 保障。容器平臺(tái)也是云平臺(tái)的一部分,并且基于容器提供持續(xù)集成,持續(xù)部署的工具鏈。

微服務(wù)的管理和治理也是云平臺(tái)的一部分,業(yè)務(wù)部門(mén)可以使用這個(gè)平臺(tái)進(jìn)行微服務(wù)的開(kāi)發(fā)。

業(yè)務(wù)部門(mén)的中間件組或者架構(gòu)組和云平臺(tái)組溝通密切,主要是如何以正確的姿勢(shì)使用云平臺(tái)組件。

業(yè)務(wù)部門(mén)分前端組,業(yè)務(wù)開(kāi)發(fā)組,中臺(tái)開(kāi)發(fā)組。

如何實(shí)施微服務(wù),容器化,DevOps

實(shí)施微服務(wù),容器化,DevOps 有很多的技術(shù)選型。其中容器化的部分,Kubernetes 是當(dāng)之無(wú)愧的選擇。

但是 Kubernetes 可不僅僅志在容器,它是為微服務(wù)而設(shè)計(jì)的。對(duì)于實(shí)施微服務(wù)各方面都有涉及。

 

Kubernetes 對(duì)于容器的運(yùn)行時(shí)生命周期管理比較完善,但是對(duì)于服務(wù)治理方面還不夠強(qiáng)大。

因而對(duì)于微服務(wù)的治理方面,多選擇使用 Dubbo 或者 Spring Cloud。使用 Dubbo 的存量應(yīng)用比較多,相對(duì)于 Dubbo 來(lái)講,Spring Cloud 比較新,組件也比較豐富。

但是 Spring Cloud 的組件都不到開(kāi)箱即用的程度,需要比較高的學(xué)習(xí)曲線(xiàn)。

 

因而基于 Kubernetes 和 Spring Cloud,就有了下面這個(gè)微服務(wù),容器,DevOps 的綜合管理平臺(tái)。

包含基于 Kubernetes 的容器平臺(tái),持續(xù)集成平臺(tái),測(cè)試平臺(tái),API 網(wǎng)關(guān),微服務(wù)框架,APM 應(yīng)用性能管理。

 

主要為了解決從階段一到階段二,或者階段二到階段三的改進(jìn)中的痛點(diǎn)。下面我們列舉幾個(gè)場(chǎng)景:

場(chǎng)景一:架構(gòu) SOA 拆分時(shí),如何保證回歸測(cè)試功能集不變

前面說(shuō)過(guò),服務(wù)拆分后,最怕的是拆完了引入一大堆的 Bug,通過(guò)理智肯定不能保證拆分后功能集是不變的,因而需要有回歸測(cè)試集合保證,只要測(cè)試集合通過(guò)了,功能就沒(méi)有太大的問(wèn)題。

回歸測(cè)試***是基于接口的,因?yàn)榛?UI 的很危險(xiǎn),有的接口是有的,但是 UI 上不能點(diǎn),這個(gè)接口如果有 Bug,就被暫時(shí)隱藏掉了,當(dāng)后面有了新的需求,當(dāng)開(kāi)發(fā)發(fā)現(xiàn)有個(gè)接口能夠調(diào)用的時(shí)候,一調(diào)用就掛了。


 

 

有了基于 Restful API 的接口測(cè)試之后,可以組成場(chǎng)景測(cè)試,將多個(gè) API 調(diào)用組合成為一個(gè)場(chǎng)景,例如下單,扣優(yōu)惠券,減庫(kù)存,就是一個(gè)組合場(chǎng)景。

另外可以形成測(cè)試集合,例如冒煙測(cè)試集合,當(dāng)開(kāi)發(fā)將功能交付給測(cè)試的時(shí)候,執(zhí)行一下。

再如日常測(cè)試集合,每天晚上跑一遍,看看當(dāng)天提交的代碼有沒(méi)有引入新的 Bug。再如回歸測(cè)試集合,上線(xiàn)之前跑一遍,保證大部分的功能是正確的。

場(chǎng)景二:架構(gòu) SOA 化的時(shí)候,如何統(tǒng)一管理并提供中臺(tái)服務(wù)

當(dāng)業(yè)務(wù)要提供中臺(tái)服務(wù)的時(shí)候,中臺(tái)服務(wù)首先希望能夠注冊(cè)到一個(gè)地方,當(dāng)業(yè)務(wù)組開(kāi)發(fā)業(yè)務(wù)邏輯的時(shí)候,能夠在這個(gè)地方找到中臺(tái)的接口如何調(diào)用的文檔,當(dāng)業(yè)務(wù)組的業(yè)務(wù)注冊(cè)上來(lái)的時(shí)候,可以進(jìn)行調(diào)用。

 

在微服務(wù)框架除普通的注冊(cè)發(fā)現(xiàn)功能之外,還提供知識(shí)庫(kù)的功能,使得接口和文檔統(tǒng)一維護(hù),文檔和運(yùn)行時(shí)一致,從而調(diào)用方看著文檔就可以進(jìn)行調(diào)用。

另外提供注冊(cè),發(fā)現(xiàn),調(diào)用期間的鑒權(quán)功能,不是誰(shuí)看到中臺(tái)服務(wù)都能調(diào)用,需要中臺(tái)管理員授權(quán)才可以。

為了防止中臺(tái)服務(wù)被惡意調(diào)用,提供賬戶(hù)審計(jì)功能,記錄操作。

場(chǎng)景三:服務(wù) SOA 化的時(shí)候,如何保證關(guān)鍵服務(wù)的調(diào)用安全

 

有的服務(wù)非常關(guān)鍵,例如支付服務(wù),和資金相關(guān),不是誰(shuí)想調(diào)用就能調(diào)用的,一旦被非法調(diào)用了,后果嚴(yán)重。

在服務(wù)治理里面有路由功能,除了能夠配置靈活的路由功能之外,還可以配置黑白名單,可以基于 IP 地址,也可以基于服務(wù)名稱(chēng),配置只有哪些應(yīng)用可以調(diào)用,可以配合云平臺(tái)的 VPC 功能,限制調(diào)用方。

場(chǎng)景四:架構(gòu) SOA 化后,對(duì)外提供 API 服務(wù),構(gòu)建開(kāi)放平臺(tái)

 

架構(gòu) SOA 化之后,除了對(duì)內(nèi)提供中臺(tái)服務(wù),很多能力也可以開(kāi)放給外部的合作伙伴,形成開(kāi)放平臺(tái)。

例如你是一家物流企業(yè),除了在你的頁(yè)面上下單寄快遞之外,其他的電商也可以調(diào)用你的 API 來(lái)寄快遞。

這就需要有一個(gè) API 網(wǎng)關(guān)來(lái)管理 API,對(duì)接你的電商只要登錄到這個(gè) API 網(wǎng)關(guān),就能看到 API 以及如何調(diào)用,API 網(wǎng)關(guān)上面的文檔管理就是這個(gè)作用。

另外 API 網(wǎng)關(guān)提供接口的統(tǒng)一認(rèn)證鑒權(quán),也提供 API 接口的定時(shí)開(kāi)關(guān)功能,靈活控制 API 的生命周期。

場(chǎng)景五:互聯(lián)網(wǎng)場(chǎng)景下的灰度發(fā)布和 A/B 測(cè)試

接下來(lái)我們切換到互聯(lián)網(wǎng)業(yè)務(wù)場(chǎng)景,經(jīng)常會(huì)做 A/B 測(cè)試,這就需要 API 網(wǎng)關(guān)的流量分發(fā)功能。

例如我們做互聯(lián)網(wǎng)業(yè)務(wù),當(dāng)上一個(gè)新功能的 時(shí)候,不清楚客戶(hù)是否喜歡,于是可以先開(kāi)放給山東的客戶(hù)。

當(dāng) HTTP 頭里面有來(lái)自山東的字段,則訪(fǎng)問(wèn) B 系統(tǒng),其他客戶(hù)還是訪(fǎng)問(wèn) A 系統(tǒng),這個(gè)時(shí)候可以看山東的客戶(hù)是否都喜歡,如果都喜歡,就推向全國(guó),如果不喜歡,就撤下來(lái)。

場(chǎng)景六:互聯(lián)網(wǎng)場(chǎng)景下的預(yù)發(fā)測(cè)試

這個(gè)也是互聯(lián)網(wǎng)場(chǎng)景下經(jīng)常遇到的預(yù)發(fā)測(cè)試,雖然我們?cè)跍y(cè)試環(huán)境里面測(cè)試了很多輪。

但是由于線(xiàn)上場(chǎng)景更加復(fù)雜,有時(shí)候需要使用線(xiàn)上真實(shí)數(shù)據(jù)進(jìn)行測(cè)試,這個(gè)時(shí)候可以在線(xiàn)上的正式環(huán)境旁邊部署一套預(yù)發(fā)環(huán)境。

使用 API 網(wǎng)關(guān)將真實(shí)的請(qǐng)求流量,鏡像一部分到預(yù)發(fā)環(huán)境,如果預(yù)發(fā)環(huán)境能夠正確處理真實(shí)流量,再上線(xiàn)就放心多了。

場(chǎng)景七:互聯(lián)網(wǎng)場(chǎng)景下的性能壓測(cè)

互聯(lián)網(wǎng)場(chǎng)景下要做線(xiàn)上真實(shí)的性能壓測(cè),才能知道整個(gè)系統(tǒng)真正的瓶頸點(diǎn)。

但是性能壓測(cè)的數(shù)據(jù)不能進(jìn)真實(shí)的數(shù)據(jù)庫(kù),因而需要進(jìn)入影子庫(kù),性能壓測(cè)的流量,也需要有特殊的標(biāo)記放在 HTTP 頭里面,讓經(jīng)過(guò)的業(yè)務(wù)系統(tǒng)知道這是壓測(cè)數(shù)據(jù),不進(jìn)入真實(shí)的數(shù)據(jù)庫(kù)。

這個(gè)特殊的標(biāo)記要在 API 網(wǎng)關(guān)上添加,但是由于不同的壓測(cè)系統(tǒng)要求不一樣,因而需要 API 網(wǎng)關(guān)有定制路由插件功能,可以隨意添加自己的字段到 HTTP 頭里面,和壓測(cè)系統(tǒng)配合。

場(chǎng)景八:微服務(wù)場(chǎng)景下的熔斷,限流,降級(jí)

微服務(wù)場(chǎng)景下,大促的時(shí)候,需要進(jìn)行熔斷,限流,降級(jí)。這個(gè)在 API 網(wǎng)關(guān)上可以做,將超過(guò)壓測(cè)值的流量,通過(guò)限流,攔在系統(tǒng)外面,從而保證盡量的流量,能夠下單成功。

在服務(wù)之間,也可以通過(guò)微服務(wù)框架,進(jìn)行熔斷,限流,降級(jí)。Dubbo 對(duì)于服務(wù)的控制在接口層面,Spring Cloud 對(duì)于服務(wù)的管理在實(shí)例層面。

這兩個(gè)粒度不同的客戶(hù)選擇不一樣,都用 Dubbo 粒度太細(xì),都用 Spring Cloud 粒度太粗,所以需要可以靈活配置。

 

場(chǎng)景九:微服務(wù)場(chǎng)景下的精細(xì)化流量管理。

 

 

在互聯(lián)網(wǎng)場(chǎng)景下,經(jīng)常需要對(duì)于流量進(jìn)行精細(xì)化的管理,可以根據(jù) HTTP Header 里面的參數(shù)進(jìn)行分流。

例如 VIP 用戶(hù)訪(fǎng)問(wèn)一個(gè)服務(wù),非 VIP 用戶(hù)訪(fǎng)問(wèn)另一個(gè)服務(wù),這樣可以對(duì)高收入的用戶(hù)推薦更加精品的產(chǎn)品,增加連帶率。

 

責(zé)任編輯:武曉燕 來(lái)源: 劉超的通俗云計(jì)算
相關(guān)推薦

2023-12-01 07:38:33

微服務(wù)訂單服務(wù)

2024-07-12 08:52:50

2018-05-09 08:18:26

微服務(wù)改造架構(gòu)

2021-12-12 10:21:43

互聯(lián)風(fēng)傳統(tǒng)企業(yè)電子商務(wù)

2020-08-27 11:35:36

Python 開(kāi)發(fā)編程語(yǔ)言

2017-09-06 18:18:00

成本CIO調(diào)查虛擬化

2020-04-14 10:06:20

微服務(wù)Netflix語(yǔ)言

2021-12-16 15:53:14

遠(yuǎn)程辦公網(wǎng)絡(luò)攻擊勒索軟件

2020-11-02 18:39:41

Pythonpython命令

2022-05-23 13:36:31

惡意軟件網(wǎng)絡(luò)攻擊

2014-09-01 15:39:16

傳統(tǒng)企業(yè)轉(zhuǎn)型

2018-10-26 14:32:46

2021-01-26 00:46:40

微服務(wù)架構(gòu)微服務(wù)應(yīng)用

2011-05-07 10:47:29

Oracle大小寫(xiě)

2015-04-28 15:03:20

大數(shù)據(jù)中小企業(yè)的痛

2016-01-29 15:59:03

系統(tǒng)中毒防毒軟件

2023-10-24 08:37:00

git工具開(kāi)源

2024-06-26 00:43:54

MySQL測(cè)試TOTAL?

2025-04-27 10:14:57

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 青青草国产在线观看 | av免费看片 | 日韩欧美网| 成人不卡一区二区 | 中文字幕视频在线观看 | 亚洲免费一 | 中文字幕欧美日韩一区 | 国产成人a亚洲精品 | 亚州精品天堂中文字幕 | 欧美日韩国产在线观看 | 欧美高清视频一区 | 香蕉二区 | 中文字幕视频网 | 91欧美 | 91精品无人区卡一卡二卡三 | 欧美久久精品一级c片 | 精品videossex高潮汇编 | 亚洲成人av在线 | 99视频在线播放 | 日操夜操 | www.99热这里只有精品 | 丁香一区二区 | 男人天堂99 | 国产亚洲成av人片在线观看桃 | 麻豆国产精品777777在线 | www.亚洲一区二区三区 | 亚洲aⅴ | 精区3d动漫一品二品精区 | 看av网址 | 影音先锋成人资源 | 91精品在线看 | 成人高清在线 | av毛片 | 久久久www成人免费精品 | 成人h视频在线 | 精品国产18久久久久久二百 | 久优草 | 日韩a在线观看 | 日日夜夜精品视频 | 一区二区三区国产 | 久久精品一二三影院 |