服務注冊與發現
核心功能
- 服務實例動態變化:實例可能因擴縮容、故障或遷移導致IP變動。
- 服務依賴解耦:調用方無需硬編碼服務地址,降低耦合度。
- 負載均衡:自動選擇健康實例,提升系統可用性。
核心組件
-
服務注冊中心(Registry) :
- 作用:存儲服務實例的元數據(如IP、端口、健康狀態、標簽),提供心跳檢測和實例狀態維護功能。
- 代表工具:Eureka、Consul、Nacos、ZooKeeper。
-
服務提供者(Provider) :啟動時向注冊中心注冊自身信息;定期發送心跳以維持注冊狀態。
-
服務消費者(Consumer) :從注冊中心獲取可用服務實例列表;通過負載均衡策略(如輪詢、權重)選擇實例發起調用。
工作流程
- 注冊階段:服務提供者啟動時,向注冊中心發送注冊請求(包含元數據);注冊中心存儲實例信息,并標記為“健康”狀態。
- 心跳維護:提供者周期性(如30秒)發送心跳包,刷新存活狀態;若注冊中心未收到心跳,標記實例為“不健康”或刪除。
- 發現階段:消費者向注冊中心查詢目標服務的實例列表;注冊中心返回當前健康的實例列表。
- 調用與負載均衡:消費者根據策略(如隨機、輪詢)選擇實例發起請求。
流量控制策略
常見限流算法
算法 | 原理 | 適用場景 | 優缺點 |
---|---|---|---|
固定窗口計數器 | 每單位時間(如1秒)允許固定數量的請求,超出則拒絕。 | 簡單場景(如API Key限流) | 實現簡單,但窗口切換時可能突發流量溢出。 |
滑動窗口計數器 | 將時間窗口細分為多個小窗口,統計最近N個小窗口的總請求量。 | 需要平滑限流的場景 | 更精準,但計算復雜度較高。 |
漏桶算法 | 請求以恒定速率處理(類似水從漏桶流出),超出桶容量則丟棄或排隊。 | 流量整形(如消息隊列消費) | 輸出流量恒定,但無法應對突發流量。 |
令牌桶算法 | 以固定速率向桶中添加令牌,請求需獲取令牌才能執行,否則拒絕或等待。 | 允許突發流量(如秒殺場景) | 靈活支持突發,但需維護令牌狀態。 |
-
單機限流:Guava RateLimiter:基于令牌桶算法,支持預熱模式。
-
分布式限流:
- Redis + Lua腳本:利用Redis的原子操作統計全局請求量。
- Sentinel:阿里開源的流量控制組件,支持集群限流和動態規則配置。
- Nginx限流模塊:通過
limit_req_zone
和limit_conn_zone
實現網關層限流。
熔斷(Circuit Breaking)
-
熔斷器:當服務調用失敗率達到閾值時,后續請求直接拒絕,避免資源耗盡。
-
熔斷器三態轉換:
- Closed(閉合) :正常處理請求,統計失敗率。
- Open(斷開) :拒絕所有請求,直接返回錯誤或降級結果。
- Half-Open(半開) :嘗試放行部分請求,若成功則恢復Closed狀態。
-
熔斷參數配置:
- 失敗率閾值:如10秒內失敗率超過50%觸發熔斷。
- 熔斷時長:Open狀態持續時間(如5秒后進入Half-Open)。
- 最小請求數:統計窗口內至少需要一定請求量才觸發熔斷(避免低流量誤判)。
- 實現工具:Hystrix、Sentinel。
降級(Fallback)
-
手動降級:運維人員通過配置中心手動觸發(如大促期間關閉積分兌換)。
-
自動降級:基于熔斷規則或系統負載自動觸發(如CPU超過80%時關閉推薦服務)。
-
降級策略:
- 返回默認值:如商品詳情頁降級時返回緩存中的靜態信息。
- 簡化流程:跳過非必要步驟(如下單時不校驗庫存,僅記錄日志異步核對)。
- 功能屏蔽:直接關閉某功能入口(如隱藏“秒殺”按鈕)。
負載均衡(Load Balancing)
-
流量分配:將請求合理分發到多個服務實例,避免單點過載。
-
健康檢查:自動剔除不健康實例,保證請求成功率。
-
負載均衡算法
算法 原理 適用場景 輪詢(Round Robin) 依次將請求分發到每個實例。 實例性能均勻的場景 加權輪詢 根據實例權重分配請求(如CPU核數多的實例權重高)。 異構硬件環境 隨機(Random) 隨機選擇一個實例。 快速簡單,無狀態場景 最小連接數 將請求分發給當前連接數最少的實例。 長連接服務(如WebSocket) 一致性哈希 相同請求參數(如用戶ID)始終路由到同一實例。 緩存服務、會話保持需求
配置中心
核心功能
- 集中化存儲:所有配置(數據庫連接、功能開關、超時參數等)存儲在統一平臺,避免配置散落在代碼或配置文件中。
- 動態更新:修改配置后無需重啟服務,實時或近實時生效(如調整日志級別、限流閾值)。
- 環境隔離:支持多環境(dev/test/prod)配置隔離,同一服務在不同環境加載不同配置。
- 版本控制與回滾:記錄配置變更歷史,支持一鍵回滾到任意版本。
- 權限與審計:配置修改需權限控制,記錄操作日志(如誰在何時修改了哪些配置)。
- 加密與安全:敏感配置(密碼、密鑰)加密存儲,傳輸過程使用TLS加密。
核心組件
-
配置存儲
- 數據庫:MySQL、PostgreSQL等,存儲配置鍵值對。
- 分布式KV存儲:Etcd、Consul,支持高可用和快速讀取。
- 文件系統:Git倉庫(如Spring Cloud Config支持Git后端)。
-
配置管理平臺:提供Web界面或API,供運維人員查看、修改和發布配置。
-
客戶端SDK:集成到服務中,負責從配置中心拉取配置并監聽變更(如Nacos Client、Spring Cloud Config Client)。
-
配置推送機制
- 長輪詢(Long Polling) :客戶端定期檢查配置變更(如Nacos)。
- WebSocket/SSE:服務端主動推送變更(實時性更高)。
工作流程
- 服務啟動:服務通過客戶端SDK從配置中心拉取當前環境的配置。
- 配置修改:管理員通過Web界面修改配置并發布。
- 配置推送:配置中心通知所有訂閱該配置的服務實例。
- 配置生效:服務動態加載新配置(如熱更新線程池大小)。
可觀測性
日志(Logs)
-
定義:系統運行時生成的文本記錄,包含時間戳、事件描述和上下文信息。
-
結構化:使用JSON格式,便于解析(如
{"level":"ERROR","time":"2023-10-05","message":"connection failed"}
)。 -
分級:DEBUG、INFO、WARN、ERROR等級別,按需采集。
-
上下文:附加請求ID、用戶ID、設備信息等,支持關聯分析。
-
工具鏈:
- 采集:Fluentd、Filebeat。
- 存儲與搜索:Elasticsearch、Loki。
- 可視化:Kibana、Grafana。
指標(Metrics)
-
定義:系統運行狀態的數值化度量(如QPS、延遲、錯誤率)。
-
核心類型:
- 計數器(Counter) :累加值(如總請求數)。
- 儀表盤(Gauge) :瞬時值(如當前內存使用量)。
- 直方圖(Histogram) :統計分布(如請求延遲的P50/P90/P99)。
- 摘要(Summary) :類似直方圖,但客戶端計算分位數。
-
工具鏈:
- 采集與存儲:Prometheus、InfluxDB。
- 可視化與告警:Grafana、Alertmanager。
追蹤(Traces)
-
定義:記錄請求在分布式系統中的完整調用鏈路,展示跨服務、跨組件的執行路徑和耗時。
-
核心概念:
-
Trace:一個請求的完整生命周期(如用戶下單請求)。
-
Span:Trace中的一個操作單元(如調用支付服務),包含:
Span ID:唯一標識。
Parent Span ID:父級Span ID,構建樹形結構。
Tags:附加信息(如HTTP狀態碼、數據庫查詢語句)。
-
上下文傳播(Context Propagation) :通過HTTP頭(如
traceparent
)在服務間傳遞Trace信息。
-
-
工具鏈:
- 采集與存儲:Jaeger、Zipkin、SkyWalking。
- 協議標準:OpenTelemetry(統一日志、指標、追蹤的API規范)。