【乾貨】微服務設計的基礎知識

来源:https://www.cnblogs.com/Javame/archive/2018/11/07/9920404.html
-Advertisement-
Play Games

人體是不同系統的組合,其中大多數系統是獨立的,並且作為一個整體協同工作。每個系統都有自己的特定功能。所有具有多種其他支持框架的器官構成了一個功能完備的機構。現在,如果應用於軟體系統,這就是微服務架構的概念。 在技術方面,微服務系統允許開發單個功能模塊。這種開發單一功能模塊的趨勢為大型和小型組織提高了 ...


人體是不同系統的組合,其中大多數系統是獨立的,並且作為一個整體協同工作。每個系統都有自己的特定功能。所有具有多種其他支持框架的器官構成了一個功能完備的機構。現在,如果應用於軟體系統,這就是微服務架構的概念。

在技術方面,微服務系統允許開發單個功能模塊。這種開發單一功能模塊的趨勢為大型和小型組織提高了靈活性,性能和成本效率,同時實現了持續測試和早期交付。但是,在我們深入研究微服務設計的基礎知識之前,讓我們先看看它的優點。

微服務架構的優點

對於單一體繫結構,開發人員經常面臨有限的可重用性和可伸縮性的挑戰。但是,通過微服務設計,可以將這個單元分解為不同的模塊,從而簡化開發,部署和維護。那麼讓我們來看看微服務架構的一些主要優點:

技術靈活性

雖然單片架構總是讓開發人員尋找“適合工作的正確工具”,但微服務架構在一個封面下提供了多種技術的共存。可以用多種編程語言編寫不同的解耦服務。這不僅使開發人員能夠進行實驗,還通過添加其他功能和功能來擴展其產品。

提高效率

微服務架構加速了整個創建過程。與單個單元不同,團隊可以同時處理軟體系統的多個組件。除了提高生產率之外,還可以更輕鬆地定位特定組件並專註於它們。單個組件的故障不會影響整個系統。相反,這也簡化了錯誤定位和維護。

產品不是項目

根據Martin Fowler的說法,微服務架構可以幫助企業創建“ 產品而不是項目”。簡單來說,微服務架構的使用允許團隊聚集在一起併為業務創建功能而不是簡單的代碼。整個團隊聚集在一起,為不同的功能做出貢獻。如果適用,這些可以進一步用於不同的業務。此外,它還創建了一個自主的跨職能團隊。

成功的微服務設計的基礎知識

現在我們知道微服務架構的優勢,但是,我們如何實現完美?我們是否瞭解微服務設計原則?設計微服務架構的最佳實踐是什麼?讓我們回答這些問題,看看成功的微服務設計的一些基礎知識。

1.功能範圍

通過不同團隊同時實施開發和部署以建立或支持與產品分別獨特的功能,定義微服務的範圍成為非常重要的任務。雖然許多人擔心創建“太多”微小的微服務,但通常更常見的是這些微服務過載。

當我們談論微服務的範圍時,我們指的是獨立軟體模塊的功能。微服務作為幾乎無狀態系統的能力使其能夠獨立開發。因此,必須確定微服務將實現的功能。這有助於理解微服務的責任嗎?實現每個微服務應該服務的預期功能。不僅要防止過載,還要服務於不同的場景。例如,在單片設置中多次調用一段代碼,創建微服務將使其更易於訪問和使用。最小化代碼量只會提高效率並避免膨脹的服務。

問題是關於如何定義微服務的範圍。雖然沒有明確定義的規則集來實現這一目標,但如果您可以定義範圍,則可以使用一些指南或最佳實踐。以下是您可以用來定義微服務的一些步驟。

  • 第一步是確定在各種模塊下複製的代碼片段。你經常看到它們重覆嗎?每次在不同的模塊中設置它們需要花費多少精力?如果所有這些的答案都很高,那麼微服務的範圍就是只處理重覆的代碼片段。

  • 您可以採取的另一個步驟是檢查模塊是否不依賴於其他模塊或更簡單的術語,檢查模塊是否可能與其餘服務鬆散耦合。如果是這樣,那麼微服務的範圍將是整個模塊的範圍。

  • 在定義範圍時要考慮的另一個非常重要的指標是檢查功能是否將用於重負載。這將檢查微服務是否必須在不久的將來擴展。如果確實如此,那麼將可擴展位定義為微服務的範圍而不是將其與其他功能相結合是一個好主意。

2.高內聚力與松耦合

任何微服務的主要動機是使服務彼此獨立。這意味著可以編輯,更新或部署新服務,而不會妨礙任何其他服務。如果相互依賴性很低,這是可能的。鬆散耦合的系統是一個服務對其他服務知之甚少或什麼都不知道的系統。

