先看看維基百科是如何定義微服務(wù)的,。微服務(wù)的概念最早是在 2014 年由 Martin Fowler 和 James Lewis 共同提出,他們定義了微服務(wù)是 ①由單一應(yīng)用程序構(gòu)成的小服務(wù),,②擁有自己的進(jìn)程與輕量化處理,, ③服務(wù)依業(yè)務(wù)功能設(shè)計(jì), ④以全自動(dòng)的方式部署,, ⑤與其他服務(wù)使用 HTTP API 通訊,。 ⑥同時(shí),服務(wù)會(huì)使用最小規(guī)模的集中管理 (例如 Docker)技術(shù),,服務(wù)可以用不同的編程語言與數(shù)據(jù)庫等,。 這個(gè)理論的定義看著有點(diǎn)暈?沒關(guān)系,,接下來我來幫你理解到底什么是微服務(wù),? 單體應(yīng)用 在開聊微服務(wù)之前,先要你介紹一下單體應(yīng)用,。如果你不知道單體應(yīng)用的痛,,那也不會(huì)深刻理解微服務(wù)的價(jià)值。 早些年,,各大互聯(lián)網(wǎng)公司的應(yīng)用技術(shù)棧大致可分為 LAMP(Linux + Apache + MySQL + PHP)和 MVC(Spring + iBatis/Hibernate + Tomcat)兩大流派,。無論是 LAMP 還是 MVC,都是為單體應(yīng)用架構(gòu)設(shè)計(jì)的,,其優(yōu)點(diǎn)是學(xué)習(xí)成本低,,開發(fā)上手快,測試,、部署,、運(yùn)維也比較方便,甚至一個(gè)人就可以完成一個(gè)網(wǎng)站的開發(fā)與部署。 以 MVC 架構(gòu)為例,,業(yè)務(wù)通常是通過部署一個(gè) WAR 包到 Tomcat 中,,然后啟動(dòng) Tomcat,監(jiān)聽某個(gè)端口即可對(duì)外提供服務(wù),。早期在業(yè)務(wù)規(guī)模不大,、開發(fā)團(tuán)隊(duì)人員規(guī)模較小的時(shí)候,采用單體應(yīng)用架構(gòu),,團(tuán)隊(duì)的開發(fā)和運(yùn)維成本都可控,。 然而隨著業(yè)務(wù)規(guī)模的不斷擴(kuò)大,團(tuán)隊(duì)開發(fā)人員的不斷擴(kuò)張,,單體應(yīng)用架構(gòu)就會(huì)開始出現(xiàn)問題,。我估計(jì)經(jīng)歷過業(yè)務(wù)和團(tuán)隊(duì)快速增長的同學(xué)都會(huì)對(duì)此深有感觸,。從我的角度來看,,大概會(huì)有以下幾個(gè)方面的問題。 ....... 想要解決上面這些問題,,服務(wù)化的思想也就應(yīng)運(yùn)而生,。 什么是服務(wù)化? 通俗地講,,服務(wù)化就是把傳統(tǒng)的單機(jī)應(yīng)用中通過 JAR 包依賴產(chǎn)生的本地方法調(diào)用,,改造成通過 RPC 接口產(chǎn)生的遠(yuǎn)程方法調(diào)用。一般在編寫業(yè)務(wù)代碼時(shí),,對(duì)于一些通用的業(yè)務(wù)邏輯,,我會(huì)盡力把它抽象并獨(dú)立成為專門的模塊,因?yàn)檫@對(duì)于代碼復(fù)用和業(yè)務(wù)理解都大有裨益,。 在過去的項(xiàng)目經(jīng)歷里,,我對(duì)此深有體會(huì)。以微博系統(tǒng)為例,,微博既包含了內(nèi)容模塊,,也包含了消息模塊和用戶模塊等。其中消息模塊依賴內(nèi)容模塊,,消息模塊和內(nèi)容模塊又都依賴用戶模塊,。當(dāng)這三個(gè)模塊的代碼耦合在一起,應(yīng)用啟動(dòng)時(shí),,需要同時(shí)去加載每個(gè)模塊的代碼并連接對(duì)應(yīng)的資源,。一旦任何模塊的代碼出現(xiàn) bug,或者依賴的資源出現(xiàn)問題,,整個(gè)單體應(yīng)用都會(huì)受到影響,。 為此,首先可以把用戶模塊從單體應(yīng)用中拆分出來,,獨(dú)立成一個(gè)服務(wù)部署,,以 RPC 接口的形式對(duì)外提供服務(wù),。微博和消息模塊調(diào)用用戶接口,就從進(jìn)程內(nèi)的調(diào)用變成遠(yuǎn)程 RPC 調(diào)用,。這樣,,用戶模塊就可以獨(dú)立開發(fā)、測試,、上線和運(yùn)維,,可以交由專門的團(tuán)隊(duì)來做,與主模塊不耦合,。進(jìn)一步的可以再把消息模塊也拆分出來作為獨(dú)立的模塊,,交由專門的團(tuán)隊(duì)來開發(fā)和維護(hù)。 可見通過服務(wù)化,,可以解決單體應(yīng)用膨脹,、團(tuán)隊(duì)開發(fā)耦合度高、協(xié)作效率低下的問題,。 什么是微服務(wù),? 從 2014 年開始,得益于以 Docker 為代表的容器化技術(shù)的成熟以及 DevOps 文化的興起,,服務(wù)化的思想進(jìn)一步演化,,演變?yōu)榻裉煳覀兯熘奈⒎?wù)。 那么微服務(wù)相比于服務(wù)化又有什么不同呢,? 在我看來,,可以總結(jié)為以下四點(diǎn): 繼續(xù)以前面舉的微博系統(tǒng)為例,可以進(jìn)一步對(duì)內(nèi)容模塊的功能進(jìn)行拆分,,比如內(nèi)容模塊又包含了 feed 模塊,、評(píng)論模塊和個(gè)人頁模塊。通過微服務(wù)化,,將這三個(gè)模塊變成三個(gè)獨(dú)立的服務(wù),,每個(gè)服務(wù)依賴各自的資源,并獨(dú)立部署在不同的服務(wù)池中,,可以由不同的開發(fā)人員進(jìn)行維護(hù),。當(dāng)評(píng)論服務(wù)需求變更時(shí),只需要修改評(píng)論業(yè)務(wù)相關(guān)的代碼,,并獨(dú)立上線發(fā)布,;而 feed 服務(wù)和個(gè)人頁服務(wù)不需要變更,也不會(huì)受到發(fā)布可能帶來的變更影響,。 由此可見,,微服務(wù)化給服務(wù)的發(fā)布和部署,以及服務(wù)的保障帶來了諸多好處。 總結(jié) 今天,,我介紹了微服務(wù)的發(fā)展由來,,它是由單體應(yīng)用進(jìn)化到服務(wù)化拆分部署,后期隨著移動(dòng)互聯(lián)網(wǎng)規(guī)模的不斷擴(kuò)大,,敏捷開發(fā),、持續(xù)交付、DevOps 理論的發(fā)展和實(shí)踐,,以及基于 Docker 容器化技術(shù)的成熟,,微服務(wù)架構(gòu)開始流行,逐漸成為應(yīng)用架構(gòu)的未來演進(jìn)方向,。 總結(jié)來說,,微服務(wù)架構(gòu)是將復(fù)雜臃腫的單體應(yīng)用進(jìn)行細(xì)粒度的服務(wù)化拆分,每個(gè)拆分出來的服務(wù)各自獨(dú)立打包部署,,并交由小團(tuán)隊(duì)進(jìn)行開發(fā)和運(yùn)維,,從而極大地提高了應(yīng)用交付的效率,并被各大互聯(lián)網(wǎng)公司所普遍采用,。 |
|