開發微服務的 9 個最佳實踐
大家好,我是不才陳某~
微服務架構是一種演進的模式,從根本上改變了服務器端代碼的開發和管理方式。這種架構模式涉及將應用程序設計和開發爲鬆散耦合服務的集合,這些服務通過定義良好的輕量級 API 進行交互以滿足業務需求。
它旨在通過促進持續交付和開發來幫助軟件開發公司加速開發過程,微服務架構模式從根本上改變了服務器端代碼的開發和管理方式。
如果我們談論其基本特徵,則特定的微服務本身充當應用程序,與其他微服務形成更大的應用程序,這使得:
-
更輕鬆、更快速的開發
-
可維護性
-
可擴展性
從本質上講,這使您可以更有效地管理和維護應用程序。然而,這種模式固有的特定複雜性可以通過使用某些最佳實踐來減輕。
我們都知道微服務設計對現代架構的網絡彈性有直接影響,當企業決定使用微服務進行構建時,高效且有效地開發它們非常重要,以便它們可以在網絡上運行,而不會導致過多的延遲、帶寬消耗和數據包丟失。
在本文中,我們將討論如果您想實現一個沒有極端架構複雜性的高效微服務生態系統,您應該考慮的基本微服務最佳實踐。那麼,事不宜遲,讓我們開始吧。
- 採用單一職責原則
單一職責原則是 OOP 中的任何單個對象都應該針對一個特定功能而創建的概念。基本上,它是羅伯特 · 馬丁提出的編程原則的一部分。就像代碼一樣,一個類應該只有一個需要更改的理由,從而使軟件更易於維護、可擴展且更易於理解。
要在軟件開發中採用 SRP,您應該確保每個類或模塊都有明確定義的職責,並且不會嘗試做太多事情。您還應該保持模塊解耦,並使用清晰簡潔的接口在它們之間進行通信。總結一下,我們有一個有趣的引述:
“將那些因相同原因而變化的事物聚集在一起,並將那些因不同原因而變化的事物分開。”——奧萊利
我們可以說,這是構建良好架構設計的最好、最基本的原則之一,因爲它意味着微服務、模塊、類、子系統或功能不應該有多個原因進行更改。
讓我們通過一個例子來理解這個原理:
電子商務門戶可能具有如下微服務架構
在這裏,所有服務(例如產品列表服務、訂單服務、客戶服務、支付服務、購物車服務、願望清單服務等)都有單一職責。這意味着確保在並非絕對必要的情況下不將一項服務與另一項服務集成非常重要,因爲這會使架構的維護和測試變得更加複雜。
- 建立職責明確的團隊
開發微服務架構,需要建立職責明確的團隊。這可以通過多種方式完成,例如基於角色的團隊、跨職能團隊等。在此架構中,每個微服務都作爲獨立的應用程序運行。
讓我們通過一個例子來理解這一點:
組織可以擁有基於角色的團隊,例如 UI/UX 開發人員、前端開發人員、後端開發人員、數據庫管理員、QA、中間件開發人員等,他們獨立工作,但每天通過會議進行互動(無論是面對面的)或者使用各種通訊工具,如 JIRA、Slack 等。
當我們考慮維護時,有時系統中也會出現小錯誤,有時甚至是大錯誤。因此,SCRUM 可能是一個可能的解決方案。它幫助每個團隊成員縮短無意識的時間。但是,由於團隊是根據角色組織的,因此在一個衝刺中集成一個更新可能會成爲一項複雜的任務。例如,如果 UI/UX 開發人員沒有從服務器人員那裏獲得有關 API 更改的任何信息,則新 API 將根本沒有用處。
那麼解決辦法是什麼呢?
建立職責明確的跨職能團隊,幫助協調團隊之間的工作
負責整個微服務功能的跨職能團隊可能會給您的項目帶來重大好處。該團隊應由所有基於角色的團隊的成員組成,並負責協調應用程序的各個部分,即 UI、開發、數據庫,甚至 QA。如果應用程序有兩個版本,即網絡版本和移動版本,那麼兩個團隊的開發人員都應該出現在該團隊中。這種團隊的主要好處是可以輕鬆解決錯誤、開發新功能並將其部署到生產環境中。
- 使用正確的工具和框架
至此,您可能已經設計了微服務來獨立部署它們,現在您必須實現這些微服務的最佳價值。爲此,您需要使用一組良好的 DevOps 工具來自動化構建和部署管理。
使用正確的工具、框架和庫將對實現微服務架構大有幫助。如果您計劃在 Java 中執行此操作,請考慮 Spring Boot 項目。選擇正確的工具和框架需要花費大量的時間和精力,因此這裏列出了適合該工作的 “首選”、經過驗證的工具和技術:
-
Jenkins 和 Bamboo 用於部署自動化
-
Docker 用於容器化
-
用於 API 測試的 Postman
-
用於容器編排和部署的 Kubernetes
-
Logstash 用於監控
-
DevSecOps 管理軟件開發生命週期的整個過程
-
GitHub 用於源代碼管理和版本控制
-
Amazon 的簡單消息隊列服務
-
SonarQube 檢查代碼質量和安全性
-
Ansible 用於管理您的配置
-
Jira 用於問題跟蹤和項目管理
- 保持微服務之間的異步通信
微服務之間發生兩種類型的通信:同步和異步。讓我們通過一個例子來理解這一點:
對於電子商務平臺來說,同步通信意味着用戶將被要求 “保持在線” 並完成一系列步驟(選擇商品、添加送貨地址、付款詳細信息、訂單驗證),最終導致客戶通知 “謝謝” 您的訂單!我們將於下週交付”。
一旦處理客戶通知,也會發生一些異步通信,這些異步通信是訂單 “履行” 階段的一部分,例如:倉庫通知、庫存更新等。
在同步通信的情況下,一個服務變得依賴於另一服務。有時,使用多個微服務之間的同步通信來完成整個任務會變得非常耗時。
另一方面,異步通信彼此不依賴,每個服務都可以花一些時間來完成其任務。因此,人們應該儘可能地最大化微服務之間的異步通信,它減少了依賴性並提高了應用程序的整體效率。
您可以在下面看到這樣的示例:
- 採用 DevSecOps 模型並保護微服務
安全性在此架構中非常重要。隨着微服務架構在雲原生應用程序開發中的發展,DevSecOps 實踐越來越多地用於通過增強的安全措施來確保持續集成和持續交付。使用微服務構建的應用程序可以分爲以下代碼類型:
-
應用代碼(核心邏輯)
-
應用服務代碼(網絡連接、會話建立等)
-
基礎設施(數據存儲資源、網絡、平臺等)
-
監控(應用程序的持續可觀察性)
DevSecOps 包含三個概念:開發、安全和操作,並已被證明是具有持續集成、持續交付和持續部署管道等原語的代碼類型的促進範例。這些管道是使用開發人員的源代碼進行開發、測試、部署以及許多此類操作的工作流程,這些操作由具有反饋機制的自動化工具支持。此外,它還使開發團隊能夠更快地交付更好、更安全的代碼。微服務架構中的 DevSecOps 實踐提供了許多好處,例如:
-
高安全保證
-
減少代碼漏洞
-
提高產品質量
-
提高生產力
-
提高操作速度
-
更快地交付更好、更高質量的軟件
- 爲每個微服務使用單獨的數據存儲
一項重要的實踐是確保儘可能使用單獨的數據庫來存儲數據,而不是爲多個微服務使用相同的數據庫。然而,更深入的分析可能表明一個微服務僅適用於數據庫表的子集,而另一方面,另一個微服務僅適用於全新的表子集。如果兩個數據子集都是正交的,則需要將數據庫分成單獨的服務。
因此,請確保爲您的微服務擁有單獨的數據存儲,以減少延遲並提高安全性。這已經被提到很多次了,但需要強調的是,微服務之間應該儘可能少地依賴。
微服務架構的主要屬性之一是每個服務的數據都是私有的,例如,每個服務數據庫模式就是如此。
我們還可以使用共享數據庫服務器,該服務器可供多個服務使用,並對其數據進行邏輯分離。
- 單獨部署每個微服務
如果您單獨部署每個微服務,那麼在維護或升級工作的同時,您肯定會節省大量與多個團隊協調的時間。此外,如果一個或多個微服務具有相同的資源,我們建議您使用專用基礎設施來隔離每個微服務的故障並避免全面中斷。
部署微服務的一些最常見和流行的模式是:
-
每個主機多個服務實例
-
每個容器的服務實例
-
每個主機單個服務實例
-
每個虛擬機的服務實例
- 編排微服務
微服務的編排是在流程和工具方面取得成功的最有影響力的因素之一。您可以使用 Docker 在虛擬機上運行容器,但它無法提供與容器編排平臺相同級別的彈性。在嘗試採用微服務架構時,這樣的決定很可能會對您的正常運行時間產生負面影響。
以下是一些經過驗證的編排平臺:
-
K8(Kubernetes)
-
AKS(Azure Kubernetes 服務)
-
ECS(亞馬遜彈性容器服務)
-
Azure 容器應用程序
這些平臺有助於管理容器配置和部署、負載平衡、擴展、網絡通信問題等。
- 使用有效的監控系統
微服務架構可幫助您對數千個模塊化服務進行巨大擴展,並提供提高速度和有組織的監控方法的潛力。然而,重要的是要確保檢查所有微服務並定期檢查它們是否按預期運行以及是否有效地使用可用資源。根據這些觀察結果,如果未達到預期,您可以採取適當的措施。
讓我們分析一個示例情況,假設您應用了微服務架構模式,該模式不具備處理請求的能力,但它們仍在運行。例如,如果數據庫連接耗盡,監控系統應該能夠在實例發生故障時生成警報,並且請求應路由到工作服務實例。
監控微服務並準確解釋這些統計數據將幫助您改進決策並在需要時保持微服務可用。
讓我們看一下微服務監控工具的幾個示例。
-
AWS CloudWatch: 一種監控、可觀察性和管理服務,可收集和可視化實時日誌,併爲 AWS、混合和本地應用程序及基礎設施資源提供可操作的見解。
-
Jaeger: 旨在監控和解決微服務環境中的複雜問題的軟件。
-
Datagod: 一個適用於雲規模應用程序的可觀察性、安全性和分析平臺,使用基於 SaaS 的數據分析平臺爲數據庫、服務和工具提供全面的解決方案。
-
Graphite: 顧名思義,它是一種開源軟件,可以監控數字時間序列數據並繪製圖表,並提供對底層系統的深入洞察。
-
Prometheus: 一個免費的開源軟件工具,提供監控和修改解決方案。
結論
這就是這篇文章的內容。我希望您覺得這篇文章很有用,並且您將遵循這些微服務的最佳實踐,最終得到一個獨立的、鬆散耦合的系統,以便獲得該架構的好處。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/m7Fia7N4ihH1Q2sow_ODbg