在將整體架構分解為更小的服務或組件時,將類似功能組合起來非常重要。將相關邏輯組合成單個單元是已知的內聚。內聚力越高,微服務架構越好。較低的內聚力表明不同服務之間的通信過多導致系統性能較差。

3.獨特的身份識別來源

遵循微服務設計的基本原則,任何服務都必須成為系統其餘部分的唯一識別源。讓我們舉一個例子來理解這種情況。

在電子商務網站上下訂單後,向用戶提供訂單ID。生成此訂單ID包含有關訂單的所有信息。作為微服務,訂單ID是有關訂單服務的任何信息的唯一來源。因此,如果任何其他服務尋求關於訂單服務的信息,則訂單ID充當信息源而不是其實際屬性。

4. API集成

將整體設計分解為多種服務意味著這些服務將協調並協同工作以形成系統。但是,這些服務如何溝通?想象一下,使用多種技術來創建不同的服務。它們如何相互關聯?

嗯,簡單的答案是使用API(應用程式編程介面)。微服務設計的基礎是使用正確的API。這對於維護服務和客戶端調用之間的通信至關重要。輕鬆過渡和執行對於正常運行非常重要。

創建API時需要註意的另一個重要事項是業務領域。域的這種定義將簡化區分功能的過程。有幾個客戶端在系統外部。這些客戶端可以是其他應用程式或用戶。無論何時調用業務邏輯,它都由適配器(消息網關或Web控制器)處理,該適配器返回請求並對資料庫進行更改。

5.數據存儲隔離

為特定服務存儲的任何數據都應該對該特定服務保密。這意味著對數據的任何訪問都應歸服務所有。此數據只能通過API與任何其他服務共用。這對於保持對數據的有限訪問並避免“服務耦合”非常重要。基於用戶的數據分類很重要,可以通過命令和查詢責任分離(CQRS)來實現。

6.交通管理

一旦設置了API並且系統啟動並運行,不同服務的流量就會有所不同。流量是客戶端發送給特定服務的呼叫。在現實世界中,服務可能運行緩慢,從而導致調用花費更多時間。或者服務可能充斥著呼叫。在這兩種情況下,性能都會受到影響,甚至導致軟體或硬體崩潰。

這種高流量需求需要管理。呼叫和被叫的特定方式是流暢的流量的答案。服務應該能夠終止任何導致延遲並影響性能的實例。

這也可以使用稱為“自動縮放”的過程來實現,該過程包括在需要時通過快速動作持續跟蹤服務。在某些情況下,“斷路器模式”對於提供在呼叫中斷或服務無響應時可用的任何不完整信息非常重要。

7.自動化流程

獨立設計的微服務應該能夠自行運行。自動化將實現自我部署和功能,而無需任何干預。此過程使服務本質上具有雲原生性,並且能夠在任何環境中部署。但要實現這一目標,讓DevOps團隊不斷致力於服務的發展是非常重要的。

8.最小資料庫表(最好是隔離表)

訪問資料庫表以獲取數據可能是一個漫長的過程。它可能需要時間和精力。在設計微服務時,主要動機應該圍繞業務功能而不是資料庫及其工作。為了確保這一點,即使數據條目達到數百萬,微服務設計也應該只有幾個表。除了最小數量,關註業務是關鍵。

9.持續監測

想象一下,將單片架構分解為微服務設計。這需要大量的時間和資源。在傳統工具的幫助下監控所做的所有更改並不容易。插入數據層和緩存會提高性能,但卻難以監控整個過程。

因此,為了設計微服務架構,重要的是建立用於主動監視中心位置的數據存儲的過程。這有助於反映頻繁的變化,而不會影響系統的性能。在一個常見的場景中,微服務監控工具將監控單個服務,然後通過將數據存儲在一個集中位置來組合數據。這是遵循微服務設計原則的必要步驟。

實現API在成功的微服務架構中扮演的關鍵角色。還必須有一個持續監控API性能的過程。API性能監控對於任何微服務架構都至關重要,以確保功能在速度,響應性和產品的整體性能方面始終如一。

微服務架構的局限性

雖然微服務是降低整體結構的最佳方式,但它有其自身的一些缺點。但在得出任何結論之前,讓我們來看看其中的一些。

1.開發環境超載

隨著應用程式及其資料庫的增長,代碼庫也在不斷擴展。隨著針對每個微服務的代碼擴展,它會使每個載入的應用程式的開發環境過載。這可能導致生產力的重大延遲。

2. DevOps複雜性

單功能微服務的開發和部署並非易事。使用多種技術並創建API來集中系統是一項挑戰。這需要一個經驗豐富的DevOps團隊。採購這樣一個經驗豐富的DevOps團隊對於維護基於微服務的應用程式的複雜性至關重要。

