1. 程式人生 > >成小胖學習微服務架構·基礎篇

成小胖學習微服務架構·基礎篇

看到最近“微服務架構”這個概念這麼火,作為一個積極上進的程式猿,成小胖忍不住想要學習學習。而架構師老王(不是隔壁老王)最近剛好在做公司基礎服務的微服務化研究和落地,對此深有研究。

於是成小胖馬上屁顛屁顛的跑過去向老王請教:“王哥,我看微服務架構這麼火,我也想學,您給我講講啥是微服務架構唄?”

老王笑了笑說:“要想知道什麼是微服務架構,你得先知道什麼系統架構設計。”

成小胖的理想是成為一名架構師,平時積累了不少知識,因此對“系統架構設計”這個概念還是很熟悉的,因此他馬上就給出了答案【1】

系統架構設計描述了在應用系統的內部,如何根據業務、技術、組織、靈活性、可擴充套件性以及可維護性等多種因素,將應用系統劃分成不同的部分,並使這些部分彼此之間相互分工、相互協作,從而為使用者提供某種特定的價值的方式。

老王滿意的點點頭,繼續問:“你看最近我在做微服務的研究和落地,你知道為什麼要做這個事情嗎?”

“因為目前的三層架構存在很多弊端,不滿足業務發展的需求了唄。”

“對的,我看你對公司目前的架構也非常熟悉了,你來仔細說說現在的三層架構吧。”

於是成小胖拿了一張A4紙,圖文並茂地給老王講了他對三層架構的理解

三層架構是指在業務和技術的發展過程中,系統中不同職責的部分被定義在不同的層次,每一層負責的功能更加具體化。三層架構通常包括表示層、業務邏輯層和資料訪問層,層與層之間互相連線、互相協作,構成一個整體,並且層的內部可以被替換成其他可以工作的部分,但對整體的影響不大。

以 Web 應用程式為例,早期是將所有的表示邏輯、業務邏輯和資料訪問邏輯放在一起,這就是一層架構。

後來隨著 java、.NET 等高階語言的發展,提供了越來越方便的資料訪問機制,如 java 的 JDBC 和 .NET 的 ADO.NET。這時資料訪問部分被分離開來,形成了二層架構。

再後來,隨著面向物件設計、企業架構模式等理念的不斷髮展,表示邏輯和業務邏輯也被分離開來,形成了現在的三層架構。

三層架構的具體內容如下:

  • 表示層: 使用者使用應用程式時,看到的、聽見的、輸入的或者互動的部分。
  • 業務邏輯層: 根據使用者輸入的資訊,進行邏輯計算或者業務處理的部分。
  • 資料訪問層: 關注有效地操作原始資料的部分,如將資料儲存到儲存介質(如資料庫、檔案系統)及從儲存介質中讀取資料等。

老王對這個解釋非常滿意,作了進一步的補充:“你看雖然現在程式被分成了三層,但只是邏輯上的分層,並不是物理上的分層。也就是說,對不同層的程式碼而言,經過編譯、打包和部署後,所有的程式碼最終還是執行在同一個程序中。而這,就是所謂的單塊架構。”

成小胖撓了撓頭:“原來單塊架構是這個意思啊~~”

“嗯。根據你的實際工作經驗,你再總結下單塊架構的優缺點吧。”

平時勤於總結的成小胖很快便列出了單塊架構的優缺點:

 優點:

  • 易於開發: 開發方式簡單,IDE 支援好,方便執行和除錯。
  • 易於測試: 所有功能執行在一個程序中,一旦程序啟動,便可以進行系統測試。
  • 易於部署: 只需要將打好的一個軟體包釋出到伺服器即可。
  • 易於水平伸縮: 只需要建立一個伺服器節點,配置好執行時環境,再將軟體包釋出到新伺服器節點即可執行程式(當然也需要採取分發策略保證請求能有效地分發到新節點)。

