微服務架構 - 正確的開始

wu發表於2021-01-19

  前言

  微服務自從Fred George提出,後續逐漸由不同的大師如Martin Fowler,Neal Ford等人接力推廣演進後,已經在業界如火如荼的流行了好些年,它的目的是有效的拆分應用,實現敏捷開發和部署

  借用Martin Fowler的話說:

  微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。

  每個服務執行在其獨立的程式中,服務與服務間採用輕量級的通訊機制互相協作(通常是基於HTTP協議的RESTful API)。

  每個服務都圍繞著具體業務進行構建,並且能夠被獨立的部署到生產環境、類生產環境等。

  從這裡面我們可以看出,這裡面的關鍵字是“小”,“獨立”,“輕量級”,從中我們可以總結為:服務之間是鬆耦合的,不相互影響的。但“小”絕對不是字面上理解的小,我們下面將介紹一個服務的小的維度是什麼。

  單體服務  

  提到微服務,就不能不提到單體應用了,我們通常所說的單體應用,即將所有功能都打包成在一個獨立單元的應用程式。

  一個典型的單體應用就是將所有業務場景的表示層、業務邏輯層和資料訪問層放在一個工程中,最終經過編譯、打包,部署在一臺伺服器上。

   在微服務或者SOA架構沒提出來之前,業界應該基本都是單體應用,分散式系統架構在業界內已經有較長的歷史了,但單體應用還是佔據著大半壁江山。

  存在即合理的

  所以存在的東西都具備自己的優點,我們來看一下單體應用的優點。

  優點

  • 開發方便:集中式管理,只需要在一個解決方案中程式設計和構建
  • 測試相對簡單:只需要寫一些端到端的測試用例,啟動即可整體聯調查詢問題
  • 部署手段簡易:只需要把一份構建好的檔案丟上伺服器
  • 容易橫向擴充套件:可以部署多個例項,由負載均衡器排程即可
  • 沒有分散式的管理/呼叫開銷

  這些優點是顯著的,它們能給人帶來明確的掌控感覺,而不是不可控的飄渺虛無感。

  然而,它的缺點也是非常明顯的,想想我們現在大部分的專案,伴隨著越來越快的網際網路資訊時代,業務要的就是靈活變動和快速上線,針對於靈活和快速,單體應用是無法提供的。

  缺點

  • 開發效率低:系統龐大複雜,沒人能理解全部,且所有的開發在一個專案改程式碼,程式碼衝突不斷
  • 程式碼維護難:程式碼功能耦合在一起,牽一髮動全身
  • 部署不靈活:構建時間長,任何小修改必須重新構建整個專案,這個週期往往很長
  • 穩定性不高:系統缺乏故障隔離,一個微不足道的小問題,可以導致整個應用掛掉 

  可以肯定的是,一旦你的應用變成一個又大又複雜的怪物,那開發團隊肯定很痛苦。敏捷開發和部署舉步維艱,每次的開發都會引出其他問題,因為它們的耦合性太強了。

  其中最主要問題就是這個應用太複雜,以至於任何單個開發者都不可能搞懂它。因此,修正bug和正確的新增新功能變的非常困難,並且很耗時。

  另外,團隊士氣也會走下坡路。如果程式碼難於理解,就不可能被正確的修改,最終會走向巨大的、不可理解的泥潭。

  所以在這時,很多人把目光投向了微服務。

  微服務  

  由來

  首先任何的技術不會平白無故的出現,它們的出現,是某些痛點一直在困擾著大多數人,所以這些技術的出現,都是有特定背景的。

  從上面來看,有訴求才會有發展,沒有單體式應用的痛點折磨,沒有分散式系統的鋪墊,沒有自動化工具的應用,是不可能出現所謂的微服務的,所以我們可以說,微服務架構是演進過來的。

  微服務是一種架構風格

  微服務在Chris口中,是一種架構設計風格,而在國內,更多的開發者視之為具體的某個服務,所以我們通常的說法是“一個微服務”,按照Chris自己的說法,系統是採用了微服務架構設計風格,由若干個服務構成,這才是一個完整的微服務。

  “微”服務

  微服務這個術語讓我們很多人錯誤的將關注點聚焦在“微”上,它暗示著我們服務的顆粒度是應該非常小的。

  實際上,大小不是一個重要的考慮因素。

  細想一下微服務的進化鋪墊,我們為什麼要拆服務?是由於單體應用的臃腫龐大且耦合性過高的特性。所以我們在拆分的過程中,更多的考慮方面是在如何避免單體應用的耦合問題,不然拆出來的一樣是一個相互牽扯的單體微應用,所以我們的關注點應該是在每個服務的鬆散耦合上,確定好它的邊界,讓每個服務能做到真正的鬆耦合,而不僅僅是大小問題。

  誠然,小服務確實是維護性更高。但我們微服務的目標,更多的是定義我們的工作方式,比如定義為可由小團隊自主開發,並且交付時間短,與其他團隊協作少,不會相互影響的工作方式。

  所以我們服務的設計和定義,需遵循我們的目標法則去規劃的,而這個法則就是服務內的高內聚和服務間的低耦合

  微服務架構通過把一些小的,鬆耦合的服務組織在一起,重新定義了我們的應用,這樣的結果是提升了我們開發階段的效率,特別是可維護性,可測試性和可部署性,通過這樣的方式影響著團隊的效率提升。

   服務的本質

  每個構成微服務架構體系的服務,本質都是一個可獨立執行的應用程式。

  這個服務是由一組邊界清晰,高內聚的職責組成,而且它可以做自己的負載均衡,獨立部署,獨立釋出,能夠快速脫離單體應用的侷限性快速上線。

  這也是微服務的優勢所在,只要做到介面相容或者版本相容,不必做過多的服務依賴。  

  優點

  微服務的優點眾多,但我認為它最重要的是改變著我們的工作方式,如:

  • 更加契合敏捷開發

  我們知道,敏捷開發這種軟體工程方法已經在很多公司中採用了,敏捷開發的意義在於更快速的交付可執行版本以及迭代做功能最小閉環,它是這個資訊時代的必然產物。當我們採用微服務時,在團隊自治的同時,意味著更快速的開發和交付。

  敏捷開發帶來的不僅僅是開發模式上的改變,也帶來了組織結構的變化,衍生出更多的小團隊自治,小團隊實施敏捷開發,帶來更快的功能迭代和獨立釋出,即使出現問題也不會影響整個應用。

  • Devops文化的推廣

  在Neal Ford的微服務理念中,Microservices are the first post DevOps revolution architecture,DevOps所涵蓋的一系列文化和理念,是微服務演進過程中必不可少的先決條件。

  微服務的流行,更好的推動了Devops文化,它們是相輔相成的。  

  比較確定的說,在傳統的運維模式下,是很難有效實現微服務架構的,因為微服務在治理層面需要自動化基礎設施、自動化部署、自動化驗證、以及利用有效的工具完成運維、監控、告警等。而只有將DevOps與微服務緊密的結合起來,才能達到事半功倍的效果。

  • 技術棧的選擇

  當我們採用單體服務時,它所使用的程式語言就已經確定了,但微服務支援使用不同的語言開發,允許你選擇合適的技術棧。

  我們的企業發展能存活的根本是什麼?就是能賺錢才能活下去,換言之也就是對成本的控制。當我們能夠採用適合自己的成本投入方式,在各個環節和服務採用最合適的技術棧,能夠給企業的投入成本做一定的保障。 

  • 組織結構的變化

  組織結構變化會給我們帶來什麼好處?

  其實我們一直在暗示著,服務的職責要單一,做到專,然而這個專並不僅僅在服務的職責層面上,還有在組織結構上, 微服務勢必會影響到我們的中臺戰略能力,所以我們更需要不同的組專注於不同的技術和業務。

  簡單點說,讓專業的人做專業的事!這樣才能更好的提高整體的生產效率,而不是事事都有牽絆。

  • 雲生態下的新技術衝擊

  這個似乎並不是優點,但我相信對很多人來說,這又確切是個優點,因為這些技術對所有有技術抱負的人來說,造就了一個很好的時代。  

  當我們採用微服務時,目光已經不能僅侷限於應用層面的開發了,容器化,服務編排工具,服務網格,雲原生等新生的技術,讓我們知道如何更好的治理好自己的服務群,支撐自己的服務更好的擴充套件。  

   挑戰

  •  微服務本質上是分散式系統,所以在分散式系統中遇到的難點,在微服務中都會遇到,分散式系統程式間的通訊保證,網路開銷以及事務處理從來都是難題
  •  微服務的流行,離不開容器化和雲生態,離不開gRPC,ServiceMesh,雲原生等新技術的崛起以及實際生產應用。換言之,你需要了解乃至熟知這些技術,畢竟傳統的單體應用只需要更多的專注於應用層面
  •  微服務架構帶來過多的運維操作,需要團隊具備一定的 DevOps 技能,在運維層面開銷會很大
  •    治理中心(包括基礎設施架構,集合著CICD,監控等微服務必要的非功能性需求)
  •    測試將會是非常難,因為它不再是端到端,還很大可能會存在多版本的不同服務帶來不同的測試場景

  這些挑戰,分析一下本質,就是對人的要求更高了,所以說採用微服務並不僅僅是技術層面帶來的衝擊,更多的是對人帶來的思想/能力衝擊。

  微服務的解剖

  在實踐微服務的過程中,可以劃分為三部曲:

  1. 服務劃分
  2. 服務開發
  3. 服務治理

  這三部也是涵蓋了微服務架構落地的全部步驟,每一步都會有不同的指導方法論用於區別於傳統的開發思想,後續將會基於這些步驟結合流行的方法學來指導我們服務落地。

  總結

  微服務不是銀彈! 

  我特別喜歡說的一句話是:任何的技術,都是有適用場景的。所以我很喜歡看到那些能基於目前的痛點以及中長期的發展所面臨的問題分析, 對比單體架構和微服務架構帶來的收益比。

  我們需要的是思考技術能帶來的價值,而不是為技術瘋狂。

  任何的技術手段,都是用來服務業務的,能支撐業務創造價值的,才是好技術,否則這些技術一文不值。

  不管黑貓白貓,捉到老鼠的就是好貓!  

  微服務架構也不例外。

  所以當你想要採用微服務時,問一下自己這些問題:

  • 為什麼團隊想要採用微服務?採用後團隊將能得到什麼?(說明充分了解了單體/微服務的優缺點,並能清晰瞭解到業務以及團隊在中長期所面臨的問題點)
  • 是否組織結構以及文化底蘊有一定的支撐?(團隊是否能經得起微服務所帶來的衝擊)
  • 是否有一定的技術基礎支撐?(說明能對微服務的所面臨的技術挑戰有了一定的認識) 

  當你能做到對以上問題都有清晰答案後,且仍然決定採用微服務架構,說明你已經對微服務所帶來的收益比有了自己的判斷。 

  Last but not least

  在將組織推向微服務道路之前,最重要的決策人理解了“為什麼是微服務”,而不是“為什麼不是微服務”。

相關文章