3.增加資源和網路使用

由於多個組件協同工作,因此在某種程度上彼此進行通信非常重要。此通信將導致網路使用量增加。這需要高速可靠的網路連接。此外,運行這些應用程式的費用也會增加。所有服務都單獨運行,增加了運營成本。

4.測試

測試應用程式可能具有挑戰性,因為有單獨的組件。與單片應用程式相比,微服務需要更長的時間進行測試,並且在出現任何錯誤時更加複雜。有時,由於測試最終會影響整個應用程式,可能會導致延遲。

5.安全

在Web應用程式方面,安全性至關重要。使用微服務,實現這一點很困難。當存在獨立模塊的集群時,每個模塊都需要遵守為整個系統定義的認證和授權規範。

除此之外,每個模塊可能與其他模塊通信,跟蹤數據流變得非常困難。需要其他措施,例如具有負載平衡的API網關,以確保行為一致。這些額外的步驟導致每個微服務的開銷。

6.應用程式的複雜性

由於微服務是獨立組件,因此每個微服務通常都有一個最適合其需求的技術堆棧。例如,機器學習模塊可能使用python堆棧,而計量服務可能使用Java堆棧,UI服務可能使用MEAN堆棧。這會導致複雜性,因為資源池和管理和構建新功能所需的技能將非常高。

7.高初始投資

微服務獨立運行,它們需要獨立的容器或資源來運行它們。每個項目可能有很多微服務一起工作,需要更高的投資來設置包括微服務,安全容器,負載平衡器,API網關等的所有集群。

這值得麽?

在閱讀了微服務設計的基本原理之後,很明顯需要遵循一系列最佳實踐。但是,我們還觀察微服務設計原則如何通過打破單片架構來簡化創建應用程式的過程。但是,與此同時,在調整微服務架構時需要剋服某些挑戰。這些複雜性會影響運營流程,但從長遠來看,剋服這些挑戰可以帶來優化和更高效的應用。

此外,它還可以剋服延遲和缺陷,同時提高靈活性和性能。記住上面提到的,可以說微服務架構對於成功的軟體系統是必要的。

包括PayPal,Twitter,LambdaTest和Netflix 在內的許多企業都支持微服務架構的可靠性,以部署更具可擴展性,功能性和強大的軟體。

---------------------------------------------

推薦閱讀:

微信支付開發中幾個值得註意的地方

解析:微服務的原則

老王講架構:負載均衡

支付寶系統架構內部剖析

SaaS技術棧的走勢

大數據Spark與Storm技術選型


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信小程式組件里沒有下拉框,正好要用到,記下來以後參考 wxml代碼 wxss代碼 js代碼 效果 ...
  • 這篇文章介紹了Vue.js 父子組件之間通信的十種方式,不管是初學者還是已經在用 Vue 的開發者都會有所收穫。無可否認,現在無論大廠還是小廠都已經用上了 Vue.js 框架,簡單易上手不說,教程詳盡,社區活躍,第三方套件還多。真的是前端開發人員必備技能。而且在面試當中也往往會問到關於 Vue 方面... ...
  • ** 創建string對象 *** var str ="acb"; ** 方法和屬性 ** 屬性 length:字元串的長度 ** 方法 (1)與HTML相關的方法 - bold():加粗 - fontcolor():設置字體的顏色 - fontsize():設置字體的大小(1-7) - link( ...
  • 看到掘金上翻出一個老梗,前端如何不帶髒字得罵產品經理傻逼(sb),複製(!(~+[]) + {})[--[~+""][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]]到瀏覽器控制台回車,看到輸出sb二字。 原理很簡單,就是取字元串里的字母進行拼湊 ...
  • window.onresize = function() { /* 預設設置字體為可視區/7.5 max:256px min */ document.documentElement.style.fontSize = document.documentElement.clientWidth / 7.5 ...
  • 作用域:瀏覽器給js的生存環境(棧記憶體) 1.this是js的一個關鍵字,指定一個對象去代替它。 函數內的this指行為發生的主體,函數外的this指window沒有意義。 為什麼函數window 因為瀏覽器執行js代碼的時候在執行chifan()這個函數的時候查找到變數chifan的歸屬是wind ...
  • 關於 CSS 陰影,之前已經有寫過一篇,box-shadow 與 filter:drop-shadow 詳解及奇技淫巧,介紹了一些關於 box-shadow 的用法。 最近一個新的項目,CSS-Inspiration,挖掘了其他很多有關 CSS 陰影的點子,是之前的文章沒有覆蓋到的新內容,而且有一些 ...
  • JavaScript: 知識點回顧篇(十):Screen 對象、History 對象、Location 對象 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...