缺點:

  • 維護成本大: 當應用程式的功能越來越多、團隊越來越大時,溝通成本、管理成本顯著增加。當出現 bug 時,可能引起 bug 的原因組合越來越多,導致分析、定位和修復的成本增加;並且在對全域性功能缺乏深度理解的情況下,容易在修復 bug 時引入新的 bug。
  • 持續交付週期長: 構建和部署時間會隨著功能的增多而增加,任何細微的修改都會觸發部署流水線。
  • 新人培養週期長: 新成員瞭解背景、熟悉業務和配置環境的時間越來越長。
  • 技術選型成本高: 單塊架構傾向於採用統一的技術平臺或方案來解決所有問題,如果後續想引入新的技術或框架,成本和風險都很大。
  • 可擴充套件性差: 隨著功能的增加,垂直擴充套件的成本將會越來越大;而對於水平擴充套件而言,因為所有程式碼都執行在同一個程序,沒辦法做到針對應用程式的部分功能做獨立的擴充套件。

老王拍了拍成小胖的肩膀,眼睛眯成了一條縫:“小夥子總結的很不錯!既然你已經對目前的單塊架構的優缺點有了很好的理解,那現在咱們就可以開始來學習微服務架構了。”

老王先從網上搜索“微服務架構”關鍵字,出來這麼一段話:

微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。每個服務執行在其獨立的程序中,服務於服務間採用輕量級的通訊機制互相溝通(通常是基於 HTTP 的 RESTful API)。每個服務都圍繞著具體業務進行構建,並且能夠被獨立地部署到生產環境、類生產環境等。另外,應儘量避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建。

成小胖看完了這段話,說:“看著有點暈,雲裡霧裡的感覺……”

老王嘿嘿一笑:“莫慌,現在就給你詳細講講微服務架構的特性。” 

1. 單一職責

微服務架構中的每個服務,都是具有業務邏輯的,符合高內聚、低耦合原則以及單一職責原則的單元,不同的服務通過“管道”的方式靈活組合,從而構建出龐大的系統。

2. 輕量級通訊

服務之間通過輕量級的通訊機制實現互通互聯,而所謂的輕量級,通常指語言無關、平臺無關的互動方式。

對於輕量級通訊的格式而言,我們熟悉的 XML 和 JSON,它們是語言無關、平臺無關的;對於通訊的協議而言,通常基於 HTTP,能讓服務間的通訊變得標準化、無狀態化。目前大家熟悉的 REST(Representational State Transfer)是實現服務間互相協作的輕量級通訊機制之一。使用輕量級通訊機制,可以讓團隊選擇更適合的語言、工具或者平臺來開發服務本身。

3. 獨立性

每個服務在應用交付過程中,獨立地開發、測試和部署。

在單塊架構中所有功能都在同一個程式碼庫,功能的開發不具有獨立性;當不同小組完成多個功能後,需要經過整合和迴歸測試,測試過程也不具有獨立性;當測試完成後,應用被構建成一個包,如果某個功能存在 bug,將導致整個部署失敗或者回滾。

在微服務架構中,每個服務都是獨立的業務單元,與其他服務高度解耦,只需要改變當前服務本身,就可以完成獨立的開發、測試和部署。

4. 程序隔離

單塊架構中,整個系統執行在同一個程序中,當應用進行部署時,必須停掉當前正在執行的應用,部署完成後再重啟程序,無法做到獨立部署。

有時候我們會將重複的程式碼抽取出來封裝成元件,在單塊架構中,元件通常的形態叫做共享庫(如 jar 包或者 DLL),但是當程式執行時,所有元件最終也會被載入到同一程序中執行。

在微服務架構中,應用程式由多個服務組成,每個服務都是高度自治的獨立業務實體,可以執行在獨立的程序中,不同的服務能非常容易地部署到不同的主機上。

理論上所有服務可以部署在同一個伺服器節點,但是並不推薦這麼做,因為微服務架構的主旨就是高度自治和高度隔離。

“王哥你真厲害,您這麼一說我的思維清晰了很多!”成小胖激動的幾乎要叫起來。

“我之前瞭解過 SOA,好像跟微服務架構的思想很像啊,您能幫我區分一下嗎?”成小胖追問到。

老王嘿嘿一笑,拿起成小胖手上的A4紙,翻到另外一面畫了個表格:

