微服務開發,這十個點你要知道
微服務架構是一種軟件開發模式,它將一個復雜的應用程序拆分為多個個獨立的、小型的、可復用的服務,每個服務負責一個特定的業務功能。
微服務架構有許多優點,例如提高系統的可擴展性、可維護性、可測試性和故障容忍性。
但是,微服務架構也有很多問題需要注意,例如如何設計合理的劃分服務接口、如何在服務間實現高效通信、如何保證數據一致性等。因此要想成功地使用微服務架構,我們需要遵循一些最佳實踐。
以下是一些微服務架構的最佳實踐,我將盡我所了解的知識給大家進行講解。本文大綱如下,
圖片
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