國內BAT一線架構師十年經驗之談微服務

在過去 7 年智慧城市的建設過程中,研發和交付了很多的大型項目,踩過很多的坑,趟過很多的雷,深受傳統建設方法之苦,也深深被微服務架構帶來的好處所感動,我們也將在微服務架構這條路的繼續前行。在這裡,將我們研發過程中的一些思考和心得分享給大家,供大家參考。

也許,在不久的將來,軟件開發只需要組裝,不再需要從頭開發。

國內BAT一線架構師十年經驗之談微服務

什麼是微服務架構?

形像一點來說,微服務架構就像搭積木,每個微服務都是一個零件,並使用這些零件組裝出不同的形狀。通俗來說,微服務架構就是把一個大系統按業務功能分解成多個職責單一的小系統,並利用簡單的方法使多個小系統相互協作,組合成一個大系統。

如果學科派一點,微服務架構就是把因相同原因而變化的功能聚合到一起,而把因不同原因而變化的功能分離開,並利用輕量化機制(通常為 HTTP RESTful API)實現通信。

追本溯源,Martin Folwer 對微服務架構的定義是:

國內BAT一線架構師十年經驗之談微服務

微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。每個服務運行在其獨立的進程中,服務與服務間採用輕量級的通信機制互相協作(通常是基於 HTTP 協議的 RESTful API)。每個服務都圍繞著具體業務進行構建,並且能夠被獨立的部署到生產環境、類生產環境等。另外,對具體的服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建 。(摘自王磊先生的《微服務架構與實踐》)

對於我個人,我更喜歡一種延續性的解釋,微服務架構 ≈ 模塊化開發 + 分佈式計算。不管微服務架構的定義怎麼樣,都是在描述一個核心思想:把大系統拆分成小型系統,把大事化小,以降低系統的複雜性,從而大幅降低系統建設、升級、運維的風險和成本。

順帶提一下,亞馬遜創始人 Jeff Bezos 在 2002 年就說過:所有團隊的模塊都要以 Service Interface 的方式將數據和功能開放出來。不這樣做的人會被炒魷魚。這才是思路超前的大牛。

國內BAT一線架構師十年經驗之談微服務

需要注意的是 “微服務”“微服務架構” 是有本質區別的。“微服務”強調的是服務的大小,它關注的是某一個點。而“微服務架構”則是一種架構思想,需要從整體上對軟件系統進行通盤的考慮。

Chris Richardson 說:“微服務”是一個很糟糕的名字,它導致開發人員創建了許多粒度很小的服務,每個服務擁有一個單獨的 REST 端點。不僅如此,這個名字還暗示了微服務在開發者心目中的重要位置。例如,人們會說“我們可以用微服務來解決這個問題”;我也看到了越來越多的“某某微服務框架”,而實際上,這些框架跟微服務架構不一定有太多聯繫,它們只是簡單的 Web 框架。使用“微服務架構”這個名字會更恰當些。它是一種架構風格,它把一系列協作的服務組織成一個系統來支撐業務。

常見的微服務組件及概念

  1. 服務註冊,服務提供方將自己調用地址註冊到服務註冊中心,讓服務調用方能夠方便地找到自己。
  2. 服務發現,服務調用方從服務註冊中心找到自己需要調用的服務的地址。
  3. 負載均衡,服務提供方一般以多實例的形式提供服務,負載均衡功能能夠讓服務調用方連接到合適的服務節點。並且,節點選擇的工作對服務調用方來說是透明的。
  4. 服務網關,服務網關是服務調用的唯一入口,可以在這個組件是實現用戶鑑權、動態路由、灰度發佈、A/B 測試、負載限流等功能。
  5. 配置中心,將本地化的配置信息(properties, xml, yaml 等)註冊到配置中心,實現程序包在開發、測試、生產環境的無差別性,方便程序包的遷移。
  6. API 管理,以方便的形式編寫及更新 API 文檔,並以方便的形式供調用者查看和測試。
  7. 集成框架,微服務組件都以職責單一的程序包對外提供服務,集成框架以配置的形式將所有微服務組件(特別是管理端組件)集成到統一的界面框架下,讓用戶能夠在統一的界面中使用系統。
  8. 分佈式事務,對於重要的業務,需要通過分佈式事務技術(TCC、高可用消息服務、最大努力通知)保證數據的一致性。
  9. 調用鏈,記錄完成一個業務邏輯時調用到的微服務,並將這種串行或並行的調用關係展示出來。在系統出錯時,可以方便地找到出錯點。
  10. 支撐平臺,系統微服務化後,系統變得更加碎片化,系統的部署、運維、監控等都比單體架構更加複雜,那麼,就需要將大部分的工作自動化。現在,可以通過 Docker 等工具來中和這些微服務架構帶來的弊端。 例如持續集成、藍綠髮布、健康檢查、性能健康等等。嚴重點,以我們兩年的實踐經驗,可以這麼說,如果沒有合適的支撐平臺或工具,就不要使用微服務架構。