SOA實現 微服務架構實現
企業級,自頂向下開展實施 團隊級,自底向上開展實施
服務由多個子系統組成,粒度大 一個系統被拆分成多個服務,粒度細
企業服務匯流排,集中式的服務架構 無集中式匯流排,鬆散的服務架構
整合方式複雜(ESB/WS/SOAP) 整合方式簡單(HTTP/REST/JSON)
單塊架構系統,相互依賴,部署複雜 服務能獨立部署

接著老王又畫了一張圖:

成小胖看了之後說:“您這麼一畫我倒是大概明白了,但是圖裡面的 DevOps 這個概念我不懂誒……”

“這個 DevOps 就說來話長了,有時間你自己先去查查資料瞭解下吧。”

“好的。現在我對微服務架構的概念有了瞭解,您能再深入剖析下它的本質嗎?”

“好,你可仔細聽好了哈!” 

1. 服務作為元件

微服務也可以被認為是一種元件,但是跟傳統元件的區別在於它可以獨立部署,因此它的一個顯著的優勢。另外一個優點是,它在元件與元件之間定義了清晰的、語言無關、平臺無關的規範介面,耦合度低,靈活性非常高。但它的不足之處是,分散式呼叫嚴重依賴於網路的可靠性和穩定性。

2. 圍繞業務組織團隊

在單塊架構中,企業一般會根據技能劃分團隊,在這種組織架構下,即便是簡單的需求變更都有可能需要跨團隊協作,溝通成本很高。而在微服務架構中,它提倡以業務為核心,按照業務能力來組織團隊,團隊中的成員具有多樣性的技能。

3. 關注產品而非專案

在單塊架構中,應用基本上是基於“專案模式”構建的,即專案啟動時從不同技能資源池中抽取相關資源組成團隊,專案結束後釋放所有資源。這種情況下團隊成員缺乏主人翁意識和產品成就感。

 

在微服務架構中,提倡採用“產品模式”構建,即更傾向於讓團隊負責整個服務的生命週期,以便提供更優質的服務。

 

4. 技術多樣性

微服務架構中,提倡針對不同的業務特徵選擇合適的技術方案,有針對性的解決具體業務問題,而不是像單塊架構中採用統一的平臺或技術來解決所有問題。

5. 業務資料獨立

微服務架構提供自主管理其相關的業務資料,這樣可以隨著業務的發展提供資料介面整合,而不是以資料庫的方式同其他服務整合。另外,隨著業務的發展,可以方便地選擇更合的工具管理或者遷移業務資料。

6. 基礎設施自動化

在微服務架構的實踐過程中,對持續交付和部署流水線的要求很高,將促進企業不斷尋找更高效的方式完成基礎設施的自動化及 DevOps 運維能力的提升。

聽完成小胖忍不住表達了敬佩之意:“老司機就是老司機,噢說錯了……架構師就是架構師,總結得這麼簡潔又深刻!”

“咳咳,低調低調……”

“聽您講解了這麼多,我覺得微服務架構解決了很多當前三層架構的痛點。不過我覺得沒有任何一項技術或架構是完美的。”

“非常正確。進行微服務架構的落地是存在很多挑戰的。” 

1. 分散式系統的複雜性

微服務架構是基於分散式的系統,而構建分散式系統必然會帶來額外的開銷。

  • 效能: 分散式系統是跨程序、跨網路的呼叫,受網路延遲和頻寬的影響。
  • 可靠性: 由於高度依賴於網路狀況,任何一次的遠端呼叫都有可能失敗,隨著服務的增多還會出現更多的潛在故障點。因此,如何提高系統的可靠性、降低因網路引起的故障率,是系統構建的一大挑戰。
  • 非同步: 非同步通訊大大增加了功能實現的複雜度,並且伴隨著定位難、除錯難等問題。
  • 資料一致性: 要保證分散式系統的資料強一致性,成本是非常高的,需要在 C(一致性)A(可用性)P(分割槽容錯性) 三者之間做出權衡。

2. 運維成本

運維主要包括配置、部署、監控與告警和日誌收集四大方面。微服務架構中,每個服務都需要獨立地配置、部署、監控和收集日誌,成本呈指數級增長。

