日調用量超三十萬億,騰訊開源百萬級服務發(fā)現和治理中心北極星


導讀
今天,騰訊云面向所有開發(fā)者,正式宣布開源北極星(Polaris Mesh),開放了應用在大規(guī)模生產環(huán)境中的源代碼,推進以微服務為核心的開源生態(tài)建設,并希望幫助業(yè)界更好地進行分布式或者微服務架構轉型。
目前很多企業(yè)在微服務實施和演化過程中,都會面臨技術棧的多樣性問題。整個微服務領域逐漸沉淀出了無數個相關組件,大家在選擇上更加困難,也為企業(yè)的基礎設施建設不斷帶來挑戰(zhàn)。騰訊也曾面臨這樣的痛點,因此從 2019 年開始騰訊開創(chuàng)了統(tǒng)一的微服務解決方案“北極星”(Polaris Mesh),通過北極星對這些組件進行抽象和整合,打造公司標準化的服務發(fā)現和治理方案,幫助業(yè)務提升研發(fā)效率和運營質量。
經過兩年的發(fā)展,北極星在騰訊內部注冊服務數量超過百萬,服務實例數量超過五百萬,接口日調用量超過三十萬億,騰訊音樂、騰訊視頻、騰訊會議、騰訊文檔、企業(yè)微信、微信支付和王者榮耀等重點產品均在使用。
9 月 8 日,騰訊云面向所有開發(fā)者,正式宣布開源北極星(Polaris Mesh),開放了應用在大規(guī)模生產環(huán)境中的源代碼,推進以微服務為核心的開源生態(tài)建設,并希望幫助業(yè)界更好地進行分布式或者微服務架構轉型。

一、從單體架構到微服務

最近十幾年,業(yè)務架構經歷了從單體到分布式再到微服務的演進。單體架構的所有代碼都在一個應用中,適合小規(guī)?;蛘叱鮿?chuàng)期的業(yè)務。如果應用模塊和開發(fā)人員的數量很少,單體架構容易開發(fā)、測試、部署和伸縮。隨著應用模塊和開發(fā)人員增加,單體架構面臨眾多問題,例如:
任何修改都需要重新編譯和部署整個系統(tǒng),變更風險大,測試成本高,編譯速度慢。
如果某個業(yè)務模塊存在缺陷,也會影響其他業(yè)務模塊,降低整個系統(tǒng)的可用性。
如果每個業(yè)務模塊的請求量不均勻,無法針對某些熱點模塊進行水平擴展。
為了解決這些問題,分布式和微服務架構將業(yè)務模塊拆分成為獨立的服務,但是整個系統(tǒng)的復雜度也急劇上升,如果沒有配套的技術組件,分布式和微服務架構很難落地。作為微服務方向的開發(fā)人員,我們都知道服務發(fā)現和治理是分布式和微服務架構中的關鍵技術,可以很好的幫助大家解決服務尋址、流量調度、故障容錯、訪問控制和可觀測性等問題,但這個關鍵技術目前在業(yè)界的開源解決方案卻各有利弊,并不完美。

二、服務發(fā)現和治理技術
目前,業(yè)界主要有三種服務發(fā)現和治理方案:
第一種方案以 Spring Cloud 為代表,在開發(fā)框架中集成了一系列服務發(fā)現和治理組件。雖然在虛擬機和容器環(huán)境中可以無差別地使用,但是需要在開發(fā)時引入多個零散的功能組件,缺少統(tǒng)一的數據面和控制面,不同的語言和框架無法統(tǒng)一管理。
第二種是 Kubernetes Service,將服務注冊到內置的 etcd,采用域名解析插件實現服務發(fā)現,但有個缺點是無法提供服務治理功能。
第三種是以 Istio 為代表的服務網格,通過劫持業(yè)務請求的方式實現服務發(fā)現和治理。這種方案對開發(fā)代碼的侵入性低,具備統(tǒng)一的數據面和控制面,但是需要部署流量代理進程,同時還會增加運維成本,存在較大的資源和性能損耗。
我們認為上述三種方案各有優(yōu)劣,不是誰取代誰的問題,而是互相融合,滿足不同的業(yè)務需求。騰訊內部絕大部分核心業(yè)務使用第一種方案,也有不少業(yè)務在 Kubernetes 上使用其他兩種方案,但是依然存在跨部門業(yè)務系統(tǒng)間數據無法打通、缺少標準化的服務治理的問題。
為了能夠融合上述三種解決方案的優(yōu)點,同時規(guī)避它們的缺點,我們開創(chuàng)了統(tǒng)一的解決方案——北極星,致力于打造騰訊新一代服務發(fā)現和治理中心,解決原有平臺存在的問題,并且支持無縫遷移,實現公司服務的互聯互通和統(tǒng)一治理。目前,北極星的注冊服務數量超過百萬,服務實例數量超過五百萬,接口日調用量超過三十萬億,騰訊音樂、騰訊視頻、騰訊會議、騰訊文檔、企業(yè)微信、微信支付和王者榮耀等重點業(yè)務均在使用。

