微服務(microservice)是一種軟體架構,正得到越來越多的關注。
但是,它到底是什麼意思?什麼樣的架構可以叫做微服務?
網上的文章雖然很多,但是都太複雜,初學者不容易看懂。我認為,這個概念其實非常簡單,可以很通俗地說明白。
一、單體軟體
要理解微服務,首先需要理解軟體架構的演變。
早期的軟體,所有功能都寫在一起,這稱為單體架構(monolithic software)。
整個軟體就是單一的整體,彷佛一體化的機器。
可以想到,軟體的功能越多,單體架構就會越複雜,很多缺點也隨之暴露出來。
(1)所有功能耦合在一起,互相影響,最終難以管理。
(2)哪怕只修改一行程式碼,整個軟體就要重新構建和部署,成本非常高。
(3)因為軟體做成了一個整體,不可能每個功能單獨開發和測試,只能整體開發和測試,導致必須採用瀑布式開發模型。
以上三個原因的詳細分析,可以參考我以前的文章《軟體工程的最大難題》。
總之,單體架構的大型軟體,不僅開發速度慢,而且會形成難以維護和升級的複雜程式碼,成為程式設計師的沉重負擔。
二、面向服務架構
為了解決上面這些問題,很早就有人提出來,必須打破程式碼的耦合,拆分單體架構,將軟體拆分成一個個獨立的功能單元。
大概在20多年前,隨著網際網路的出現,功能單元可以用遠端"服務"的形式提供,就誕生出了"面向服務架構"(service-oriented architecture,簡稱 SOA)。
所謂服務(service),就是在後臺不間斷執行、提供某種功能的一個程式。最常見的服務就是 Web 服務,透過80埠向外界提供網頁訪問。
"面向服務架構"就是把一個大型的單體程式,拆分成一個個獨立服務,也就是較小的程式。每個服務都是一個獨立的功能單元,承擔不同的功能,服務之間透過通訊協議連在一起。
這種架構有很多優點。
(1)每種服務功能單一,相當於一個小型軟體,便於開發和測試。
(2)各個服務獨立執行,簡化了架構,提高了可靠性。
(3)鼓勵和支援程式碼重用,同一個服務可以用於多種目的。
(4)不同服務可以單獨開發和部署,便於升級。
(5)擴充套件性好,可以容易地加機器、加功能,承受高負載。
(6)不容易出現單點故障。即使一個服務失敗了,不會影響到其他服務。
跟單體架構不一樣,面向服務架構是語言不敏感的,不同服務可以使用不同的語言和工具開發,可能需要部署在不同的系統和環境。
這意味著,面向服務架構預設執行在不同伺服器上,每臺伺服器提供一種服務,多臺伺服器共同組成一個完整的網路應用。
三、微服務
2014年,Docker 出現了,徹底改變了軟體開發的面貌。它讓程式執行在容器中,每個容器可以分別設定執行環境,並且只佔用很少的系統資源。
顯而易見,可以用容器來實現"面向服務架構",每個服務不再佔用一臺伺服器,而是佔用一個容器。
這樣就不需要多臺伺服器了,最簡單的情況下,本機執行多個容器,只用一臺伺服器就實現了面向服務架構,這在以前是做不到的。這種實現方式就叫做微服務。
簡單說,微服務就是採用容器技術的面向服務架構。它依然使用"服務"作為功能單元,但是變成了輕量級實現,不需要新增伺服器,只需要新建容器(一個程式),所以才叫做"微服務"。
一個微服務就是一個獨立的程式。 這個程式可以執行在本機,也可以執行在別的伺服器,或者在雲端(比如雲服務和雲函式 FaaS)。
它的特點與面向服務架構是一樣的,但因為更輕量級,所以功能的解耦和服務化可以做得更徹底。而且,它可以標準化,同樣的容器不管在哪裡執行,結果都是一樣的,所以市場上有很多 SaaS 產品,提供標準化的微服務。
正是由於微服務這些突出的優點,這幾年才會變得如此流行。它和容器技術、雲服務一起,一定會在未來的軟體開發中,扮演越來越重要的角色。
(完)