一般情況下,如果希望快速地體會微服務架構帶來的好處,使用 Spring Cloud 提供的 服務註冊(Eureka)服務發現(Ribbon)服務網關(Zuul) 三個組件即可以快速入門。其它組件則需要根據自身的業務選擇性使用。

那麼,我們什麼時候需要採用微服務呢?

我個人的經驗來看,我認為有三種場景可以考慮使用微服務。

  1. 規模大(團隊超過 10 人)
  2. 業務複雜度高(系統超過 5 個子模塊)
  3. 需要長期演進(項目開發和維護週期超過半年)

這裡借一張圖來說明:

國內BAT一線架構師十年經驗之談微服務

橫軸是複雜度,縱軸是生產效率。從生產效率的角度來講,在兩條曲線的交叉點之前,單體架構是佔優勢的,過了交叉點之後,單體架構的生產效率將大幅度下降。

所以很多專家和同行朋友都說,我們可以在開始的時候先使用單體架構,當業務發展到一定程度的時候,再重構成微服務架構。對於這一點,我是持保留意見的,因為在實踐中,架構改造的難度還是很大的,會有一些問題,例如:

  • 客戶或業務部門是否給我們這樣的時間窗口?
  • 這段時間的研發經費是否有出處?
  • 項目負責人或技術團隊是否有主動的意願進行架構升級?
  • 項目負責人或技術團隊是否願意為架構升級帶來的不穩定風險負責?

我們常常聽到的一句話是:暫時先這樣,等我們沒這麼忙的時候,再來優化一下。但是,絕大多數情況下,這一天 從來沒有出現過

再想想年初,我們的私有云平臺經過 2 年多的發展,已經包含了容器服務平臺(PaaS)、API 網關、監控平臺、定時任務平臺、數據庫管理、用戶權限管理等等十多個基礎模塊,也包含了一些為上層應用服務提供的日誌服務、緩存服務、消息服務等等。並且,部署到了二十多個客戶的生產環境裡。可悲的是,我們支撐了很多的業務系統的微服務化,但平臺本身任然是一個單體系統。

我們也深深地感受到了平臺往前發展的阻力:

  • 很多時候,客戶需要的不是一個大而全的平臺,他們希望按他們的意願採購需要的模塊。
  • 新人進入團隊後,從熟悉到動手產出的時間偏長。
  • 其它研發團隊有一些比較好的組件能滿足平臺產品的需求,卻不能直接拿來用。
  • 兩個不同的模塊之間產生了不該出現的耦合關係,導致意想不到的 Bug。

所以,春節過後,大家開了一個會,決定將平臺微服務化。而帶來的代價就是要說服老闆給我們兩個月時間來重構。

幸運的是,我們很快得到了老闆的支持,並且重構工作比較順利;不幸的是,那二十多個客戶的生產環境的升級非常麻煩,每升級一個客戶都得花上一週左右的時間,至今也才升級了一小部分。

所以,理想的情況下,我建議在項目初期的時候就從上面提到的三點做好評估,到底採用哪種架構形式是符合項目具體情況的。

當然,如果真的有朋友想將歷史悠久的單體架構升級到微服務架構,我建議先從邊緣邏輯開始,逐步逐步地將業務邏輯從單體系統裡剝離出來。我沒有這方面的經驗,但可以想象,這將是一個非常長期和痛苦的過程。

那如何學習才能快速入門並精通呢?

當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。

但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視頻課程用來跟著學習是非常有必要的。

為了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成為架構師的道路上披荊斬棘。

這套視頻課程,詳細講解了像(Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成為架構師必備的內容!

而且還把框架需要用到的各種程序進行了打包,根據基礎視頻可以讓你輕鬆搭建分佈式框架環境,像在企業生產環境一樣進行學習和實踐。

國內BAT一線架構師十年經驗之談微服務

後臺私信回覆“架構” 就可以馬上免費獲得這套價值一萬八的內部教材!

最後,做一個愛思考,懂思考,會思考的程序員。


分享到:


相關文章: