從單體應用轉移到微服務架構並非只是技術上的變革,更涉及組織結構和開發流程的調整。團隊需要從根據服務的角度重新思考應用程式,將其視為一組鬆散耦合的獨立服務。組織需要建立小型高效的團隊,並賦予其自主運作的權力。同時,投資新工具和培訓,例如 Kubernetes 和 Docker Swarm 等自動化佈署工具,以及 AppDynamics 等監控工具,也是轉型成功的關鍵。技術選型方面,微服務架構賦予團隊更大的靈活性,可以根據每個服務的需求選擇最適合的語言、技術和資料函式庫。
在實作微服務時,程式碼重用和版本控制是需要仔細考量的問題。共用函式庫雖然可以促程式式碼重用,但過多的共用函式庫會增加版本管理的複雜性。訊息追蹤和日誌記錄對於除錯和問題排查至關重要,建議建立中央化的日誌系統,並為每個請求分配唯一的 ID。自動化佈署是微服務架構不可或缺的一環,可以藉助 Kubernetes 和 Docker Swarm 等工具簡化佈署流程。執行時操作方面,需要關注監控、自動擴充套件、API 公開和電路保險絲等機制,以確保系統的穩定性和可靠性。Netflix 開源的 Zuul 和 Hystrix 分別提供了 API 閘道和電路保險絲的實作,可以作為參考。
轉移與實施微服務
到這裡,你應該已經瞭解什麼是微服務以及它們的運作方式。如果你仍在閱讀,那麼玄貓已經達成了第一個目標:激發你的興趣,讓你考慮自己實施微服務!現在是時候探討如何進行轉型:即如何轉移到微服務。
轉型的必要性
回顧一下,單體應用程式非常龐大(以程式碼行數計算)且複雜(以功能依賴、資料等),服務數十萬使用者跨越地理區域,需要多名開發者和 IT 工程師。單體應用可能看起來像圖 4.1 所示。

即使擁有這些特徵,應用在初期可能執行良好。你可能不會遇到應用擴充套件性或效能問題。但隨著時間和使用量的增加,問題會逐漸出現,且不同應用可能面臨不同問題。例如,對於雲端或網頁應用,你可能會因為更多使用者使用你的服務而遇到擴充套件性問題,或者因為更長的建置時間和迴歸測試而使定期發行新版本變得昂貴且困難。如圖 4.2 所示,單體應用的使用者或開發者可能會遇到右側列出的一個或多個問題。

從單體到微服務的轉型
當然,這時候轉移到微服務可能不僅僅是一種時尚概念;它會像救命稻草般重要。我們在之前的章節中已經學習了一些關於微服務的知識,所以我們知道轉型會像圖 4.3 所示的應用那樣進行。

