日調 1000 億,騰訊微服務平台的架構演進

2022-07-27 20:48:15 字數 2255 閱讀 9975

要搭建一套能穩定支援海量呼叫的微服務系統,需要先看看系統由哪些模組組成。如上圖所示,從下往上看,不同的使用者 vpc 代表多租戶,中間是服務註冊發現的模組,頂部是應用管理模組和資料化運營模組,應用管理模組用來進行 cicd,包括了分發、部署以及配置管理等應用生命週期相關的功能。

資料化運營這個模組主要用於幫助業務進行分析,包括但不限於呼叫鏈、日誌、metrics 等。

從系統架構上來說,藍框裡的屬於資料面,也就是常說的 data plane,是影響業務請求的核心鏈路;灰色區域內更多的偏向控制流,也就是 control plane ,幫助我們更簡單的使用好微服務。

資料面和控制面屬於兩種不同的架構,面臨的挑戰也各不相同。資料面的挑戰主要難點在於大流量、穩定性和高可用等,而控制面的更多則是業務複雜度。本文將圍繞著整個資料面分享如何讓微服務系統變得更穩定。

2014 年雲興起之後,提出了雲時代下的微服務概念:單一應用程式構成的小程式,自己擁有自己的邏輯與輕量化處理能力,服務以全自動方式部署,與其他的服務之間進行通訊,服務可以使用不同程式語言和資料庫實現。陝西省老醫協生殖醫學醫院

這個概念和早期 dubbo 這種基於 netty 框架構成的系統本質上沒區別,只不過雲興起之後增加了一些自動部署和 docker 的能力,也做了更多的整合。

通過上圖可以看到,我們每個微服務都內聚了自己的業務邏輯,允許訪問不同的資料庫,以及通過 rest api 進行互相通訊。從模型來看有點像是蜂巢,也很像一張網。這裡就會引申出乙個小問題,這麼多的微服務,他們之間是如何進行呼叫的?

http client 本身我們知道是通過 ip 和 port 來進行互相呼叫,早期單體應用還能夠簡單的進行配置。但是在微服務時代,特別是用了 k8s 和 docker,每次啟動的 ip 也可能會變,這裡該怎麼辦呢?其實可以通過服務註冊發現模組進行機器例項的互相發現和呼叫。陝西省老醫協生殖醫學醫院

我們來看**釋一下什麼是服務註冊發現。

圖上能看到有兩個微服務,servicea 和 serviceb。在這裡我們定義 servicea 為服務呼叫方,serviceb 為服務提供者。

前面也說到了,在單體應用時代,我們都需要通過配置來指定需要訪問的 ip,但是雲時代下的微服務,ip 本身會變,所以需要有乙個地方來記錄這些 ip,那就是服務註冊和發現的能力。

serviceb 的每個例項在啟動時,會將自身的 ip 和 port 寫入到服務發現模組的某個路徑,然後 servicea 會從這個路徑來拉取到想要訪問的 serviceb 的服務提供者的列表。這裡就會拉取到三個例項節點,從中選擇乙個節點進行訪問。

目前市面上已經有很多成熟的註冊發現元件,像是 zookeeper,nacos,consul 等。consul 本身作為乙個開箱即用,並且支援 http 請求,同時擁有豐富的文件和簡單的 api 的系統被很多的中小型公司青睞和使用。

當然,consul 和 spring 的對接也很成熟,很多中小型公司,特別是比較新的公司很多都會選擇 consul 來作為服務註冊發現。所以我們選擇基於 consul 作為底層基礎元件,在上面一點點的進行擴充套件,來搭建一套穩定的服務註冊發現模組。

consul 有開源版本和企業版本,對於開源版本來說,基本功能都齊全,但企業級能力卻不提供。缺少這些企業級的能力,對想用 consul 來實現支援海量呼叫的微服務系統會有不足。

原生的 consul 的服務發現 api 引數只有乙個服務名,想要多租戶或者帶上 namespace,只能拼接在服務名上。但是這裡需要強行依賴 sdk,對於 consul 這樣乙個暴露 http 的通用服務,不能限定使用者的語言,也不可能每個語言去實現一套 sdk,我們需要用其他方式來實現。陝西省老醫協生殖醫學醫院

實現多租戶的能力,需要在原有的 consul-server 集群之前,加一層 consul-access 層。對外暴露的 api 和原生的 consul 完全一樣,但背後針對一些 api 可以進行了一些改造。

先簡單看看通過加入 access 層,怎麼來實現多租戶的能力:

服務註冊發現一般來說分為三步

服務提供進行例項註冊;

心跳上報;

服務消費者拉取服務提供者列表。

公尺讀 累計服務近2億使用者 日活使用者近1000萬

techweb 9月8日訊息,趣頭條旗下網路文學產品公尺讀對外披露,目前已累計服務近兩億使用者,日活躍使用者近1000萬,使用者日均使用時長長期穩定在2小時左右。從使用者性別上看,公尺讀的受眾分布均衡,男性使用者與女性使用者佔比基本持平,覆蓋了22歲以下到60歲幾乎全年齡段使用者,其中23 40歲使...

微服務通用的「使用者角色許可權」平台設計

在絕大部分的微服務平台中,都會涉及到賬號表 account 使用者表 user 使用者組表 user group 角色表 role 和許可權表 permission 等的通用資料表,然而這幾張表之間又會存在一些非常通用的關係以及相同的處理方式,你的使用者平台是否設計對了呢?本文將基於角色訪問控制 r...

雲平台中微服務前後端呼叫的方式

前後端分離架構下,前端呼叫後端的方式有以下兩種 ip 埠 通過ip 埠的方式需要暴露後端服務,因為請求都是從瀏覽器發出的,需要讓任意乙個從瀏覽器發出的請求都可以訪問。採用ip 埠方式的弊端 需要將後端服務的ip加入dns,以免換了ip之後服務不可用 如果不分配網域名稱的話,需要向外暴露ip,安全風險...