目前很多企業(yè)在微服務(wù)實(shí)施和演化過程中,都會(huì)面臨技術(shù)棧的多樣性問題。整個(gè)微服務(wù)領(lǐng)域逐漸沉淀出了無數(shù)個(gè)相關(guān)組件,大家在選擇上更加困難,也為企業(yè)的基礎(chǔ)設(shè)施建設(shè)不斷帶來挑戰(zhàn)。騰訊也曾面臨這樣的痛點(diǎn),因此從 2019 年開始騰訊開創(chuàng)了統(tǒng)一的微服務(wù)解決方案“北極星”(Polaris Mesh),通過北極星對(duì)這些組件進(jìn)行抽象和整合,打造公司標(biāo)準(zhǔn)化的服務(wù)發(fā)現(xiàn)和治理方案,幫助業(yè)務(wù)提升研發(fā)效率和運(yùn)營(yíng)質(zhì)量。
經(jīng)過兩年的發(fā)展,北極星在騰訊內(nèi)部注冊(cè)服務(wù)數(shù)量超過百萬,服務(wù)實(shí)例數(shù)量超過五百萬,接口日調(diào)用量超過三十萬億,騰訊音樂、騰訊視頻、騰訊會(huì)議、騰訊文檔、企業(yè)微信、微信支付和王者榮耀等重點(diǎn)產(chǎn)品均在使用。
9 月 8 日,騰訊云面向所有開發(fā)者,正式宣布開源北極星(Polaris Mesh),開放了應(yīng)用在大規(guī)模生產(chǎn)環(huán)境中的源代碼,推進(jìn)以微服務(wù)為核心的開源生態(tài)建設(shè),并希望幫助業(yè)界更好地進(jìn)行分布式或者微服務(wù)架構(gòu)轉(zhuǎn)型。
一、從單體到微服務(wù)架構(gòu)
最近十幾年,業(yè)務(wù)架構(gòu)經(jīng)歷了從單體到分布式再到微服務(wù)的演進(jìn)。單體架構(gòu)的所有代碼都在一個(gè)應(yīng)用中,適合小規(guī)模或者初創(chuàng)期的業(yè)務(wù)。如果應(yīng)用模塊和開發(fā)人員的數(shù)量很少,單體架構(gòu)容易開發(fā)、測(cè)試、部署和伸縮。隨著應(yīng)用模塊和開發(fā)人員增加,單體架構(gòu)面臨眾多問題,例如:
- 任何修改都需要重新編譯和部署整個(gè)系統(tǒng),變更風(fēng)險(xiǎn)大,測(cè)試成本高,編譯速度慢。
- 如果某個(gè)業(yè)務(wù)模塊存在缺陷,也會(huì)影響其他業(yè)務(wù)模塊,降低整個(gè)系統(tǒng)的可用性。
- 如果每個(gè)業(yè)務(wù)模塊的請(qǐng)求量不均勻,無法針對(duì)某些熱點(diǎn)模塊進(jìn)行水平擴(kuò)展。
為了解決這些問題,分布式和微服務(wù)架構(gòu)將業(yè)務(wù)模塊拆分成為獨(dú)立的服務(wù),但是整個(gè)系統(tǒng)的復(fù)雜度也急劇上升,如果沒有配套的技術(shù)組件,分布式和微服務(wù)架構(gòu)很難落地。作為微服務(wù)方向的開發(fā)人員,我們都知道服務(wù)發(fā)現(xiàn)和治理是分布式和微服務(wù)架構(gòu)中的關(guān)鍵技術(shù),可以很好的幫助大家解決服務(wù)尋址、流量調(diào)度、故障容錯(cuò)、訪問控制和可觀測(cè)性等問題,但這個(gè)關(guān)鍵技術(shù)目前在業(yè)界的開源解決方案卻各有利弊,并不完美。
二、服務(wù)發(fā)現(xiàn)和治理技術(shù)
目前,業(yè)界主要有三種服務(wù)發(fā)現(xiàn)和治理方案:
- 第一種方案以 Spring Cloud 為代表,在開發(fā)框架中集成了一系列服務(wù)發(fā)現(xiàn)和治理組件。雖然在虛擬機(jī)和容器環(huán)境中可以無差別地使用,但是需要在開發(fā)時(shí)引入多個(gè)零散的功能組件,缺少統(tǒng)一的數(shù)據(jù)面和控制面,不同的語(yǔ)言和框架沒有無法統(tǒng)一管理。
- 第二種是 Kubernetes Service,將服務(wù)注冊(cè)到內(nèi)置的 etcd,采用域名解析插件實(shí)現(xiàn)服務(wù)發(fā)現(xiàn),但有個(gè)缺點(diǎn)是無法提供服務(wù)治理功能。
- 第三種是以 Istio 為代表的服務(wù)網(wǎng)格,通過劫持業(yè)務(wù)請(qǐng)求的方式實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和治理。這種方案對(duì)開發(fā)代碼的侵入性低,具備統(tǒng)一的數(shù)據(jù)面和控制面,但是需要部署流量代理進(jìn)程,同時(shí)還會(huì)增加運(yùn)維成本,存在較大的資源和性能損耗。
我們認(rèn)為上述三種方案各有優(yōu)劣,不是誰(shuí)取代誰(shuí)的問題,而是互相融合,滿足不同的業(yè)務(wù)需求。騰訊內(nèi)部絕大部分核心業(yè)務(wù)使用第一種方案,也有不少業(yè)務(wù)在 Kubernetes 上使用其他兩種方案,但是依然存在跨部門業(yè)務(wù)系統(tǒng)間數(shù)據(jù)無法打通、缺少標(biāo)準(zhǔn)化的服務(wù)治理的問題。
為了能夠融合上述三種解決方案的優(yōu)點(diǎn),同時(shí)規(guī)避它們的缺點(diǎn),我們開創(chuàng)了統(tǒng)一的解決方案——北極星,致力于打造騰訊新一代服務(wù)發(fā)現(xiàn)和治理中心,解決原有平臺(tái)存在的問題,并且支持無縫遷移,實(shí)現(xiàn)公司服務(wù)的互聯(lián)互通和統(tǒng)一治理。目前,北極星的注冊(cè)服務(wù)數(shù)量超過百萬,服務(wù)實(shí)例數(shù)量超過五百萬,接口日調(diào)用量超過三十萬億,騰訊音樂、騰訊視頻、騰訊會(huì)議、騰訊文檔、企業(yè)微信、微信支付和王者榮耀等重點(diǎn)業(yè)務(wù)均在使用。
三、北極星是什么?
北極星(Polaris Mesh)是騰訊自研的服務(wù)發(fā)現(xiàn)和治理中心,以服務(wù)注冊(cè)中心為基礎(chǔ),擴(kuò)展了服務(wù)治理功能以及相應(yīng)的控制面,提供多語(yǔ)言的客戶端實(shí)現(xiàn),不同的開發(fā)框架可以集成使用。隨著容器化和云原生的推進(jìn),北極星也支持了 Kubernetes 服務(wù)和網(wǎng)格 Sidecar 的自動(dòng)接入,實(shí)現(xiàn)了它們之間互聯(lián)互通和統(tǒng)一治理。
3.1 功能特性
北極星主要有五大功能:
- 注冊(cè)發(fā)現(xiàn):北極星的基礎(chǔ)部分是一個(gè)大容量和高可用的服務(wù)注冊(cè)中心,除了支持多種協(xié)議的服務(wù)注冊(cè)和發(fā)現(xiàn),還支持對(duì)注冊(cè)的服務(wù)實(shí)例進(jìn)行健康檢查,避免主調(diào)方將請(qǐng)求發(fā)送給異常實(shí)例。在圍繞服務(wù)構(gòu)建的分布式應(yīng)用架構(gòu)中,服務(wù)注冊(cè)和發(fā)現(xiàn)至關(guān)重要,可以提高應(yīng)用的擴(kuò)展能力,降低應(yīng)用的遷移成本。
- 流量調(diào)度:北極星提供動(dòng)態(tài)路由和負(fù)載均衡兩種類型的流量調(diào)度功能。動(dòng)態(tài)路由根據(jù)請(qǐng)求標(biāo)簽、實(shí)例標(biāo)簽和標(biāo)簽匹配規(guī)則,可以實(shí)現(xiàn)按地域就近、單元化隔離和金絲雀發(fā)布等多種路由策略。負(fù)載均衡將請(qǐng)求均衡地分配給不同的被調(diào)方實(shí)例,支持權(quán)重隨機(jī)、最小負(fù)載和權(quán)重一致性 Hash 等多種均衡算法。
- 熔斷降級(jí):北極星支持實(shí)例、接口和服務(wù)三種粒度的熔斷策略。如果被調(diào)方的部分實(shí)例發(fā)生熔斷,將請(qǐng)求分配給其他實(shí)例。如果被調(diào)方的某個(gè)接口或者服務(wù)發(fā)生熔斷,根據(jù)降級(jí)策略直接返回。網(wǎng)絡(luò)抖動(dòng)、機(jī)器故障和程序缺陷等因素都可能導(dǎo)致實(shí)例、接口或者服務(wù)出現(xiàn)異常,熔斷降級(jí)可以提高業(yè)務(wù)的請(qǐng)求成功率。
- 訪問控制:北極星提供鑒權(quán)和限流兩種訪問控制功能。被調(diào)方可以設(shè)置鑒權(quán)規(guī)則,允許哪些主調(diào)方訪問自己,不允許哪些主調(diào)方訪問自己。被調(diào)方也可以設(shè)置單機(jī)或者分布式限流規(guī)則,一方面防止突發(fā)流量壓垮自己,導(dǎo)致自己完全不可用,一方面防止部分主調(diào)方的請(qǐng)求量過多,消耗大量資源,影響其他主調(diào)方。
- 服務(wù)網(wǎng)格:對(duì)于上述服務(wù)發(fā)現(xiàn)和治理功能,北極星提供統(tǒng)一的控制面和數(shù)據(jù)面。數(shù)據(jù)面功能采用配置化的實(shí)現(xiàn)方式,控制面可以下發(fā)服務(wù)數(shù)據(jù)和治理規(guī)則到數(shù)據(jù)面,動(dòng)態(tài)調(diào)整數(shù)據(jù)面的執(zhí)行策略。數(shù)據(jù)面支持?多語(yǔ)言?SDK 和 Sidecar 兩種模式。
3.2 系統(tǒng)組件
北極星系統(tǒng)組件分為核心和生態(tài)兩個(gè)部分:
- 核心組件:控制臺(tái)、控制面和數(shù)據(jù)面
- 生態(tài)組件:用于框架、網(wǎng)關(guān)和 Kubernetes 對(duì)接
北極星控制面既包含服務(wù)注冊(cè)中心,也包含服務(wù)治理控制面,服務(wù)治理控制面相當(dāng)于業(yè)界服務(wù)網(wǎng)格的控制面。數(shù)據(jù)面分為 SDK 和 Sidecar 兩種模式。SDK 模式提供多語(yǔ)言的實(shí)現(xiàn),不需要劫持業(yè)務(wù)請(qǐng)求,和業(yè)務(wù)請(qǐng)求的協(xié)議無關(guān),適合集成在開發(fā)框架里使用。Sidecar 模式需要劫持業(yè)務(wù)請(qǐng)求,存在性能和資源損耗,部署和運(yùn)維成本高,適合?無侵入?的開發(fā)場(chǎng)景。
為了降低業(yè)務(wù)的使用成本,北極星提供三種類型的生態(tài)組件。第一類用于各種開發(fā)框架和北極星數(shù)據(jù)面的無縫集成,框架用戶不需要直接調(diào)用北極星數(shù)據(jù)面,減少開發(fā)的侵入性;第二類用于各種網(wǎng)關(guān)和北極星數(shù)據(jù)面的無縫集成,支持網(wǎng)關(guān)將請(qǐng)求直接轉(zhuǎn)發(fā)到北極星服務(wù);第三類生態(tài)組件只有 polaris-controller,支持 Kubernetes 服務(wù)和網(wǎng)格 Sidecar 的自動(dòng)接入。
3.3 最佳實(shí)踐
目前,騰訊常用的框架、網(wǎng)關(guān)和容器平臺(tái)已經(jīng)集成北極星,形成了以北極星為核心的服務(wù)發(fā)現(xiàn)和治理體系。下面介紹北極星在騰訊的最佳實(shí)踐:
第一,作為公司統(tǒng)一的服務(wù)發(fā)現(xiàn)平臺(tái),實(shí)現(xiàn)公司內(nèi)網(wǎng)服務(wù)的互聯(lián)互通。北極星采用計(jì)算和存儲(chǔ)分離的架構(gòu),計(jì)算層可以隨著客戶端數(shù)量的增加平行擴(kuò)展,輕松支持百萬級(jí)客戶端接入。同時(shí)服務(wù)端提供同城多中心或者跨城多中心等多種部署模式,滿足不同的容災(zāi)要求。
第二,為不同的開發(fā)語(yǔ)言和框架提供統(tǒng)一的服務(wù)發(fā)現(xiàn)和治理功能。騰訊業(yè)務(wù)線眾多,開發(fā)語(yǔ)言和框架也眾多,北極星數(shù)據(jù)面支持多語(yǔ)言 SDK 和 Sidecar 兩種模式??蚣芸梢灾苯蛹上鄳?yīng)語(yǔ)言的 SDK,不需要部署 Sidecar,不會(huì)增加運(yùn)維成本,沒有性能和資源損耗。
第三,作為網(wǎng)關(guān)到內(nèi)網(wǎng)服務(wù)的連接器。網(wǎng)關(guān)可以集成北極星,將請(qǐng)求直接轉(zhuǎn)發(fā)到北極星服務(wù),實(shí)現(xiàn)微服務(wù)網(wǎng)關(guān)的能力。
第四,現(xiàn)有的開源組件主要分為兩個(gè)體系,一個(gè)圍繞服務(wù)注冊(cè)中心和開發(fā)框架打造,一個(gè)圍繞 Kubernetes 服務(wù)和網(wǎng)格打造。兩個(gè)體系各自有各自的亮點(diǎn)和局限,隨著容器化和云原生的推進(jìn),越來越多企業(yè)同時(shí)使用兩個(gè)體系。但是兩個(gè)體系的實(shí)現(xiàn)存在割裂,給業(yè)務(wù)增加了不必要的使用成本。北極星對(duì)兩個(gè)體系進(jìn)行了融合,為虛擬機(jī)和容器環(huán)境、開發(fā)框架和網(wǎng)格提供一體化的服務(wù)發(fā)現(xiàn)和治理方案。
四、北極星和開源生態(tài)的關(guān)系
4.1 北極星和框架
北極星客戶端可以集成到各種框架中,讓裸的開發(fā)框架快速升級(jí)為分布式和微服務(wù)框架,具備完整的服務(wù)發(fā)現(xiàn)和治理功能。
騰訊業(yè)務(wù)常用的框架均已集成北極星,其中除了自研框架,還有 gRPC、Spring 和 Gin 等開源框架。如上所述,這些集成也會(huì)作為北極星的生態(tài)組件開源,框架用戶可以直接引入,邏輯代碼不需要任何改動(dòng)。
4.2 北極星和網(wǎng)關(guān)
網(wǎng)關(guān)和框架的情況類似,北極星也可以和常見的開源網(wǎng)關(guān)集成使用。
4.3 北極星和 Kubernetes
隨著容器化和云原生的推進(jìn),越來越多企業(yè)開始使用 Kubernetes 部署服務(wù),騰訊也不例外。
在 Kubernetes 環(huán)境上,除了注冊(cè)中心和框架,還有兩種服務(wù)發(fā)現(xiàn)和治理方案:
- Kubernetes 服務(wù):通過 DNS 域名解析實(shí)現(xiàn)服務(wù)發(fā)現(xiàn),采用 iptables 或者 IPVS 實(shí)現(xiàn)負(fù)載均衡。這種方案簡(jiǎn)單易用,但是缺少其他服務(wù)治理能力,大規(guī)模服務(wù)存在性能瓶頸。
- 網(wǎng)格:通過劫持業(yè)務(wù)請(qǐng)求實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和治理。這種方案功能全面,但是存在 CPU 和性能損耗,運(yùn)維成本高。
在騰訊內(nèi)部,絕大部分業(yè)務(wù)使用注冊(cè)中心和框架的方案,也有不少業(yè)務(wù)使用 Kubernetes 服務(wù),網(wǎng)格還在小范圍嘗試階段。
北極星提供 polaris-controller,支持 Kubernetes 服務(wù)和網(wǎng)格 Sidecar 自動(dòng)注入,實(shí)現(xiàn)三種方案的聯(lián)通和統(tǒng)一治理。
五、北極星的開源規(guī)劃
北極星是在滿足騰訊業(yè)務(wù)需求的過程中,不斷演進(jìn)和發(fā)展起來的,積累了騰訊超大規(guī)模服務(wù)發(fā)現(xiàn)和治理的經(jīng)驗(yàn),沒有一個(gè)開源組件的形態(tài)和北極星完全類似。騰訊的業(yè)務(wù)線眾多,包含即時(shí)通信、音樂視頻、金融科技和企業(yè)服務(wù)等,北極星面臨的問題和相應(yīng)的解決方案具有很強(qiáng)的通用性。我們相信北極星也可以幫助其他企業(yè)更好地進(jìn)行分布式或者微服務(wù)架構(gòu)轉(zhuǎn)型,提高業(yè)務(wù)的研發(fā)效率和運(yùn)營(yíng)質(zhì)量。
北極星開源版本直接來自騰訊的生產(chǎn)代碼,我們已經(jīng)將主體部分提交到社區(qū)。期待更多感興趣、有能力的開發(fā)者參與共建,后續(xù)計(jì)劃包括但不限于:
- 完善服務(wù)發(fā)現(xiàn)和治理功能
- 提供更多語(yǔ)言的數(shù)據(jù)面 SDK
- 優(yōu)化數(shù)據(jù)面 Sidecar 的性能
- 加強(qiáng)北極星和相關(guān)開源組件的集成
- 完善項(xiàng)目文檔
- 引入其他公司的開源愛好者
歡迎加入
截至目前,騰訊共對(duì)外開源超過 130 個(gè)優(yōu)質(zhì)項(xiàng)目,代碼貢獻(xiàn)者超過 2000 人,開源項(xiàng)目 star 總數(shù)超過 37 萬個(gè)。北極星作為微服務(wù)領(lǐng)域新推出的開源項(xiàng)目,也非常歡迎感興趣的小伙伴在北極星 Github 上提交 issue 與 PR 進(jìn)行討論和貢獻(xiàn),或加入北極星社區(qū)群參與社區(qū)討論。
北極星 GitHub:github.com/polarismesh…
北極星官網(wǎng)地址:polarismesh.cn/
交流群:由于群成員已達(dá)300+,請(qǐng)加中間件小Q妹微信(微信號(hào):midwareQmei),并發(fā)送入群暗號(hào)“polaris”,等待驗(yàn)證回復(fù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121160.html