三、北極星是什么?
北極星(Polaris Mesh)是騰訊自研的服務發(fā)現和治理中心,以服務注冊中心為基礎,擴展了服務治理功能以及相應的控制面,提供多語言的客戶端實現,不同的開發(fā)框架可以集成使用。隨著容器化和云原生的推進,北極星也支持了 Kubernetes 服務和網格 Sidecar 的自動接入,實現了它們之間互聯互通和統(tǒng)一治理。
3.1 功能性能

注冊發(fā)現:北極星的基礎部分是一個大容量和高可用的服務注冊中心,除了支持多種協(xié)議的服務注冊和發(fā)現,還支持對注冊的服務實例進行健康檢查,避免主調方將請求發(fā)送給異常實例。在圍繞服務構建的分布式應用架構中,服務注冊和發(fā)現至關重要,可以提高應用的擴展能力,降低應用的遷移成本。 流量調度:北極星提供動態(tài)路由和負載均衡兩種類型的流量調度功能。動態(tài)路由根據請求標簽、實例標簽和標簽匹配規(guī)則,可以實現按地域就近、單元化隔離和金絲雀發(fā)布等多種路由策略。負載均衡將請求均衡地分配給不同的被調方實例,支持權重隨機、最小負載和權重一致性 Hash 等多種均衡算法。 熔斷降級:北極星支持實例、接口和服務三種粒度的熔斷策略。如果被調方的部分實例發(fā)生熔斷,將請求分配給其他實例。如果被調方的某個接口或者服務發(fā)生熔斷,根據降級策略直接返回。網絡抖動、機器故障和程序缺陷等因素都可能導致實例、接口或者服務出現異常,熔斷降級可以提高業(yè)務的請求成功率。 訪問控制:北極星提供鑒權和限流兩種訪問控制功能。被調方可以設置鑒權規(guī)則,允許哪些主調方訪問自己,不允許哪些主調方訪問自己。被調方也可以設置單機或者分布式限流規(guī)則,一方面防止突發(fā)流量壓垮自己,導致自己完全不可用,一方面防止部分主調方的請求量過多,消耗大量資源,影響其他主調方。 服務網格:對于上述服務發(fā)現和治理功能,北極星提供統(tǒng)一的控制面和數據面。數據面功能采用配置化的實現方式,控制面可以下發(fā)服務數據和治理規(guī)則到數據面,動態(tài)調整數據面的執(zhí)行策略。數據面支持 多語言 SDK 和 Sidecar 兩種模式。
核心組件:控制臺、控制面和數據面
生態(tài)組件:用于框架、網關和 Kubernetes 對接
北極星控制面既包含服務注冊中心,也包含服務治理控制面,服務治理控制面相當于業(yè)界服務網格的控制面。數據面分為 SDK 和 Sidecar 兩種模式。SDK 模式提供多語言的實現,不需要劫持業(yè)務請求,和業(yè)務請求的協(xié)議無關,適合集成在開發(fā)框架里使用。Sidecar 模式需要劫持業(yè)務請求,存在性能和資源損耗,部署和運維成本高,適合 無侵入的開發(fā)場景。
為了降低業(yè)務的使用成本,北極星提供三種類型的生態(tài)組件。第一類用于各種開發(fā)框架和北極星數據面的無縫集成,框架用戶不需要直接調用北極星數據面,減少開發(fā)的侵入性;第二類用于各種網關和北極星數據面的無縫集成,支持網關將請求直接轉發(fā)到北極星服務;第三類生態(tài)組件只有 polaris-controller,支持 Kubernetes 服務和網格 Sidecar 的自動接入。
3.3 最佳實踐
目前,騰訊常用的框架、網關和容器平臺已經集成北極星,形成了以北極星為核心的服務發(fā)現和治理體系。下面介紹北極星在騰訊的最佳實踐:
第一,作為公司統(tǒng)一的服務發(fā)現平臺,實現公司內網服務的互聯互通。北極星采用計算和存儲分離的架構,計算層可以隨著客戶端數量的增加平行擴展,輕松支持百萬級客戶端接入。同時服務端提供同城多中心或者跨城多中心等多種部署模式,滿足不同的容災要求。
第二,為不同的開發(fā)語言和框架提供統(tǒng)一的服務發(fā)現和治理功能。騰訊業(yè)務線眾多,開發(fā)語言和框架也眾多,北極星數據面支持多語言 SDK 和 Sidecar 兩種模式??蚣芸梢灾苯蛹上鄳Z言的 SDK,不需要部署 Sidecar,不會增加運維成本,沒有性能和資源損耗。
第三,作為網關到內網服務的連接器。網關可以集成北極星,將請求直接轉發(fā)到北極星服務,實現微服務網關的能力。
第四,現有的開源組件主要分為兩個體系,一個圍繞服務注冊中心和開發(fā)框架打造,一個圍繞 Kubernetes 服務和網格打造。兩個體系各自有各自的亮點和局限,隨著容器化和云原生的推進,越來越多企業(yè)同時使用兩個體系。但是兩個體系的實現存在割裂,給業(yè)務增加了不必要的使用成本。北極星對兩個體系進行了融合,為虛擬機和容器環(huán)境、開發(fā)框架和網格提供一體化的服務發(fā)現和治理方案。

