看過《超能陸戰隊》的朋友可能仍然對于電影中的男主角介紹和演示自己發明的微型機器人的場景記憶猶新。
“它”看起來只是一跟帶有磁性的小小的金屬部件。但是它是一個獨立的個體,自己能夠獨立的大腦,同時,和同伴之間有相互的接口你行鏈接。能夠通訊。能夠隨意的組合成任意功能的物體。
通過類比,我們很容易由硬件領域想到軟件領域。譬如軟件系統的架構,一直都是伴隨著幾種主流的模式,集中式,分布式以及最近才開始流行起來的“微服務”。
濱田宏發明的微型機器人,其實和微服務的思想很類似。一個微小的服務實體,有對外的接口與外部通訊。彼此之間能夠快速組合成新的服務。其架構松散耦合。
什么是微服務?
微服務,至少我目前也沒有找到一個很精確的標準化解釋。所以我們首先從字面上來理解。既然是服務,那一定是一個能夠實現某個功能的實體。
光有功能,是不能成為一下服務的,因為還需要有途徑和外部交互。讓外部的實體能夠獲取服務。譬如web服務,通過http協議和瀏覽器或者app進行交互。所以微服務,一般來說,是有一套和外部通訊的標準接口的,譬如REST API。
名字帶了一個“微”字,說明提供的功能很小,或者很弱。但是一個非常小,或者非常弱的功能,是無法構成一個系統的,因此,他們之間,必須是能夠相互組合的。
在軟件領域,一般把它理解成一種新的架構設計模式。可以和我們通常所熟知的軟件架構做類比,譬如集中式架構,分布式架構。
微服務的特點
彼此獨立:既然是一個獨立的服務,那必然是一個完整的自治系統,不依賴外部的東西就能夠提供服務。有自己一整套的完整的運行機制,有和外部通訊的標準化接口。就像《超能特工隊》里面濱田宏發明的微型機器人,它就是一個獨立的小機器人。可以和其他的機器人通過磁性相互吸引,可以探測到彼此的存在。離開了其他個體,一樣能夠運轉,只是功能比較單一。
原子化:作為一個微服務,一定是一個原子化的服務。也就是說服務不能再劃分成更小的服務了。世界上的一些事物都是有原子 構成的。它為什么能構成所有的物體,正是由于它足夠的基礎。如果一個服務還能劃分成幾個小的服務,那我們就不能稱之為一個微服務,它其實可以通過幾個微服務組合成的一個系統。
組合和重構:如果是最原子的服務,那一定是沒有任何用處的。微服務之所以神奇,在于它能快速的組合和重構。彼此組合成一個系統。系統里面所有的實體在概念上是對等的。因此它的結構相對簡單化。是一種松散耦合的結構,這樣的系統,往往具有更強的可擴展性和魯棒性。
微服務之于實踐
前面談了這么多,可能大部分人還是沒有明白微服務是個什么東西。我們試著通過一些東西來描述。
例如,我們使用ghost搭建了一套個人博客的系統。如果使用傳統的架構,我們可能以模塊的視角來劃分,譬如可以分為”用戶管理”,”文章編輯“,”頁面顯示“,”圖片存儲“,”文章分享“ 等幾個模塊。
換一個視角,我們可以從服務的角度來思考。未來簡單起見,我們先考慮單租戶的場景:
Markdown Service
Web Service
UGC Service
MySQL Service
我們再想想,如果要提供多租戶的服務呢?
我們把數據庫變大,存儲多個用戶的信息?這的確是一種思路,但是其思想有點和我們的微服務的思想背道而馳了。
我們為什么不為每個用戶配備這樣一套服務呢,只要每個服務足夠的微小,其實是沒有太多的浪費的。上面圖里構成的一套系統我們可以作為單獨服務一個用戶的自治系統。當用戶增多時,就呈現出了一套去中心化的云服務的雛形。
Docker在微服務系統中所扮演的角色
微服務要運行,首先需要一套執行的環境。這套環境不能對外部有依賴性。同時,執行環境的粒度又必須足夠的小,這樣才能稱之為”微“,否則必然是對資源的巨大浪費。一個微服務可以跑在一臺虛擬機上面,但是虛擬機粒度太大,即使最小的虛擬機,也至少也有1個核。
正如我們上面的ghost博客的例子,服務一個用戶的服務,顯然用不了一個核。同時,虛擬機有沒有一套方便的管理機制,能夠快速的讓這些服務之間能夠組合和重構。
Docker出現以后,我們看到了微服務的一個非常完美的運行環境。
獨立性:一個容器就是一個完整的執行環境,不依賴外部任何的東西。
細粒度:一臺物理機器可以同時運行成百上千個容器。其計算粒度足夠的小。
快速創建和銷毀:容器可以在秒級進行創建和銷毀,非常適合服務的快速構建和重組。
完善的管理工具:數量眾多的容器編排管理工具,能夠快速的實現 服務的組合和調度。
去中心化的云服務
最近一段時間,“場景化”是一個頻繁出現的詞匯。在這里,我也套用一下這個詞,“什么是微服務的場景化應用?”去中心化的云服務,是一個非常典型的應用場景。
什么是去中心化的云服務呢?這里做一個類比,譬如家里的供暖,可以采用集中化的供暖方式。由電廠或者鋼鐵廠統一提供供暖服務。當然,也有的家庭自己會建設一套中央空調系統進行供暖。
云服務,也會有類似的趨勢。目前云計算的發展比較低級。主要是以托管為主,因此大部分還是中心化的云服務。隨著云計算的應用越來越垂直化,必然也會出現越來越多的去中心化的應用場景。
去年iCloud爆出了被黑客攻擊。黑客攻破一家服務商,就直接竊取了所有用戶的資料。這就是一種中心化的云服務帶來的一些不利的因素。既然我們可以由統一的服務商來提供云服務。我們能否實現一套去中心化的服務呢?
就拿個人云存儲來舉例。每個人都有一套個人的云的存儲系統。這套系統運行在任意的提供“水和電”的基礎云服務商的系統之上。并且可以任意在不同的服務商之間遷移和部署。不同的用戶,可能位于不同的服務商之上。完全由自己控制的一套系統。每一套系統,都是一系列微小的服務組合而成。雖然底層也依賴基礎云服務商,但是他們的作用更像水和電一樣。
國內內以微服務為基礎的去中心化的云服務也已經有一些實踐的例子,譬如terminal.com, dianCloud.com等,逐漸呈現出一部分這樣的思想。借助于這樣的服務,用戶能夠快速的構建一套屬于自己的ghost博客系統,或者采用開源軟件ownCloud搭建的個人云存儲系統。選購他們,就像在商店里面選購商品一樣,拿回家,插上電就可以用了。這種模式,也給開源軟件找到了一個非常好的商業化的機制。我相信這種機制未來會越來越流行。
一個游戲架構的應用場景
游戲是一個比較特殊的行業。在國內,應該是比較早擁抱云計算的一個行業,但是也是架構相對保守的行業。
大部分的游戲架構非常簡單。分布式的架構使用并不是太普遍,大部分是單區單服,一臺強大的機器,運行若干個游戲服(游戲世界)。這并不是游戲架構落后,而是游戲本身的特點決定的。游戲一般以游戲服來劃分,每個游戲服是一個獨立的游戲世界。里面有一定數量的玩家。不能太多,也不能太少(總用戶量一定的情況下,單服人數和總服的數量決定了游戲收入的最大化),兩個游戲世界之間,數據不需要互通。因此通常都是一個進程搞定一個游戲服。
其實這種模式下,微服務也是一個非常好的應用場景。我們知道,游戲其實有非常復雜的邏輯,譬如有控制人物移動的邏輯,控制道具,控制戰斗,同時,游戲中還有成百上千的電腦控制的角色,每個角色都需要有自己智能。為什么我們不將這些細小的功能通過微服務來實現呢?
譬如游戲中的一個單獨的怪獸,可以由自己微服務構成的小的自治系統來控制。它可以完全獨立,接收外部信息,做出反應。未來游戲公司可以復用這些單獨的小系統。換上不同的皮膚,就可以用于不同的游戲。同時游戲其他的邏輯,都可以通過一些獨立的微服務來構成。這些微服務可以借助Docker之類的系統,運行在容器中。能夠快速的自動化的構建出一個完整的游戲世界。
后記
最近,基于Docker的創業公司不停的涌現,大家一夜之間似乎都在談論Docker。但是我想說的是,Docker只是一項新的技術,消費者只會為服務買單,不會為技術買單。何況,對于圈子之外的大部分的消費者,云已經是其能理解的技術極限了,再來一個Docker,基本是無法理解的。因此如果想在Docker領域創業。停止談論Docker,思考Docker技術之上的豐富的場景化的應用,才是關鍵。同樣,微服務也只是一種架構思想。基于這種架構所帶來的神奇的應用場景才是未來。