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