微服務這幾年不可謂不火,很多技術團隊都開始在自己的項目上引入了微服務。一方面這些團隊確實很好的推動了微服務的應用和發展,另一方面也可以看到一些盲目追技術熱點的行為所帶來的危害,比如很多中小團隊對微服務的基礎知識只是做了很淺顯的瞭解就開始盲目的推動微服務的實施,最後導致了項目的失敗。 微服務要想做好是 ...
微服務這幾年不可謂不火,很多技術團隊都開始在自己的項目上引入了微服務。一方面這些團隊確實很好的推動了微服務的應用和發展,另一方面也可以看到一些盲目追技術熱點的行為所帶來的危害,比如很多中小團隊對微服務的基礎知識只是做了很淺顯的瞭解就開始盲目的推動微服務的實施,最後導致了項目的失敗。
微服務要想做好是一個非常複雜的架構,今天就先只聊一聊微服務的一些基礎架構,算是入門篇。
一、什麼是「 微服務 」?
「 微服務 」由 Martin Fowler 提出,它是指一種軟體架構風格。一個大型的系統可以由多個微服務組成,每個微服務是被獨立部署,獨立完成自己的任務單元,微服務之間是通過API方式進行通信調用,是松耦合的。
這個模式聽著是不是很熟悉的感覺?
因為在提出「 微服務 」概念之前,很多互聯網公司的中大型項目早就是按照將業務拆分成獨立單元的形式在部署和架構的,這與微服務的思路是一脈相通的,只不過實現方式沒有現在這麼規範與體系。
那「 微服務 」到底是怎麼演變過來的呢?
在做一個新項目的時候,一開始項目大多數都很小,都是「 單體應用 」,這是很常見的做法。在項目規模小的時候,這種方式開發效率和運維效率都最高,符合互聯網公司快速響應的要求。
但是隨著業務量越來越大,項目也越來越複雜,開發團隊人員也越來越多。這個時候還採用單體應用,問題就會很明顯了。下麵挑選兩個最為常見的問題來舉例:
- 協同問題:多個人同時開發一份代碼,在工作協同上就會經常遇到代碼衝突問題。
- 可用性問題:因為是單體應用,即使改個最小的功能,也需要整體發佈,不僅直接影響了線上可用性,還可能會對正常功能帶來風險。
為瞭解決這些問題,大家就開始考慮將「 單體應用 」進行拆分,進行服務化部署。然後又隨著 Martin Fowler對「 微服務 」概念的提出,加上 DevOps 的流行,進一步促進了微服務的火熱發展。
「 微服務 」的理念提倡每個服務都是單一職責,且每一個服務都能實現自治,因此可以帶來一些明顯好處:
- 部署簡單:每個微服務都可以獨立去部署,方便快捷。
- 邏輯清晰:將一個獨立功能邏輯封裝在單一微服務裡面,實現整體項目的邏輯清晰。
- 可擴展:因為可以隨時增加和減少微服務,可以很方便的擴展功能。
- 可靠性高:某一個功能的異常可以隔離在單一微服務裡面,可以提高整體可靠性。
二、「 微服務 」的架構是什麼樣?
我們先來看一下「 微服務 」的架構圖:
(圖片來源網路,粉絲太少就懶得畫圖了,大家發揮一下想象力將就的看看,哈哈)
看起來挺複雜對不對,事實上也確實很複雜。
所以微服務並不是適用於所有項目、所有團隊的。在應用之前一定要搞清楚是否適合自己。
要保證這麼一套微服務架構能成功運行起來,我們起碼需要以下這些 微服務的基礎組件:
服務註冊
部署了一個微服務節點,得讓調用者知道啊,當微服務節點有增加或減少的時候,也得讓調用者及時知曉啊。這些問題都是通過“服務註冊”組件來實現的,服務提供者將自己的服務地址等信息登記到“服務註冊”組件中,調用者需要的時候,每次都先去查詢“服務註冊”即可。免去人工維護微服務節點的信息同步問題。
服務網關
是指提供給外部系統調用的是統一網關。主要做安全和許可權控制等。
配置中心
微服務的配置中心是用來統一管理所有微服務節點的配置信息的。因為同一個程式可能要適用於多個環境,所以在微服務實踐中要儘量做到程式與配置分離,將配置進行集中管理。包括微服務節點信息、程式運行時配置、變數配置、數據源配置、日誌配置、版本配置等。
服務框架
是指用來規範各個微服務節點之間通信標準的。服務間通信採用什麼協議、數據是如何傳輸的、數據格式是什麼樣的。有了這個統一的“服務框架”就能保證各個微服務節點之間高效率的協同。
服務監控
微服務運行起來之後,為了能夠監控節點的健康情況,保障節點的高可行,需要對各個服務節點進行收集數據指標、然後對數據進行實時處理和分析,形成監控報表和預警。
服務追蹤
一旦使用了微服務架構,那麼當有請求過來時,就會經過多個微服務節點的處理,形成了一個調用鏈。為了進行問題追蹤和故障的定位,需要對請求的完整調用鏈進行記錄。
這裡的服務追蹤與上面的服務監控是不同維度的,一個是全局的,一個是微觀的,發揮的作用也不一樣。
服務治理
就是指需要通過準備一些策略和方案,來保障整個微服務架構在生產環境遇到極端情況下也能正常提供服務的措施。比如 熔斷、限流、隔離等等。
當然,上述只是一個微服務架構最為核心的基礎組件,一旦微服務體系過大,例如有幾十上百個微服務節點,那麼開發、維護、測試的成本就會非常大。因此一般還會引入 自動化部署 和 自動化測試 來提高協同效率。
三、「 微服務 」入門如何避免踩坑?
你以為微服務架構都是下麵這樣的嗎?
事實上,更能是下麵這樣的,哈哈。
(圖片來源網路)
大家都在宣揚「 微服務 」多麼多麼的好,例如:易擴展、松耦合、服務簡單、獨立開發、易維護、輕量級等等。雖然這些優勢也是事實,但是「 微服務 」帶來的問題也很多,尤其是對於剛入門的團隊而言,應用微服務後,趟坑真的可以趟到你崩潰。下麵就普及一些常見的問題來給大家打個預防針:
不是所有項目都適用微服務
有些項目規模還比較小,或者項目才剛立項啟動,也只有三四個人負責開發維護,這時候是不建議一上來就搞微服務架構的。這種情況下搞微服務,不僅是“殺雞用牛刀”,而且還無謂的增加了項目的複雜度,本身一個單體結構就可以搞定的事情,非得拆分N多節點,人員又不足以支撐這麼多節點的開發維護,這完全是自找苦吃。反而是等項目成熟了、規模大了之後,再開始慢慢將原有結構拆為微服務才是正確的做法。
不要拆分過多過細的服務
即使項目經過評估後適合拆為微服務架構,但也不要過度拆解。有的團隊喜歡將項目拆成很細很細的顆粒,最後把項目搞的特別複雜,整個團隊都陷進去了。
拆分服務的顆粒度應該根據業務發展和團隊現狀綜合去考慮。這裡可以參考一個很火的理論「 康威定律 」。什麼樣的團隊,就產生什麼樣的架構,微服務拆分的顆粒度是需要和團隊結構相匹配的。當你著手拆微服務的時候,得先評估一下團隊人員和素質,一般在開發期,2-3個人開發一個服務是合理的,在維護期,1個人維護2-3個服務也是合理的。
如果拆分過細,開發人員跟不上,會嚴重降低大家的工作效率。並且過細的服務,會導致一個請求的調用鏈條很長,不僅會影響請求的響應時間,也會對線上問題排查帶來增加難度。
沒有DevOps就不要急於微服務
一個穩定的微服務架構,是需要 持續集成、自動化部署、自動化測試、健全的監控體系來保障的。如果團隊還不具備DevOps,這些基礎的建設都沒有做好,一上來就搞微服務的話,就會導致實施過程中問題百出,微服務的優勢不能發揮。
以上,就是對架構設計中「 微服務基礎 」的一些思考。