微服務架構是一種軟體開發模式,它將一個複雜的應用程式拆分為多個個獨立的、小型的、可複用的服務,每個服務負責一個特定的業務功能。
微服務架構有許多優點,例如提高系統的可擴充套件性、可維護性、可測試性和故障容忍性。
但是,微服務架構也有很多問題需要注意,例如如何設計合理的劃分服務介面、如何在服務間實現高效通訊、如何保證資料一致性等。因此要想成功地使用微服務架構,我們需要遵循一些最佳實踐。
以下是一些微服務架構的最佳實踐,我將盡我所瞭解的知識給大家進行講解。本文大綱如下,
1. 不使用微服務架構
沒錯,我們應該儘量避免使用微服務架構。
認真地說,使用微服務架構只能被視為最後的選擇。從專案實際應用場景開發,少看一些網上關於微服務的吹捧。務實一點,根據專案體量、業務複雜度選擇一個適合當前專案的架構。
首先嚐試構建一個單體的模組化架構,而不是一上來就搞微服務架構。
2. 針對失敗場景進行處理
在任何使用微服務的分散式系統裡面,總是有呼叫失敗的可能,比如網路分割槽、某個服務當機不可用等。
所以我們在系統呼叫層面針對失敗場景的處理,應該設計得越早越好。
故障設計最好三個級別,
- 基礎設施級別
- 資料庫級別和
- 單個微服務級別
實際的針對失敗場景處理,可以使用斷路器、服務降級和 "隔板模式"。
隔板模式在分散式系統中就是指資源隔離,在分散式系統裡,資源隔離通常按業務分為程式級別的隔離和執行緒級別的隔離,某些簡單的服務質量要求不高的業務場景下實現程式級別的隔離就夠了,但是在某些對服務質量要求較高的分散式場景下需要執行緒級別的細粒度隔離。
3. 構建小型服務
微服務架構中,每個服務應該都按單一職責進行設計。
每個微服務應該只負責一個業務領域,並且儘量避免涉及其他領域。
這樣可以提高程式碼的可讀性、可測試性和可維護性,也可以降低系統的複雜度和耦合度。
4. 使用輕量級通訊協議
微服務架構中,服務之間的通訊協議時非常重要的。因為在一些對效能要求較高的場景裡,選擇一個輕量級協議所能帶來的 QPS 提升,也是非常客觀的。
比如服務間可以使用 REST、GRPC 或訊息佇列等通訊協議,這樣可以儘可能減少服務通訊帶來的開銷並提升效能。
5. 服務發現
微服務架構下,服務例項的網路地址是動態分配和變化的,因此需要一種機制,能夠及時獲取服務例項的最新的網路地址,以便進行服務間通訊。
並且服務例項的數量和狀態都是隨著業務需求和故障情況而變化的,還需要有能夠及時感知服務例項的上線、下線、故障等情況的能力。
因此我們需要使用服務發現元件,它負責自動發現服務例項,負載均衡和故障轉移。
服務發現元件有 Eureka 、Consul、Nacos 等,國內的話,推薦大家使用 Nacos。
6. 資料庫隔離
微服務架構下,每個服務的資料庫應該都是單獨部署的,它們之間相互隔離。
一個服務要操作另一個服務資料庫中的資料時,都應該只能透過呼叫另一個服務的介面來實現,而不是粗暴的直接訪問其他服務的資料庫進行讀寫。
資料庫隔離的最終目標就是為了減少服務之間的耦合,使它們能夠獨立發展。
7. 實施彈性模式
為了提高微服務架構中各個服務的彈性,我們應該儘量使用彈性模式。
所謂彈性,其實就是服務的可用性,專業一點的話說就是從某些型別的故障中恢復並保持自身服務的能力。
那麼,我們應該如何實施實施彈性模式嘞?
其實很簡單,我給大家分成兩個部分進行講解,一個是服務內,另一個是服務外。
服務內指的是別人呼叫我們的服務時,需要注意的點有,
- 新增快取
- 資源隔離
- 介面限速
服務外指的是我們呼叫別人的服務時,需要注意的點有,
- 呼叫超時
- 請求重試
- 斷路器應用
8. 服務監控於鏈路追蹤
有句話說得好,"在任何分散式系統中,會當機的服務最終都會當機"。😂
特別是在微服務系統,系統間的服務呼叫鏈路越長,發生異常時的排查難度就越大。
所以為了跟上微服務的步伐,我們需要發現各個服務中存在的問題。進一步也就需要針對微服務的效能、狀態、異常等指標進行收集、分析、展示和告警。這有助於提高系統的可觀察性、可運維性和可靠性。
鏈路追蹤是一種技術,用於監控和分析分散式系統中的請求流程,以及各個服務之間的呼叫情況。
在分散式系統中,鏈路追蹤就是為每個請求分配一個全域性唯一的標識(TraceId),並在請求在各個服務之間傳遞時,記錄每個服務的呼叫資訊(SpanId),包括呼叫時間、耗時、狀態等。透過收集、儲存、展示和分析這些資訊,就可以還原出請求的完整鏈路,以及各個服務的效能表現。
在如今流行雲原生的潮流下,推薦使用 Prometheus、Grafana 為微服務構建全面的監控能力,使用 Skywalking 為微服務構建一套效能分析以及鏈路追蹤平臺。
9. 服務的安全性
微服務架構中,各個服務的安全性設計也非常重要。
常見的有如下幾種安全性設計的舉措,
- API 閘道器:使用 API 閘道器作為服務的統一入口,對所有進入和離開的請求進行鑑權、路由、負載均衡、限流、快取等功能,提高服務的可用性和效能,同時也增加了服務的安全性,防止內部服務被直接訪問或攻擊。
- 令牌安全:使用 JWT、OAuth 2.0 等標準化的令牌格式和協議來實現服務之間或服務與客戶端之間的身份驗證和授權,防止服務被冒充或濫用。
- 請求過濾:對 API 閘道器所接收到的所有請求資料,進行 SQL 注入攻擊、XSS 攻擊和 CORS 攻擊過濾攔截處理。
- 風控報警:在 API 閘道器新增風控措施,針對發起惡意請求的使用者做黑名單風控處理,針對服務內部的非業務異常進行報警通知。
10. 統一日誌採集
分散式系統中,各個服務的日誌都位於不同的機器上,因此機器越多,日誌統一採集的需求就越強烈。
統一日誌採集是微服務架構中的一個重要的運維需求,它負責收集和管理分散式系統中的各種日誌,如執行日誌、訪問日誌、錯誤日誌等,以便於進行問題排查、效能分析、資料探勘等。
推薦使用 ELK 或者 Graylog 搭建一套統一日誌採集平臺。
因為我使用 Graylog 比較多,所以這裡給大家推薦瞭解一波 Graylog 這個統一日誌採集平臺。
Graylog 是一個開源的集中式日誌管理系統,它可以收集、儲存、分析、展示和告警各種機器資料,為開發團隊提供安全、應用和 IT 基礎設施方面的問題的答案。
Graylog 可以讓我們在一個美觀的 web ui 介面上組合、關聯、查詢所有的日誌資料。
Graylog 具有以下特點和優勢:
- 高效能:Graylog 可以處理每秒數百萬條日誌,支援多節點叢集,實現水平擴充套件和負載均衡。
- 易用性:Graylog 提供了一個友好的 Web 介面,讓您可以輕鬆地構建複雜的查詢,建立自定義的儀表盤,設定靈活的告警規則,生成定期的報告等。
- 靈活性:Graylog 支援多種日誌來源,如檔案、網路、資料庫、應用程式等,可以透過外掛和 API 進行擴充套件和整合,滿足不同的業務需求和場景。
- 安全性:Graylog 支援使用 HTTPS、SSL/TLS 等加密技術來保護日誌資料的傳輸和儲存,同時也支援使用 LDAP、OAuth 2.0 等認證和授權機制來控制使用者的訪問許可權。
Graylog 使用教程:https://learn.microsoft.com/zh-cn/azure/network-watcher/network-watcher-analyze-nsg-flow-logs-graylog
最後聊兩句
本文為大家介紹了微服務架構中的 10 個最佳實踐。包含 1. 不使用微服務架構、2. 針對失敗場景進行處理、3. 構建小型服務、4. 使用輕量級通訊協議、5. 服務發現、6. 資料庫隔離、7. 實施彈性模式、8. 服務監控以及鏈路追蹤、9. 服務安全性、10.統一日誌採集。
說了這麼多,其實還是希望大家結合自身專案背景,多多思考,不要為了使用微服務而去使用微服務,在已經使用了微服務架構中專案,能夠結合上述最佳實踐,加上自己對各個服務以及業務上的思考,去解決哪些已存在的問題。這樣才算是真正學會了微服務。
關注公眾號【waynblog】每週分享技術乾貨、開源專案、實戰經驗、國外優質文章翻譯等,您的關注將是我的更新動力!