微服务[面临的挑战]
進一步深究和分析設計和運行微服務系統的代價和復雜度,微服務并不是唯一通過分解和分布式實現涅槃的架構模式,但過去的一些嘗試如SOA已經被認為是不成功的,現在提到微服務架構,也極大的增加了系統中運行模塊的數量,在將功能和數據所有權分發到多個自治的服務上的同時,開發者也將整個應用的穩定性和安全操作的責任分配到了這些服務上,縱觀全局大體有幾個挑戰:
- 識別和劃定微服務范圍需要大量專業的業務領域知識
- 正確識別服務間的邊界和契約式很困難的,而一旦確定又很難進行改動
- 微服務是分布式系統,所以需要對狀態、一致性和網絡可靠性這些內容做不同的假設
- 跨網絡分布式系統組件以及不斷增長的技術差異性,會導致微服務出現新的故障形式
- 越來越難以了解和驗證在正常運行過程中會發生什么事情
設計挑戰
首當其沖的便是自治性,為了讓服務實現自治,在設計上需要讓服務從整體上開始松耦合的,而單獨看每個服務,它內部封裝了高度內聚的功能單元,這是一個不斷演進的過程,服務的功能范圍可能會隨著時間而發生變化,開發者未來也可能會經常從現有的甚至可能將要下線的服務中剝離出新的功能來
劃定微服務范圍需要業務領域知識
每個微服務只負責一個功能,識別這些功能是需要業務領域知識的,在應用生命周期的初始階段大部分開發者對業務領域知識知之甚少,甚至漠不關心,最糟糕的情況是認知是錯誤的
對問題領域的錯誤認知會導致錯誤的設計決策,和單體應用中的模塊相比,微服務應用的服務邊界更加僵化,這就意味著如果范圍劃定出錯,可能給下游造成更到的代價
除了圖中所示的重構外,還可能沒有發現服務間的隱式依賴,導致在部署階段出現錯誤或者不兼容的問題
服務契約的維護
每個微服務都應該獨立于其他服務實現,這樣才能實現技術的多樣性和自治性,為了做到這一點,每個微服務都應該對外暴露一個契約(相當于面向對象設計中的接口),用于定義它期望接受和返回的消息
一個良好的契約應該具備如下幾個特點:
- 完整:定義了交互所需的全部內容
- 簡潔:除了必需的信息,沒有多余的內容,這樣消費者就能在合理的范圍內組裝消息
- 可預測:準確反映了所有實現的真實表現
實際上做到并不容易,隨著時間的推移,開發者需要對契約逐步調整,但仍要保持向后兼容,穩定性和變化之間的矛盾很難把握
微服務應用是多個團隊設計的
在規模比較大的組織中,微服務通常是由多個團隊開發和運行的,而每個團隊有自己的目標、工作方式和交付周期,因此協調任何龐大的微服務應用開發,都需要跨多個團隊在優先級和時間層面達成一致
微服務應用是分布式系統
設計微服務系統也就意味著設計的是分布式系統,分布式系統就不得不考慮網絡可靠性、網絡延遲、帶寬,數據傳輸成本等,在非分布式系統中做出的假設都不在適用了,開發者必須考慮延遲性、可靠性、以及應用中的狀態一致性
一旦應用成為分布式,應用的狀態數據就分布在了不同的地方,開發者不再能夠保證操作的順序,在多個服務上操作時,開發者也不再能像ACID那樣繼續保證事務,同時還會影響到應用層面的設計,開發者需要考慮服務如何在不一致的狀態下進行操作以及如何在事務失敗的情況下進行回滾
運維挑戰
微服務方案本身會使系統中可能出現的故障點增多
微服務不能消除風險,而是將成本轉移到了系統生命周期的后半階段,降低了開發過程中的沖突,但增加了運維階段系統部署、驗證以及監控的復雜度
微服務的在實操中應該采用漸進式的方法,開發者可以在不修改現有服務的情況下,獨立開發新的功能,從而將變更的代價和風險降到最低
但是在不斷漸進的解耦系統中,要清楚地了解整體情況會越來越困難,這使得問題的診斷和支持變得更具挑戰性,當出現故障時,開發者需要通過一系列的方式來跟蹤系統到底發生了什么(調用了哪個服務,順序是什么,輸出是什么),同時還需要知道系統應該發生
難以實現的可觀測性
這就是透明性的重要,但在微服務應用中,透明性會變得越來越困難,整個微服務系統是多個團隊開發的,而開發者需要將許許多多的碎片拼接起來形成整體的藍圖,所以需要將每個服務所產生的數據關聯并鏈接到一起,進而了解交付商業價值的整體的來龍去脈之后理解每個服務所做的事情
- 每個服務的日志提供了系統運行的部分視圖,但開發者需要同時從微觀細節和宏觀整體兩方面來更加全面的的理解系統
- 同時仍舊需要根據選擇的部署方式,觀測基礎設施指標和微服務之間的關系,這些指標仍舊非常有用
不斷增加的微服務使得故障點增多
如果說:”任何可能出現故障的東西最終肯定會出現故障“,這并不是悲觀反而是非常重要,如果開發者提前認定構成系統的這些微服務是有缺陷或者脆弱的,那么就能夠更好的提醒自己如何對系統進行設計、部署和監控,開發者需要考慮如何讓系統在單個組件出問題的情況下繼續運行,這意味著每個服務都需要更具魯棒性(要考慮到錯誤勘察、故障切換和恢復),同樣整個系統應該運行更加可靠,即便單個組件做不到100%可靠
總結
以上是生活随笔為你收集整理的微服务[面临的挑战]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根据json串直接入库
- 下一篇: STEMWIN开发记录指南—-从外部fl