四、北極星和開源生態(tài)的關系

北極星客戶端可以集成到各種框架中,讓裸的開發(fā)框架快速升級為分布式和微服務框架,具備完整的服務發(fā)現和治理功能。
騰訊業(yè)務常用的框架均已集成北極星,其中除了自研框架,還有 gRPC、Spring 和 Gin 等開源框架。如上所述,這些集成也會作為北極星的生態(tài)組件開源,框架用戶可以直接引入,邏輯代碼不需要任何改動。
4.2 北極星和網關

網關和框架的情況類似,北極星也可以和常見的開源網關集成使用。
4.3 北極星和Kubernetes

隨著容器化和云原生的推進,越來越多企業(yè)開始使用 Kubernetes 部署服務,騰訊也不例外。
在 Kubernetes 環(huán)境上,除了注冊中心和框架,還有兩種服務發(fā)現和治理方案:
Kubernetes 服務:通過 DNS 域名解析實現服務發(fā)現,采用 iptables 或者 IPVS 實現負載均衡。這種方案簡單易用,但是缺少其他服務治理能力,大規(guī)模服務存在性能瓶頸。
網格:通過劫持業(yè)務請求實現服務發(fā)現和治理。這種方案功能全面,但是存在 CPU 和性能損耗,運維成本高。
在騰訊內部,絕大部分業(yè)務使用注冊中心和框架的方案,也有不少業(yè)務使用 Kubernetes 服務,網格還在小范圍嘗試階段。
北極星提供 polaris-controller,支持 Kubernetes 服務和網格 Sidecar 自動注入,實現三種方案的聯通和統(tǒng)一治理。

五、北極星開源規(guī)劃
北極星開源版本直接來自騰訊的生產代碼,我們已經將主體部分提交到社區(qū)。期待更多感興趣、有能力的開發(fā)者參與共建,后續(xù)計劃包括但不限于:
完善服務發(fā)現和治理功能
提供更多語言的數據面 SDK
優(yōu)化數據面 Sidecar 的性能
加強北極星和相關開源組件的集成
完善項目文檔
引入其他公司的開源愛好者
截至目前,騰訊共對外開源超過 130 個優(yōu)質項目,代碼貢獻者超過 2000 人,開源項目 star 總數超過 37 萬個。北極星作為微服務領域新推出的開源項目,也非常歡迎感興趣的小伙伴在北極星 Github 上提交 issue 與 PR 進行討論和貢獻,或加入北極星社區(qū)群參與社區(qū)討論。
掃碼進群交流群,若群已滿員,
請?zhí)砑印癿idwareQmei”微信,并發(fā)送進群暗號“polaris”
北極星 GitHub:https://github.com/polarismesh/polaris
北極星官網地址:https://polarismesh.cn/
往期
推薦
《玩轉 Kafka Raft 模式 - 入門寶典》
《服務器又崩了?深度解析高可用架構的挑戰(zhàn)和實踐》
《Kratos技術系列|從Kratos設計看Go微服務工程實踐》

掃描下方二維碼關注本公眾號,
了解更多微服務、消息隊列的相關信息!
解鎖超多鵝廠周邊!