3. 自動化部署

在微服務架構中,每個服務都獨立部署,交付週期短且頻率高,人工部署已經無法適應業務的快速變化。因此如何有效地構建自動化部署體系,是微服務面臨的另一個挑戰。

4. DevOps 與組織架構

在微服務架構的實施過程中,開發人員和運維人員的角色發生了變化,開發者將承擔起整個服務的生命週期的責任,包括部署和監控;而運維則更傾向於顧問式的角色,儘早考慮服務如何部署。因此,按需調整組織架構、構建全功能的團隊,也是一個不小的挑戰。

5. 服務間的依賴測試

單塊架構中,通常使用整合測試來驗證依賴是否正常。而在微服務架構中,服務數量眾多,每個服務都是獨立的業務單元,服務主要通過介面進行互動,如何保證依賴的正常,是測試面臨的主要挑戰。

6. 服務間的依賴管理

微服務架構中,服務數量眾多,如何清晰有效地展示服務間的依賴關係也是個不小的挑戰。

“微服務的落地需要經過全面的考察和完善的試驗,並不是每個場景都適合使用微服務架構,也不是每個企業都有能力或者精力去面對這些挑戰。”老王最後語重心長的說。

“嗯嗯,每件事都有兩面性,最合適的才是最好的!對了王哥,您已經給我上完理論課了,啥時候帶我實踐下唄?”

“你先好好消化完今天講的這些,下次再說吧……”

“好吧,很期待我們的下一次交流……”

【1】圖片源及內容主要參考《微服務架構與實踐》。

相關推薦

學習服務架構·基礎

看到最近“微服務架構”這個概念這麼火,作為一個積極上進的程式猿,成小胖忍不住想要學習學習。而架構師老王(不是隔壁老王)最近剛好在做公司基礎服務的微服務化研究和落地,對此深有研究。 於是成小胖馬上屁顛屁顛的跑過去向老王請教:“王哥,我看微服務架構這麼火,我也想學,您給我講講啥是微服務架構唄?” 老王笑了笑說

學習ActiveMQ·基礎

成小胖學習ActiveMQ·基礎篇 過了個春節,回到公司的成小胖變成了成大胖。但是你們千萬別以為他那個大肚子裡面裝的都是肥肉,裡面的墨水也多了不少嘞,畢竟成小胖利用春節的半個月時間專心學習並研究了 ActiveMQ,嘿嘿…… 這不,為了檢驗下自己的學習成果,上班的第一天成小胖就去找架構師老王交流

SpringCloud學習--服務架構