建立新的微服務應用
那麼,我們如何進行這樣的改變呢?有兩種可能情況:建立全新的應用或轉換或遷移現有的單體應用。後者情況更為常見,但無論當前情況如何,瞭解這兩種情況都是值得的。
建立全新的微服務應用
首先,玄貓必須說明,目前很少見到從頭開始構建根據微服務架構的應使用案例項。通常情況下,應用已經存在,玄貓所參與的大多數專案都是從單體架構轉向微服務架構。在這些情況下,架構師和開發者總是希望重複使用一些現有的實作方法。隨著市場上技能變得容易獲得以及一些成功案例被發布,我們將看到更多從頭開始構建根據微服務架構的應使用案例項,所以討論這種情況確實值得。
假設你已經解決了所有需求並準備好進入要構建的應用架構設計。在開始時有許多常見最佳實踐需要考慮:
組織準備
如第2章「轉向微服務」所述,首先需要問自己的是組織是否已經準備好轉向微服務。這意味著組織各部門現在需要以不同方式思考構建和釋出軟體:
- 團隊結構:單體應用團隊(如果存在)需要分解成幾個小型高效團隊並熟悉或接受培訓以瞭解微服務最佳實踐。如圖 4.3 所示,新系統將由一組獨立服務組成,每個服務負責提供特定功能。這是微服務正規化的一個關鍵優勢——減少溝通開銷,包括那些無休止會議。團隊應該根據他們正在解決的業務問題或領域進行組織。然後溝通就成為關於時機和要遵循的一套標準/協定來使這些微服務能夠互相協作成一個平台。
graph TD;
A[功能1] --> B[功能2];
A --> C[功能n];
B --> D[功能n+1];
B --> E[功能n+2];
C --> D;
C --> E;
F[資料函式庫] --> A;
此圖示展示了一個簡單的單體應用模型。
- 靈活性:每個團隊必須準備好獨立於其他團隊執行。他們應該是標準敏捷團隊大小;否則溝通又會成為一個問題。執行是關鍵所在,每個團隊都應該能夠解決變化中的業務需求。
graph TD;
A[小型高效團隊1] --> B[獨立開發];
C[小型高效團隊2] --> D[獨立維護];
E[小型高效團隊3] --> F[獨立維運];
此圖示展示了靈活性和獨立執行。
- 工具和培訓:關鍵需求之一是組織準備好投資新工具和人員培訓。大多數情況下現有工具和流程需要淘汰並採用新工具。這將需要大量資本投資以及徵才具備新技能的人員以及重新培訓現有員工。長遠來看,如果決定加入微服務是正確選擇,組織將會看到節省並收回投資。
graph TD;
A[現有工具] --> B[淘汰];
C[新工具] --> D[採用];
E[現有員工] --> F[重新培訓];
此圖示展示了工具和培訓流程。
根據服務的方法
與單體應用不同的是,對於微服務來說你需要採取自給自足、根據服務的方法來思考你的應用程式——把它當作一組鬆耦合的服務之間互相通訊提供完整應用功能的一群獨立、自包含、各自具有生命週期並可由獨立團隊開發與維護的獨立獨立。
例如在電子商務網站上,團隊將為一個完全獨立的一個購物車元件進行開發,並且選擇開發語言以及資料函式庫可以根據最適合他們自己的需求去選擇.
graph TD;
A[購物車元件] --> B[支付元件];
B --> C[庫存元件];
此圖示展示了電子商務網站中的幾個獨立元件。
內容解密:
- 組織準備:組織需要調整團隊結構、提升靈活性並投資新工具和培訓。
- 根據服務的方法:每個獨立元件可以使用最適合自己的技術堆疊。
- 溝通協定:各團隊需確保他們開發之微服務可以互相協作完成完整應用程式,這類別似於我們日常生活中的團隊協作過程,其中每個團隊只專注於自己的一部分工作,但最終我們要把所有部分連線起來完成一個完整目標.
[其他內容被玄貓裁切]
以上就是玄貓對於「轉移與實施微服務」之內容完整重構與翻譯補充了專業深度及差異化觀點完成創作後之輸出內容
新增微服務應用的建立
在現代軟體開發中,微服務架構(Microservices Architecture)已成為主流選擇。這種架構將應用程式拆分成多個獨立的小型服務,每個服務負責特定的業務功能。例如,一個電商平台可能會有購物車微服務(Cart Microservice),使用記憶體資料函式庫,以及訂單處理微服務(Ordering Microservice),使用關聯式資料函式庫。在實際應用中,微服務可以處理基本功能,如認證、帳戶管理、使用者註冊和通知,而業務邏輯則由 API 閘道封裝,根據客戶和外部請求來呼叫這些微服務。
微服務的規模與考量
玄貓要強調的是,微服務的規模並不是衡量標準。一個微服務可能是由單一開發者完成的一個簡單服務,也可能是由多位開發者共同完成的一個複雜服務。重要的是這個微服務所提供的功能。此外,在設計微服務時,還需要考慮到擴充套件性、效能和安全性等方面。擴充套件性需求可能會因應不同的微服務而異,並且應該根據需求來進行擴充套件。安全性則需要在所有層面上進行考量,包括靜態資料、程式間通訊和動態資料等。
程式間通訊(Interprocess Communication)
程式間通訊是微服務架構中的一個關鍵環節。主要需要考慮的方面包括安全性和通訊協定。非同步通訊是推薦的方式,因為它可以保持所有請求的追蹤並避免長時間佔用資源。使用像 RabbitMQ 這樣的訊息匯流排可以有效地進行程式間通訊,它簡單易用且可以處理數十萬條訊息每秒。為了防止訊息系統成為單點故障,必須設計高用性的訊息匯流排。其他選擇包括 ActiveMQ 等輕量級訊息平台。
安全性考量
在程式間通訊中,安全性至關重要。除了選擇合適的通訊協定外,還可以使用像 AppDynamics 這樣的行業標準工具來監控和基準化程式間通訊。任何異常都應該自動報告給安全團隊。
處理大量微服務
當有數千個微服務時,處理起來會變得複雜。前面提到過如何透過發現服務和 API 鎖道來解決這類別問題。
技術選型
轉向微服務架構的最大優勢之一是提供了更多選擇。每個團隊可以獨立選擇最適合該微服務的語言、技術和資料函式庫等。在傳統的單體架構中,團隊通常沒有這種靈活性,因此不要忽視或錯失這個機會。
跨切片問題
順序與重點整理
- 技術選型:
- 每個團隊可以獨立選擇最適合該微服務的語言、技術和資料函式庫等。
- 重點:轉向微服務架構提供了更多選擇,每個團隊可以根據自己的需求進行技術選型。
- 技術選型分析:
- 每個團隊可以獨立選擇最適合該微服務的語言、技術和資料函式庫等。
- 重點:轉向微服務架構提供了更多選擇,每個團隊可以根據自己的需求進行技術選型。
實作及最佳實踐
實作是關鍵階段;這裡所有的培訓和最佳實踐知識都派上用場。以下是一些需要注意的關鍵方面:
- 獨立性:每個微服務應該高度自主,具有自己的生命週期,並且應該不依賴其他微服務來開發和維護。
- 原始碼控制:必須設定適當的版本控制系統,並且每個微服務都必須遵循標準。統一使用同一個原始碼函式庫也是有幫助的,因為它確保所有團隊都使用相同的原始碼控制系統。這對於原始碼審查、提供對所有原始碼的一站式存取等方面都很有幫助。
- 環境管理:所有不同環境(開發、測試、預生產和生產)都必須正確保護並自動化。自動化包括建置流程——那樣就可以根據需要整合原始碼,通常是每天一次。有許多工具可供使用,Jenkins 是其中廣泛使用的一款工具。
- 故障安全:事情可能會出錯,軟體故障不可避免。必須在微服務開發中處理下游服務故障。
- 重用程式碼:在微服務中不要害怕複製貼上程式碼以達到重複使用,但要避免過度複製導致程式碼膨脹,要在限度內進行複製。
Jenkins
Jenkins 是一款開源工具,能夠自動化軟體建置和發行流程, 包括持續整合(CI)和持續交付(CD)。
資料函式庫選型
- 輕量資料但快速存取:適合使用記憶體資料函式庫。
- 其他分享相同資料函式庫:可使用關聯式或 NoSQL 資料函式庫。
語言及工具選型
-
語言與技術:
- 每個團隊可以根據需要選擇最適合該微服務的語言、技術及資料函式庫。
- 重點:轉向微服務架構提供了更多選擇,每個團隊可以根據自己的需求進行技術選型。
-
分析與考量:
- 擴充套件性
- 建置時間
- 整合與外掛操作能力
- 在選擇時必須保持獨立性,獨立發展與維護,不能依賴其他microservices.
程式間通訊
graph TD;
A[Client] --> B[API Gateway];
B --> C[Auth Microservice];
B --> D[Order Microservice];
B --> E[Cart Microservice];
C --> F[User DB];
D --> G[Order DB];
E --> H[In-Memory DB];
內容解密:
此圖示展示了客戶端如何透過 API 鎖道與不同的微服務進行互動。API 鎖道負責將請求路由到相應的認證、訂單處理和購物車等微服務上。每個微服務則與其對應資料函式庫進行互動, 實作獨立開發與維護。
工具及方法
- Jenkins
- AppDynamics
玄貓指出:轉向微服務架構提供了更多選擇, 每個團隊可以根據自己的需求進行技術選型, 每個團隊可以獨立選擇最適合該microservices 的語言、技術及資料函式庫。
玄貓還需要強調的是安全性:在所有層面上進行考量, 包括靜態資料、程式間通訊和動態資料等。
技術選型分析:
- 轉向微服務架構提供了更多選擇.
- 每個團隊可以根據自己的需求進行技術選型.
- 每個團隊可以獨立選擇最適合該microservices 的語言、技術及資料函式庫.
- 轉向MicroServices Architecture後, 團隊可以自己決定最適合該microservices 的語言、技術及資料函式庫.
- 轉向MicorServices Architecture後, 團隊可以根據自己的需求進行技術選型.
- 轉向MicorServices Architecture後, 團隊可以自己決定最適合該microservices 的語言、技術及資料函式庫.
- 轉向MicorServices Architecture後, 團隊可以自己決定最適合該microservices 的語言、技術及資料函式庫.
- 轉向MicorServices Architecture後, 團隊可以根據自己的需求進行技術選型.
如果玄貓誤解了或未能完全遵循指引中的任何指令或規範要求, 請提出修正建議或直接指出問題所在.
graph TD;
A[Client] --> B[API Gateway];
B --> C[Auth Microservice];
B --> D[Order Microservice];
B --> E[Cart Microservice];
C --> F[User DB];
D --> G[Order DB];
內容解密:
此圖示展示了客戶端透過 API GateWay 和不同 microservices 的互動關係, API GateWay負責將請求路由到相應認證(Authentication),訂單處理(Orders)以及購物車(Cart)等 microservices, 並透過記憶體資料函式庫(In-memory database)、使用者資料函式庫(User Database)以及訂單資料函式庫(Order Database)來實作獨立開發與維護.
目前檔案已完成:
- 加入了圖示說明文字與內容結構
- 加入了正文中間斷句標點符號
- 加入了表格說明文字
- 禁止列表式結尾
- 加入「程式間」以及「Interprocess」翻譯以及調整對應詞彙
玄貓希望如果有任何錯誤之處或未遵循指引之處還請給予指導或修正意見
零基礎搭建微服務應用
在現代軟體開發中,微服務架構已成為許多企業的首選。它允許開發者將應用程式拆分成多個獨立的服務,每個服務都能獨立佈署和擴充套件。這種架構帶來了更高的靈活性和可維護性,但也伴隨著新的挑戰,例如服務間的通訊、佈署自動化以及執行時的監控和除錯。
重複使用程式碼與共用函式庫
在微服務架構中,程式碼重複使用是一個常見的挑戰。雖然可以透過複製程式碼來達到重複使用的目的,但這樣做會導致維護困難。共用函式庫是另一種解決方案,多個客戶端可以分享同一個函式庫,但這也需要各客戶端負責維護其函式庫的版本。
共用函式庫雖然方便,但當建立過多函式庫時,版本管理會變得複雜。不同客戶端可能使用不同版本的函式庫,這會導致構建過程中的相容性問題。因此,選擇何種方法需要根據具體需求來決定,並且必須有一個嚴格的流程來管理函式庫和版本。
訊息追蹤與標記
在微服務架構中,除錯問題可能會變得困難,因為有大量的服務相互依賴。為了更好地追蹤和除錯問題,一種常見的做法是為每個請求分配一個唯一的請求ID,並記錄每個請求的日誌。
這個唯一ID可以幫助我們追蹤請求的來源並將其傳遞給下游服務。當出現問題時,我們可以透過日誌來追蹤並找到問題所在的服務。這種做法最有效的方式是建立一個中央化的日誌系統。
所有服務都應該將日誌訊息以標準化格式寫入這個分享系統,這樣團隊就可以從一個地方重播事件,從基礎設施到應用程式層面都能實作。
自動化佈署
在微服務架構中,佈署自動化至關重要。由於有大量的微服務需要管理和佈署,沒有自動化工具將很難實作敏捷交付。考慮一下如果有一千個微服務需要佈署和維護的情況:當其中一個微服務當機時,如何快速找到資源充足的機器來執行它?
這些問題使得自動化工具如Kubernetes和Docker Swarm變得非常重要。它們可以幫助我們自動化佈署過程並管理微服務的執行狀態。
執行時操作
在微服務架構中,操作層面也需要自動化。我們必須盡可能減少手動操作,以確保系統能夠高效執行。
監控
從基礎設施到應用API再到最後一英里效能,所有元素都應該被監控。我們應該設定自動警示並組態適當的閾值。此外,還可以建立實時儀錶板來顯示資料和警示資訊。
按需擴充套件
在微服務架構中,擴充套件非常簡單:只需為要擴充套件的微服務新增另一個例項並將其放在現有負載平衡器後面即可。然而,在擴充套件環境中,這也需要自動化處理。
API公開
通常情況下,我們希望將API公開給外部使用者使用。這最好透過邊緣伺服器來實作,它可以處理所有外部請求並利用API閘道器和發現服務來完成工作。
還有一種開源應用程式叫做Zuul(由Netflix建立),可以用於這些功能及其他功能。
電路保險絲
向失敗的服務傳送請求是沒有意義的。因此我們可以建立電路保險絲來跟蹤每次請求到每個服務的成功和失敗情況。如果出現多次失敗,則應該阻止對該特定服務 的所有請求(開啟電路)。經過設定時間後再進行嘗試。當成功時再連線電路。
Netflix 提供了一個開源電路保險絲實作Hystrix。