從微服務到(arrive)服務網格
何謂微服務?據維基百科的(of)定義:微服務是(yes)一(one)種軟件架構風格,它是(yes)以(by)專注于(At)單一(one)責任與功能的(of)小型功能區塊爲(for)基礎,利用(use)模塊化的(of)方式組合出(out)複雜的(of)大(big)型應用(use)程序,各功能區塊使用(use)與語言無關的(of) API 集相互通信。
Service Mesh 最早在(exist) 2016 年 9 月 29 日由開發 Linkerd 的(of) Buoyant 公司首次提出(out),Service Mesh 是(yes)用(use)于(At)處理服務間通信的(of)基礎設施層,它負責通過構成現代雲原生(born)應用(use)程序的(of)複雜拓撲結構來(Come)可靠地(land)傳遞請求。
因此 Service Mesh 也被稱爲(for)微服務時(hour)代的(of) TCP 協議。
第一(one)代微服務的(of)常見架構如下圖所示:
在(exist)黃色的(of)容器内有服務 A、服務 B。A 和(and) B 都包含自己的(of)業務邏輯,如果想要(want) A 調用(use) B,同時(hour)試圖對這(this)個(indivual)服務進行治理,通常會在(exist)業務的(of)内部集成一(one)個(indivual) SDK,來(Come)實現服務發現、負載均衡、服務路由、重試、熔斷限流等功能。
但是(yes),這(this)個(indivual)架構存在(exist)三個(indivual)主要(want)問題:
第一(one),開發成本。因爲(for) A 和(and) B 的(of)服務已經是(yes)微服務了(Got it),它們(them)可能是(yes)由不(No)同語言開發的(of)而且各自的(of)框架可能也不(No)同,如果希望把綠色的(of)部分進行升級或者提供新的(of)功能,就需要(want)重複的(of)叠代和(and)開發。
第二,升級成本。因爲(for) SDK 的(of)部分跟業務耦合在(exist)一(one)起,在(exist)新增一(one)些能力時(hour)需要(want)重新部署業務的(of)模塊。
第三,部署成本。由于(At)相關治理的(of)功能需要(want)耦合在(exist)業務的(of)配置裏面,所以(by)很難做到(arrive)實時(hour)的(of)下發配置,服務間拓撲關系和(and)治理配置無法統一(one)管理。
Service Mesh 是(yes)如何解決這(this)些問題的(of)?
如下圖左側所示,它通過将 SDK 、開發框架提供的(of)服務治理能力下沉到(arrive)一(one)個(indivual)和(and)業務進程獨立的(of)輕量級網絡代理中,由這(this)個(indivual)網絡代理作(do)爲(for)微服務通信的(of)基礎設施層,它可以(by)提供業務無關、語言無關、獨立演進,透明升級的(of)特性。這(this)個(indivual)輕量級的(of)網絡進程被稱作(do) Sidecar 代理,是(yes)服務網格的(of)數據面。
同時(hour)如右側所示,通過一(one)個(indivual)對 Sidecar 進行統一(one)控制和(and)管理的(of)服務控制平面,來(Come)提供對微服務治理和(and)運維的(of)統一(one)入口。
這(this)種架構實現了(Got it)服務治理技術和(and)業務邏輯的(of)解耦,是(yes)雲原生(born)時(hour)代微服務治理技術的(of)發展方向,也得到(arrive)了(Got it)越來(Come)越多的(of)公司的(of)關注。
百度微服務治理的(of)現狀和(and)痛點
百度在(exist)服務網格以(by)及微服務相關的(of)探索大(big)概可以(by)追溯到(arrive) 2013 年,當時(hour)在(exist)内部獨立部署了(Got it)流量轉發系統,同時(hour)在(exist)一(one)些業務有所推廣實施;2016 年 Service Mesh 這(this)個(indivual)概念被首次提出(out),因爲(for)百度本身有相關需求,便嘗試引入 Mesh 的(of)概念,于(At)是(yes)内部自研了(Got it)一(one)套遵循社區 Mesh 概念的(of)通過 Golang 開發的(of)包含控制面和(and)數據面的(of) BMesh 系統,在(exist)搜索服務前端服務上(superior)線,不(No)過沒有在(exist)特别多業務推廣;直到(arrive) 2019 年,百度内部做了(Got it)擁抱開源的(of)決定,希望基于(At)社區方案:Istio + Envoy 進行深度定制開發。
目前,百度核心業務線已全面完成了(Got it)微服務架構改造,基于(At)微服務構建了(Got it)包括百度信息流、百度 App、百度地(land)圖、百度小程序等核心業務的(of)應用(use)架構;微服務模塊大(big)量采用(use) C++、Golang、PHP、Java 等語言來(Come)開發和(and)快速叠代;而且百度長期積澱了(Got it)許多自研和(and)二次開發的(of)開源微服務框架:bRPC、GDP、ODP、SpringCloud 等, 這(this)些微服務間通信除了(Got it)标準的(of) HTTP、GRPC 協議外,廣泛地(land)采用(use)了(Got it)大(big)量的(of)私有協議,比如 baidu-std、Nshead 等。
所以(by)百度的(of)核心業務線形成了(Got it)多開發語言、多開發框架和(and)多通信協議構成的(of)複雜的(of)異構系統,傳統的(of)基于(At)入侵的(of)微服務框架已經不(No)能滿足這(this)種複雜系統的(of)服務治理要(want)求——升級 Mesh 迫在(exist)眉睫!
在(exist)升級之前,有一(one)些重點問題需要(want)綜合考慮:
改造成本 各種各樣的(of)微服務框架網格化改造和(and)适配 各種各樣的(of)通信協議支持
性能問題和(and)資源問題 因爲(for) Sidecar 的(of)引入,微服務間的(of)通信鏈路變長,業務延遲增加,甚至某些敏感業務無法接受 Sidecar 帶來(Come)的(of)額外損耗。 Sidecar 自身會消耗資源,增加業務的(of)成本。
規模問題 随着 Sidecar 規模的(of)增長,開源的(of)控制平面計算開銷變大(big),導緻 Mesh 配置下發時(hour)間變長,甚至無法工作(do)。
百度服務網格整體方案
如何解決這(this)些問題?
在(exist)服務網格的(of)技術選型問題上(superior),百度選擇了(Got it)開源的(of) Istio + Envoy 作(do)爲(for)網格控制面和(and)數據面,在(exist)其上(superior)進行深度的(of)定制和(and)開發。
但是(yes) Istio + Envoy 的(of)社區方案和(and) K8S 的(of)技術生(born)态進行了(Got it)深度綁定。而在(exist)百度内部有自研的(of)基礎技術平台,包括對标 K8S 的(of) PaaS 部署系統、Trace 系統、監控系統和(and) Naming 系統等,這(this)些都是(yes)業務模塊包括 Istio + Envoy 部署運行的(of)依賴系統。所以(by),将 Istio + Envoy 和(and)内部依賴系統進行了(Got it)深度的(of)技術融合,打通了(Got it)公司基礎技術平台,降低了(Got it)業務接入成本。
在(exist)數據面和(and)控制面之上(superior),又建設了(Got it) Mesh 控制中心,即微服務的(of)配置管理中心,提供服務治理和(and)運維的(of)統一(one)入口;基于(At)底層架構的(of)建設,向上(superior)提供了(Got it)流量複制、負載均衡、過載保護、流量鏡像等系統能力。
這(this)些系統能力在(exist)核心業務的(of)服務治理、運維止損、容量管理、混沌工程和(and)服務可觀測等場景中得到(arrive)了(Got it)應用(use),并且取得了(Got it)不(No)錯的(of)業務收益和(and)使用(use)效果。
那麽,實現這(this)樣一(one)套系統,我(I)們(them)需要(want)解決哪些問題呢?
網格接入優化方案
首先是(yes)流量劫持方案的(of)問題,在(exist)社區方案中,一(one)般是(yes)通過 Naming Service(如:DNS 服務)獲取到(arrive)目标 Server 的(of)真實地(land)址。同時(hour),通過配置 iptables 進行流量劫持,将客戶端的(of)請求直接轉發給 Sidecar。但是(yes),當 iptables 配置有大(big)量匹配規則時(hour)有性能的(of)問題,而且無法動态修改客戶端訪問服務端的(of)行爲(for),如:重試、超時(hour)等,且沒有辦法平滑的(of)在(exist) Mesh 和(and)非 Mesh 模式切換。
在(exist)百度内部采用(use)了(Got it)另外一(one)種劫持的(of)方案,首先 Sidecar 啓動的(of)時(hour)候會将自己注冊給 Naming Service(在(exist)百度内部叫 BNS),在(exist)框架經過 Naming Service 查詢的(of)時(hour)候,框架的(of)内部集成了(Got it)一(one)個(indivual)和(and) Naming Service 對接的(of)小模塊,這(this)個(indivual)小模塊從 Naming Service 拿到(arrive)的(of)就是(yes) Sidecar 的(of)地(land)址,動态的(of)改變了(Got it)目标服務器的(of)地(land)址,直接将目标的(of) IP 變成 Sidecar 的(of)地(land)址(loopbackIp),同時(hour),還會覆蓋客戶端的(of)重試、超時(hour)等參數,這(this)一(one)切對業務來(Come)說都是(yes)無感的(of)。
這(this)樣就可以(by)很便捷的(of)調整客戶端服務治理參數、切換 Mesh 和(and)非 Mesh 模式。因爲(for)如果 Sidecar 挂掉了(Got it),會在(exist) Naming 系統裏把自己解除注冊,這(this)樣上(superior)遊的(of)框架會自然而然的(of)訪問下遊服務的(of)真實地(land)址了(Got it)。
第二,對自有協議的(of)支持的(of)問題。在(exist)社區裏面是(yes)支持不(No)同的(of)協議,比如 HTTP、Thrift、Dubbo,但會涉及重複的(of)開發。如果要(want)支持一(one)個(indivual)新協議,可能需要(want)重新實現超時(hour)控制、重試、請求路由、流量鏡像等。百度内部将這(this)通用(use)的(of)部分單獨剝離出(out)來(Come):于(At)是(yes)支持一(one)個(indivual)新的(of)協議變得簡單起來(Come),我(I)們(them)隻需要(want)将下圖中綠色的(of)部實現簡單的(of) Codec,即:将這(this)個(indivual)協議進行編解碼就可以(by),大(big)大(big)降低開發支持新協議的(of)成本。
最後是(yes)對多框架和(and)協議的(of)支持問題。Mesh 對協議的(of)要(want)求包括具有請求特征信息擴展的(of)能力,可以(by)實現請求特征路由;具有元信息擴展能力:能夠在(exist)框架和(and) Sidecar 間傳遞信息(如:一(one)緻性哈希的(of) Code),在(exist)上(superior)下遊服務模塊間傳遞信息(如:TraceID,SpanID) 内部傳統的(of)老協議如何接入 Mesh?通過框架實現協議升級,用(use)可擴展的(of) baidu-std 協議封裝老協議進行傳輸,到(arrive)達下遊服務之後再由框架拆解開報文。
服務網格性能優化
針對代理架構如下圖所示,社區方案是(yes)從 APP1 進入 Sidecar 再到(arrive)下遊服務的(of) Sidecar 再到(arrive) APP2,這(this)裏面經過了(Got it)兩次 Sidecar,會有兩倍延遲或者兩倍資源開銷,在(exist)百度内部可能并沒有這(this)麽複雜,沒有對這(this)個(indivual)很高要(want)求的(of)場景,多數情況下隻經過 Sidecar 一(one)次。比如,APP1 經過 Sidecar 後直接到(arrive)達了(Got it) APP2,并沒有再次經過 Sidecar。
另外一(one)種模式,内部很敏感的(of)業務并不(No)希望經過 Sidecar。比如,APP2 通過框架直接訪問到(arrive) APP3,并沒有經過任何的(of) Sidecar。下圖左是(yes)經過一(one)次 Sidecar 的(of)模式(在(exist)百度内部稱爲(for)一(one)跳)這(this)是(yes)通過 NamingService 注冊再訪問本地(land) IP。而下圖右 Proxyless 模式 Sidecar 會将自己服務的(of)參數以(by)及目标服務的(of) IP 通過 NamingService 下發給框架,框架擁有下遊服務的(of) IP 以(by)及服務治理的(of)全部參數,可以(by)直接完成訪問。
針對數據面性能方面的(of)優化,社區的(of) Envoy 在(exist)性能方面并不(No)是(yes)特别優越,所以(by)。百度整合了(Got it)一(one)個(indivual) bRPC 開源框架作(do)爲(for)内核去轉發流量,在(exist)上(superior)層 bRPC 框架依然兼容了(Got it) xDS 協議(服務治理參數的(of)協議),便于(At)同步社區的(of)新設計、新變化,做到(arrive)了(Got it)魚和(and)熊掌都可以(by)兼得的(of)效果,經過升級内核的(of)版本以(by)後,在(exist)各個(indivual)延時(hour)、長尾以(by)及 CPU 使用(use)率上(superior)都有很好的(of)優化。
最後是(yes)控制面性能優化,控制面在(exist)沒有配置 Sidecar CRD 的(of)情況下,會下發所有的(of)服務列表,我(I)們(them)通過内部的(of)關鍵路徑優化,實際上(superior)隻會下發 Sidecar 關注的(of)下遊,大(big)大(big)減少控制面對配置計算以(by)及下發的(of)性能優化。
經過上(superior)述改造後,最後就完成了(Got it)百度内部對 Mesh 的(of)整體優化和(and)修改。
業務收益及案例啓示
經過上(superior)圖所展示的(of)高級服務治理策略,在(exist) SLA 以(by)及故障恢複時(hour)間上(superior)都有很高的(of)優化。在(exist)此基礎上(superior)還有全局的(of)智能容災系統,可以(by)優化高級服務策略參數
服務可觀測性方面,可以(by)通過框架傳遞 TraceID、SpanID 等,再通過 Sidecar 再采集到(arrive)内部的(of) Trace 平台和(and)監控平台,可以(by)在(exist)内部的(of)監控平台上(superior)展示 Trace,方便監控以(by)及進行故障的(of)排查和(and)追蹤。
自動止損方面,整個(indivual)系統結合内部的(of)監控平台,監控平台将這(this)些指标存儲在(exist)自己的(of)平台上(superior),穩定性預案平台根據監控平台的(of)指标異常進行實時(hour)調參,執行流量降級、切機房、切流等。同時(hour)這(this)個(indivual)效果會實時(hour)反饋給監控平台,包括穩定性預案平台持續的(of)對系統進行調參,形成閉環。
混沌工程方面,會通過控制平面下發給故障任務,然後控制平面将命令下發給 Sidecar,Sidecar 通過這(this)個(indivual)命令注入一(one)些延遲,這(this)樣去影響内部的(of)系統,内部系統同樣會産生(born)監控的(of)指标,這(this)些指标再上(superior)報給監控平台,然後混沌平台再通過這(this)些指标評估系統的(of)彈性以(by)及容錯等。
系統容量評估方面,容量平台可以(by)發起壓測任務,這(this)個(indivual)任務對接到(arrive)控制平面。如:由控制平面下發切 20% 的(of)流量到(arrive)某下遊服務,對它進行壓測,實時(hour)産生(born)的(of)指标上(superior)報給監控平台,容量平台對監控平台的(of)指标進行實時(hour)評估。
百度内部業務接入情況:
百度 App、信息流、百度地(land)圖、智能小程序、好看視頻等産品線
接入實例十萬級
每天處理請求數千億次
業務接入收益:
大(big)幅提升核心鏈路的(of)可用(use)性和(and)系統整體容災、防雪崩能力
大(big)大(big)降低治理叠代成本、服務治理叠代周期從數月縮短到(arrive)天級别
解鎖服務可觀測,自動止損,容量探測等高級場景能力
最後,喬元才總結了(Got it)通過接入 Mesh 服務網格得到(arrive)的(of)一(one)些啓示:
服務網格不(No)是(yes)微服務治理的(of)銀彈
完全無入侵的(of),支持所有協議,所有框架和(and)所有治理策略的(of) Mesh 方案是(yes)不(No)存在(exist)的(of)
大(big)規模工業化落地(land)的(of)平滑、穩定可控接入方案,涉及到(arrive)大(big)量對已有服務治理組件的(of)兼容升級和(and)改造
服務網格确實實現了(Got it)業務邏輯和(and)服務治理架構的(of)解耦,解鎖了(Got it)很多新能力
服務網格結合可觀測、故障止損、混沌工程,容量管理等場景化,才能發揮出(out)最大(big)價值
百度智能雲已開放包括服務網格在(exist)内的(of)多項微服務産品,歡迎試用(use):https://cloud.baidu.com/product/cnap.html
上(superior)一(one)篇:騰訊視頻出(out)現宕機與什麽有關
下一(one)篇:企業百家号藍V認證與不(No)認證有什麽區别?藍V認證