registry org 什麽 moni ima red 都是 html 小團隊 目錄     微服務架構快速指南     SOA     Dubbo     Spring Cloud     Dubbo與SpringCloud對比 微服務(Microservi

服務架構基礎之Service Mesh

ServiceMesh(服務網格) 概念在社群裡頭非常火,有人提出 2018 年是 ServiceMesh 年,還有人提出 ServiceMesh 是下一代的微服務架構基礎。 那麼到底什麼是 ServiceMesh?它的誕生是為了解決什麼問題?企業是否適合引入 ServiceMesh? 微服務架構的核心技

下一代的服務架構基礎是ServiceMesh?

今年,ServiceMesh(服務網格) 概念在社群裡頭非常火,有人提出 2018 年是 ServiceMesh 年,還有人提出 ServiceMesh 是下一代的微服務架構基礎。作為架構師,如果你現在還不瞭解 ServiceMesh 的話,是否感覺有點落伍了? 那麼到底什麼是 ServiceM

開發人員學習服務架構最容易犯五個的錯誤

當我們學習一項新技術或工具時,我們經常會依賴於我們以往的專案中經驗。然而,當我們學習最近很熱門的微服務時,我們以往的經驗可能卻都不管用了。在本文中,我們將討論專業開發人員在學習微服務主題時最容易犯的五個主要錯誤。錯誤#01 -將SOA和微服務混淆。儘管SOA和微服務都是系統架

Spring cloud 服務架構 Eureka

ring enabled 密碼 config lns 用戶 one ima nap 1 服務發現 ## 關於服務發現 在微服務架構中,服務發現(Service Discovery)是關鍵原則之一。手動配置每個客戶端或某種形式的約定是很難做的,並且很脆弱。Sprin

服務架構實戰(三):Spring boot2.0 + Mybatis + PageHelper實現增刪改查和分頁查詢功能

簡介 該專案主要利用Spring boot2.0 +Mybatis + PageHelper實現增刪改查和分頁查詢功能,快速搭建一套和資料庫互動的專案。 小工具一枚,歡迎使用和Star支援,如使用過程中碰到問題,可以提出Issue,我會盡力完善該Starter 版本基礎

服務架構實戰(四):Spring boot2.0 + Mybatis +Druid監控資料庫訪問效能

簡介 該專案主要利用Spring boot2.0 + Mybatis +Druid 實現監控資料庫訪問效能。 Druid是一個非常優秀的資料庫連線池。在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSour

服務架構實戰(二):Spring boot2.0 + Swagger2 讓你的API視覺化

簡介 該專案主要利用Spring boot2.0 +Swagger2 方便進行測試後臺的restful形式的介面,實現動態的更新,當我們在後臺的介面修改了後,swagger可以實現自動的更新,而不需要認為的維護這個介面進行測試。 原始碼地址 GitHub:https:

服務架構實戰(一):使用start.spring.io 構建SpringBoot2.0專案

簡介 該專案主要利用Spring 官方提供的線上專案腳手架來搭建SpringBoot 2.0的專案。 原始碼地址 GitHub:https://github.com/yundianzixun/spring-boot-starter 聯盟公眾號:IT實戰

Java架構學習(四十)SpringCloud基礎&網站架構演變&服務架構概述&SpringCloud概述&服務註冊與服務發現&搭建註冊中心Euraka&rest和fegin呼叫原理

一、網站架構演變過程 微服務架構 為什麼出現了SpringCloud 網站架構模式: 單點應用---->分散式系統面向於服務架構(SOA)體系 webservice---->微服務架構 web專案三層架構 如果在網際網路公司中,使用傳統架構技術

[轉]服務架構的理論基礎 - 康威定律

搭建 基礎 維系 接口 api pro 1.8 project 個人 轉自:https://yq.aliyun.com/articles/8611 概述 關於微服務的介紹,可以參考微服務那點事。 微服務是最近非常火熱的新概念,大家都在追,也都覺得很對,但是似乎沒有很充足的

服務架構基礎框架選擇:Spring Cloud還是Dubbo?

還需要 storm 選擇框架 依賴 通過 service 完整 國內開發 模塊化 最近一段時間不論互聯網還是傳統行業,凡是涉及信息技術範疇的圈子幾乎都在討論 微服務架構 。近期也看到各大技術社區開始組織一些沙龍和論壇來分享spring Cloud的相關實施經驗,這對於最

構建服務架構Spring Cloud:服務消費(基礎

成了 cloud framework shadow 即將 nbu 註冊中心 obj client 使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口,包括DiscoveryClient、這裏我們即將介紹

服務架構 SpringCloud(二)Eureka(服務註冊和服務發現基礎

col false -c conf gis 功能 pri desc sch 一:Eureka簡介 Eureka是Spring Cloud Netflix的一個子模塊,也是核心模塊之一。用於雲端服務發現,一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移

Spring Cloud構建服務架構服務消費(基礎

消費 ring str frame emp default class a template pom.xml 使用LoadBalancerClient在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口,包括DiscoveryClient、這裏我

Spring Cloud構建PC蛋蛋源碼下載服務架構服務消費(基礎

true ota ctu temp control lan prope 源碼下載 builder PC蛋蛋源碼下載論壇:haozbbs.com Q1446595067 使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的與服務治

基於Spring Boot和Spring Cloud實現服務架構學習

發的 附加 引入 所有應用 集中式 一個 操作 但是 onf Spring Cloud介紹 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、

基於Spring Boot和Spring Cloud實現服務架構學習(四)

feign 方法調用 規則 實現 uri ati .com 阻止 無法 Spring Cloud介紹 Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、