Re:從0開始的微服務架構:(一)重識微服務架構--轉
原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage
導語
雖然已經紅了很久,但是“微服務架構”正變得越來越重要,也將繼續火下去。
各個公司與技術人員都在分享微服務架構的相關知識與實踐經驗,但我們發現,目前網上的這些相關文章中,要麽上來就是很有借鑒意義的幹貨,要麽就是以高端的專業術語來講述何為微服務架構。就是沒有一個做到成熟地將技術傳播出來,同時完美地照顧“初入微服務領域人員”,從0開始,采用通俗易懂的語言去講解微服務架構的系列。
所以,我們邀請青柳雲的蘇槐與InfoQ一起共建微服務架構專題“Re:從0開始的微服務架構”,為還沒有入門該領域的技術人員開路,也幫助微服務架構老手溫故知新。
這是專題的第一篇文章,從最基礎的地方入手,讓我們重識微服務架構。
前言
得益於2013年Docker的誕生,微服務概念及架構的推廣和落地變得更加的可靠和方便。在2016年及之前,微服務架構的討論更多的是活躍於互聯網企業及社區。現如今,隨著Docker和微服務架構組件與Docker等相關技術的逐步成熟,微服務架構已然步入傳統企業及傳統行業。
但是,程序員作為一個理性消費的群體,需要冷靜地思考,避免挖個大坑把自己給埋了。所以,我們需要冷靜地搞清楚:微服務(架構)是什麽?它有什麽優勢劣勢?我們為什麽需要采用微服務架構?如何讓老板接受這一新技術?如何落地?如何升級維護?等等……
我們在過去7年智慧城市的建設過程中,研發和交付了很多的大型項目,踩過很多的坑,趟過很多的雷,深受傳統建設方法之苦,也深深被微服務架構帶來的好處所感動,我們也將在微服務架構這條路的繼續前行。在這裏,將我們研發過程中的一些思考和心得分享給大家,供大家參考。
也許,在不久的將來,軟件開發只需要組裝,不再需要從頭開發。
(點擊放大圖像)
什麽是微服務架構?
形像一點來說,微服務架構就像搭積木,每個微服務都是一個零件,並使用這些零件組裝出不同的形狀。通俗來說,微服務架構就是把一個大系統按業務功能分解成多個職責單一的小系統,並利用簡單的方法使多個小系統相互協作,組合成一個大系統。
如果學科派一點,微服務架構就是把因相同原因而變化的功能聚合到一起,而把因不同原因而變化的功能分離開,並利用輕量化機制(通常為HTTP RESTful API)實現通信。
追本溯源,Martin Folwer對微服務架構的定義是:
(點擊放大圖像)
微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。每個服務運行在其獨立的進程中,服務與服務間采用輕量級的通信機制互相協作(通常是基於HTTP協議的RESTful API)。每個服務都圍繞著具體業務進行構建,並且能夠被獨立的部署到生產環境、類生產環境等。另外,對具體的服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建 。(摘自王磊先生的《微服務架構與實踐》)
對於我個人,我更喜歡一種延續性的解釋,微服務架構 ≈ 模塊化開發 + 分布式計算。不管微服務架構的定義怎麽樣,都是在描述一個核心思想:把大系統拆分成小型系統,把大事化小,以降低系統的復雜性,從而大幅降低系統建設、升級、運維的風險和成本。
順帶提一下,亞馬遜創始人Jeff Bezos在2002年就說過:所有團隊的模塊都要以Service Interface的方式將數據和功能開放出來。不這樣做的人會被炒魷魚。這才是思路超前的大牛。
(點擊放大圖像)
需要註意的是“微服務”與“微服務架構”是有本質區別的。“微服務”強調的是服務的大小,它關註的是某一個點。而“微服務架構”則是一種架構思想,需要從整體上對軟件系統進行通盤的考慮。
Chris Richardson說:“微服務”是一個很糟糕的名字,它導致開發人員創建了許多粒度很小的服務,每個服務擁有一個單獨的REST端點。不僅如此,這個名字還暗示了微服務在開發者心目中的重要位置。例如,人們會說“我們可以用微服務來解決這個問題”;我也看到了越來越多的“某某微服務框架”,而實際上,這些框架跟微服務架構不一定有太多聯系,它們只是簡單的Web框架。使用“微服務架構”這個名字會更恰當些。它是一種架構風格,它把一系列協作的服務組織成一個系統來支撐業務。
常見的微服務組件及概念
- 服務註冊,服務提供方將自己調用地址註冊到服務註冊中心,讓服務調用方能夠方便地找到自己。
- 服務發現,服務調用方從服務註冊中心找到自己需要調用的服務的地址。
- 負載均衡,服務提供方一般以多實例的形式提供服務,負載均衡功能能夠讓服務調用方連接到合適的服務節點。並且,節點選擇的工作對服務調用方來說是透明的。
- 服務網關,服務網關是服務調用的唯一入口,可以在這個組件是實現用戶鑒權、動態路由、灰度發布、A/B測試、負載限流等功能。
- 配置中心,將本地化的配置信息(properties, xml, yaml等)註冊到配置中心,實現程序包在開發、測試、生產環境的無差別性,方便程序包的遷移。
- API管理,以方便的形式編寫及更新API文檔,並以方便的形式供調用者查看和測試。
- 集成框架,微服務組件都以職責單一的程序包對外提供服務,集成框架以配置的形式將所有微服務組件(特別是管理端組件)集成到統一的界面框架下,讓用戶能夠在統一的界面中使用系統。
- 分布式事務,對於重要的業務,需要通過分布式事務技術(TCC、高可用消息服務、最大努力通知)保證數據的一致性。
- 調用鏈,記錄完成一個業務邏輯時調用到的微服務,並將這種串行或並行的調用關系展示出來。在系統出錯時,可以方便地找到出錯點。
- 支撐平臺,系統微服務化後,系統變得更加碎片化,系統的部署、運維、監控等都比單體架構更加復雜,那麽,就需要將大部分的工作自動化。現在,可以通過Docker等工具來中和這些微服務架構帶來的弊端。 例如持續集成、藍綠發布、健康檢查、性能健康等等。嚴重點,以我們兩年的實踐經驗,可以這麽說,如果沒有合適的支撐平臺或工具,就不要使用微服務架構。
一般情況下,如果希望快速地體會微服務架構帶來的好處,使用Spring Cloud提供的服務註冊(Eureka)、服務發現(Ribbon)、服務網關(Zuul)三個組件即可以快速入門。其它組件則需要根據自身的業務選擇性使用。
微服務架構有哪些優勢劣勢?
要談優勢,就一定要有對比,我們可以嘗試著從兩個維度來對比。
一、微服務架構與單體架構的對比
S/N | 對比點 | 微服務架構 | 單體架構 | 結論 |
1 | 上手難度 | API接口調用 | 數據庫共享或本地程序調用 | 單體架構勝 |
2.1 | 開發效率(簡單項目) | 早期設計和溝通的工作量加大,隨著項目規模和時間的推移,效率變化不大 | 早期工作量小,隨著項目規模和時間的推移,效率大幅度下降 | 單體架構勝 |
2.2 | 開發效率(復雜項目) | 早期設計和溝通的工作量加大,隨著項目規模和時間的推移,效率變化不大 | 早期工作量小,隨著項目規模和時間的推移,效率大幅度下降 | 微服務架構勝 |
3 | 系統設計(高內聚低耦合) | 每個業務單獨包裝成一個微服務,數據和代碼都從物理上隔離開來,實現高內聚低耦合相對容易 | 以包的形式對代碼進行模塊劃分,控制得當即可實現高內聚。但最終都是在數據層面將整個系統耦合在一起 | 微服務架構勝 |
4 | 系統設計(擴展性) | 獨立開發新模塊,通過API與現有模塊交互 | 在現有系統上修改,與現存業務邏輯高度耦合 | 微服務架構勝 |
5 | 需求變更響應速度 | 各個微服務組件獨立變更,容易實施敏捷開發方法 | 需要了解整個系統才可以正確修改,容易導致不相關模塊的意外失敗 | 微服務架構勝 |
6 | 系統升級效率 | 各個微服務組件獨立升級,上手和開發效率高,影響面小 | 需要了解整個系統才可以正確修改,容易導致不相關模塊的意外失敗 | 微服務架構勝 |
7 | 運維效率 | 大系統被拆分為多個小系統,部署和運維難度加大,但可以利用DevOps等方式將運維工作自動化 | 簡單直接 | 單體架構勝 |
8 | 知識積累 | 微服務組件可以在新項目中直接復用,包括前端頁面 | 一般以共享庫的形式復用後臺代碼 | 微服務架構勝 |
9.1 | 硬件需求(簡單項目) | 一個系統需部署多個微服務,需要啟動多個運行容器 | 整個系統只需要一個運行容器 | 單體架構勝 |
9.2 | 硬件需求(高要求項目) | 按需為不同業務模塊伸縮資源節點 | 為整個系統分配資源,導致冗余 | 微服務架構勝 |
10.1 | 項目成本(簡單系統) | 項目早期和後期,成本變化曲線平緩 | 項目早期成本低,後期成本大 | 單體架構勝 |
10.2 | 項目成本(復雜系統) | 項目早期和後期,成本變化曲線平緩 | 項目早期成本低,後期成本大 | 微服務架構勝 |
11 | 非功能需求 | 為單獨的微服務按需調優,甚至更換實現方式和程序語言 | 為整個系統調優,牽一發而動全身 | 微服務架構勝 |
12 | 職責、成就感 | 擁有明確的職責劃分,主人翁意識和成就感加強,容易形成自組織型團隊 | 職責不明確,容易產生扯皮行為 | 微服務架構勝 |
13 | 風險 | 大系統被拆分為小系統,風險可被控制在小系統內,但也引入了各小系統之間的交互風險 | 系統是一個整體,一榮俱榮,一損俱損 | 微服務架構勝 |
結論:
對於簡單項目來說,單體架構5勝8敗。(優勢項:開發效率、上手難度、運維效率、硬件需求、項目成本;劣勢項:系統設計(高內聚低耦合)、系統設計(擴展性)、需求變更響應速度、系統升級效率、知識積累、非功能需求、職責、成就感、風險)
對於復雜項目來說,單體架構2勝11敗。(優勢項:上手難度、運維效率;劣勢項:硬件需求、項目成本、開發效率、系統設計(高內聚低耦合)、系統設計(擴展性)、需求變更響應速度、系統升級效率、知識積累、非功能需求、職責、成就感、風險;)
二、微服務與共享庫的對比
註:這裏以使用方自行安裝微服務為場景來比較。這裏的共享庫指的是像Java中的公共jar依賴。
S/N | 對比點 | 微服務 | 共享庫 | 結論 |
1 | 易用性 | 整體安裝 + API調用 | 共享庫引用 + 本地調用 | 平手 |
2 | 程序耦合度 | 微服務為完整的業務邏輯單元,通過API的形式為其它模塊提供服務 | 在使用方的源代碼中引用共享庫的類和方法 | 平手 |
3 | 版本升級 | 單獨升級,其它模塊無感知 | 修改源代碼,升級使用方的代碼版本,例如pom.xml, build.gradle | 微服務架構勝 |
4 | Bug修復 | 單獨升級,自動生效 | 修改源代碼,升級使用方的代碼版本,例如pom.xml, build.gradle | 微服務架構勝 |
5 | 非功能需求 | 為單獨的微服務優化或擴縮容;在需求更高的情況下,可以重新設計或使用不同的程序語言 | 為整個業務系統優化或擴縮容,共享庫的程序語言必須和業務系統的程序語言相同 | 微服務架構勝 |
6 | 復用程度 | 可以復用從前端頁面到後臺數據庫的整個業務邏輯和代碼 | 可以復用後臺代碼和數據庫,但程序語言需要和業務系統保持一致 | 微服務架構勝 |
什麽場景需要用微服務架構?
看了上面的比較,微服務架構可以說是以壓倒性的優勢勝過單體架構和共享庫,會讓人產生一種錯覺,微服務架構就是軟件開發中的銀彈。
但是,正如大家所了解的,軟件研發是一個系統工程,它沒有銀彈,不能夠一招鮮吃遍天。正如當年的CMMI和敏捷方法一樣,敏捷雖好,但它不一定能適用於所有的場景,它對組織環境、團隊氛圍、溝通方式、技術能力這些都是有一些要求的,如果用不好,反而會帶來一些負面影響。
那麽,我們什麽時候需要采用微服務呢?從我個人的經驗來看,我認為有三種場景可以考慮使用微服務。
- 規模大(團隊超過10人)
- 業務復雜度高(系統超過5個子模塊)
- 需要長期演進(項目開發和維護周期超過半年)
這裏借一張圖來說明:
(點擊放大圖像)
橫軸是復雜度,縱軸是生產效率。從生產效率的角度來講,在兩條曲線的交叉點之前,單體架構是占優勢的,過了交叉點之後,單體架構的生產效率將大幅度下降。
所以很多專家和同行朋友都說,我們可以在開始的時候先使用單體架構,當業務發展到一定程度的時候,再重構成微服務架構。對於這一點,我是持保留意見的,因為在實踐中,架構改造的難度還是很大的,會有一些問題,例如:
- 客戶或業務部門是否給我們這樣的時間窗口?
- 這段時間的研發經費是否有出處?
- 項目負責人或技術團隊是否有主動的意願進行架構升級?
- 項目負責人或技術團隊是否願意為架構升級帶來的不穩定風險負責?
我們常常聽到的一句話是:暫時先這樣,等我們沒這麽忙的時候,再來優化一下。但是,絕大多數情況下,這一天從來沒有出現過。
再想想年初,我們的私有雲平臺經過2年多的發展,已經包含了容器服務平臺(PaaS)、API網關、監控平臺、定時任務平臺、數據庫管理、用戶權限管理等等十多個基礎模塊,也包含了一些為上層應用服務提供的日誌服務、緩存服務、消息服務等等。並且,部署到了二十多個客戶的生產環境裏。可悲的是,我們支撐了很多的業務系統的微服務化,但平臺本身任然是一個單體系統。
我們也深深地感受到了平臺往前發展的阻力:
- 很多時候,客戶需要的不是一個大而全的平臺,他們希望按他們的意願采購需要的模塊。
- 新人進入團隊後,從熟悉到動手產出的時間偏長。
- 其它研發團隊有一些比較好的組件能滿足平臺產品的需求,卻不能直接拿來用。
- 兩個不同的模塊之間產生了不該出現的耦合關系,導致意想不到的Bug。
所以,春節過後,大家開了一個會,決定將平臺微服務化。而帶來的代價就是要說服老板給我們兩個月時間來重構。
幸運的是,我們很快得到了老板的支持,並且重構工作比較順利;不幸的是,那二十多個客戶的生產環境的升級非常麻煩,每升級一個客戶都得花上一周左右的時間,至今也才升級了一小部分。
所以,理想的情況下,我建議在項目初期的時候就從上面提到的三點做好評估,到底采用哪種架構形式是符合項目具體情況的。
當然,如果真的有朋友想將歷史悠久的單體架構升級到微服務架構,我建議先從邊緣邏輯開始,逐步逐步地將業務邏輯從單體系統裏剝離出來。我沒有這方面的經驗,但可以想象,這將是一個非常長期和痛苦的過程。
下篇文章
下篇文章分享一下微服務架構的簡單模式。
(點擊放大圖像)
Re:從0開始的微服務架構:(一)重識微服務架構--轉