顧名思義,微服務(wù)就是微小的服務(wù),這里的服務(wù)和SOA(面向服務(wù)的架構(gòu))中的服務(wù)是一個(gè)概念,舉個(gè)例子,你通過(guò)百度地圖API能夠把一個(gè)地址轉(zhuǎn)化成一個(gè)經(jīng)緯度,這就是百度地圖提供的一個(gè)服務(wù)。
那什么是“微”?多“微”才算微?這里有一個(gè)很重要的原則,就是“高內(nèi)聚,低耦合”,一個(gè)微服務(wù)在內(nèi)部必須是高內(nèi)聚的,它和其它服務(wù)必須是低耦合的,如果你設(shè)計(jì)的服務(wù)和其它的服務(wù)緊密地耦合在一起,其它服務(wù)的變化會(huì)影響你的服務(wù)或者你的服務(wù)變化會(huì)要求其它服務(wù)跟著一起變化,你就享受不到微服務(wù)帶來(lái)的好處。
我喜歡微服務(wù)主要是因?yàn)橄旅?點(diǎn)理由:
使用微服務(wù)之后,團(tuán)隊(duì)開(kāi)始有機(jī)會(huì)嘗試多種開(kāi)發(fā)語(yǔ)言與新技術(shù)。 舉個(gè)例子,我們之前的一個(gè)單塊系統(tǒng),后端一直使用Java EE,前臺(tái)一直使用ExtJs,持續(xù)了很多年,開(kāi)發(fā)人員都用吐了,直到我們開(kāi)始把一些獨(dú)立的模塊從單塊系統(tǒng)剝離出來(lái)之后,我們才開(kāi)始嘗鮮各種新技術(shù),比如MongoDB, NodeJs, AngularJs和VueJs等技術(shù)。
微服務(wù)能使改變局部化。舉個(gè)例子,我們開(kāi)發(fā)的其中一個(gè)單塊系統(tǒng)隨著時(shí)間的變化越來(lái)越龐大,代碼的編譯,打包,測(cè)試和上線都要花很長(zhǎng)的時(shí)間。即使改動(dòng)了一行代碼,也會(huì)觸發(fā)整個(gè)系統(tǒng)的構(gòu)建,感覺(jué)非常重量級(jí)。自從我們把一些模塊剝離出來(lái)以后,我們才有機(jī)會(huì)把改動(dòng)限制在一個(gè)模塊之內(nèi),如果這個(gè)模塊非常輕量級(jí),上線的速度會(huì)非???,比如我們只改了NodeJs上的一個(gè)文件,都不用編譯其它任何代碼,就能在1分鐘之內(nèi)把變動(dòng)部署到線上。
微服務(wù)能避免分布式團(tuán)隊(duì)。如果一個(gè)單塊系統(tǒng)很龐大,開(kāi)發(fā)和運(yùn)維人員就會(huì)很多,人員一多,就很有可能分布在各地。舉個(gè)例子,我們有一個(gè)單塊系統(tǒng)的成員就分布在上海,珠海和美國(guó)三地,要上線一個(gè)功能需要依賴三地同事的協(xié)同合作,很多時(shí)間都浪費(fèi)在異地的溝通和等待上了。但是如果使用微服務(wù)設(shè)計(jì),把一個(gè)大的單塊系統(tǒng)分解成足夠小的微服務(wù),就有可能把一個(gè)微服務(wù)的所有控制權(quán)交給一個(gè)本地小團(tuán)隊(duì),大幅度地減少溝通和等待的成本。同時(shí)這個(gè)小團(tuán)隊(duì)的積極性,主動(dòng)性以及創(chuàng)造性也會(huì)大幅增長(zhǎng)。
當(dāng)然要享受到上述的三點(diǎn)好處是不容易的,怎么把一個(gè)單塊系統(tǒng)重構(gòu)成高內(nèi)聚低耦合的多個(gè)相互協(xié)同的微服務(wù)絕對(duì)是一個(gè)挑戰(zhàn),如果你對(duì)微服務(wù)也開(kāi)始感興趣了,墻裂推薦《微服務(wù)設(shè)計(jì)》這本書,邊讀邊實(shí)踐,相信你一定會(huì)獲益匪淺。