原文出處:http://weibo.com/p/1001643875679132642345
作者:蘇星宇,@zhuidawugui
大綱
微博平臺主要負(fù)責(zé)微博基礎(chǔ)功能。接下來將會介紹
平臺的作用,以及服務(wù)提供的形式
平臺Web服務(wù)的部署
目前整體架構(gòu)大體上分為三層
展現(xiàn)層:手機端,主站和第三方應(yīng)用,承擔(dān)相關(guān)業(yè)務(wù)的前端展示
適配層:負(fù)責(zé)服務(wù)端和多個展示端的接口適配
平臺作為整個微博架構(gòu)的基礎(chǔ)功能服務(wù)層,對外以Http接口的方式提供服務(wù)。接口遵守RESTful規(guī)范。接口示例如下:
關(guān)于RESTful,與其說是規(guī)范,其實更像是一種架構(gòu)設(shè)計風(fēng)格。它主要是提供了一組設(shè)計原則和約束條件,廣泛應(yīng)用于C/S或者B/S架構(gòu)中。要想理解什么是RESTful,可以從它的全稱入手--Representational State Transfer,翻譯成中文是表現(xiàn)層狀態(tài)轉(zhuǎn)化。這段晦澀的文字省略了主語,"表現(xiàn)層"其實指的是"資源"(Resources)的"表現(xiàn)層"。核心概念包括
資源是由URI來指定。
對資源的操作包括獲取、創(chuàng)建、修改和刪除資源,這些操作正好對應(yīng)HTTP協(xié)議提供的GET、POST、PUT和DELETE方法。
概括起來,平臺對外提供服務(wù)的形式就是通過HTTP接口對基礎(chǔ)資源進(jìn)行存取。
對平臺的定位和服務(wù)形式有所了解后,我們看下平臺的Web服務(wù)部署結(jié)構(gòu)。
平臺的服務(wù)部署在多個機房中。以北京為例,就有AX、BX和CX三個機房。自建的DNS服務(wù)會將用戶的流量根據(jù)不同的運營商切換到不同的機房。
用戶請求到達(dá)服務(wù)端后,首先會經(jīng)過反向代理服務(wù)器。反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受公網(wǎng)上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給公網(wǎng)上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。平臺目前使用的反向代理有LVS和Nginx。
LVS:Linux Virtual Server,基于IP的負(fù)載均衡和反向代理技術(shù)
關(guān)于Nginx,除了以上提到的之外,還負(fù)責(zé)集群的健康檢查。這個主要是通過Nginx自帶的健康檢查模塊實現(xiàn)的。Nginx server會輪詢后端集群的index.jsp頁面,如果返回200則認(rèn)為服務(wù)器正常,請求會正常被轉(zhuǎn)發(fā)到該服務(wù)器;返回503則進(jìn)行服務(wù)器摘除,請求將不會再到達(dá)該服務(wù)器。
經(jīng)過反向代理轉(zhuǎn)發(fā)后,請求會到達(dá)部署Web應(yīng)用的應(yīng)用服務(wù)器。平臺目前主要使用Tomcat作為應(yīng)用容器。之后,請求會被統(tǒng)一的Web框架解析并處理。稍后會詳細(xì)講述Web框架的內(nèi)容。
對于上行和下行不同的請求,請求處理的鏈路也不同。
以微博核心業(yè)務(wù)Feed流為例。應(yīng)用服務(wù)器在收到下行請求(如查詢一條微博的內(nèi)容)時,會直接訪問緩存資源,如果命中則直接返回結(jié)果給客戶端,否則繼續(xù)查詢DB,將結(jié)果返回客戶端。
而收到上行請求(如發(fā)微博)時,應(yīng)用會將上行請求寫入一個消息隊列中。由另一個單獨的處理應(yīng)用讀取消息隊列,執(zhí)行上行請求的資源操作,比如寫入緩存、更新DB等等。
這種隊列加處理機的上行請求模式被平臺廣泛使用,主要有以下優(yōu)點:
解除前端應(yīng)用和后端資源的耦合
由于請求被分配到不同機房,因此多機房之間的數(shù)據(jù)也需要同步。目前我們使用虛擬消息管道WMB來同步機房之間的數(shù)據(jù):所有的上行請求在到達(dá)某個機房后都會通過WMB重放到其他機房,從而保證機房后端資源一致。除此之外,為了容災(zāi),后端資源如緩存,DB的主從集群會分布在不同機房。彼此之間通過應(yīng)用自身(Redis、MySql)或者客戶端(Memcached)來同步主從數(shù)據(jù)。
下面給大家簡單介紹下我們使用的Web框架。前面我們提到,在請求到達(dá)應(yīng)用容器后,首先會被統(tǒng)一Web框架進(jìn)行處理。用戶請求在應(yīng)用容器中的整個處理鏈路如下。
Web框架的處理主要是將Http形式的請求轉(zhuǎn)換成應(yīng)用運行環(huán)境(如JVM)理解的請求,包括接口路由、參數(shù)處理和參數(shù)校驗等等。平臺目前使用Credus作為統(tǒng)一的Web框架,它是一個基于Jersey改造的自研框架。
Jersey是JAX-RS(JSR311)開源參考實現(xiàn)用于構(gòu)建RESTful Web service。特性比較豐富,包括
接口路由
功能豐富的Filter
Http參數(shù)校驗
此外Jersey還提供一些額外的API和擴(kuò)展機制,所以開發(fā)人員能夠按照自己的需要對Jersey進(jìn)行擴(kuò)展。
在Jersey提供的擴(kuò)展機制上,我們開發(fā)了Credus,主要功能有
封裝Jersey框架
定制內(nèi)容
在Jersey提供的Filter機制上,Credus框架定制了一系列接口通用策略和功能。包括用戶認(rèn)證、接口頻次限制、接口信息統(tǒng)計和返回接口JsonP封裝。另外,還進(jìn)一步擴(kuò)展了Jersey原有的參數(shù)校驗,增加了更多了參數(shù)校驗方式。Web請求在Credus框架中的處理過程如下
這次和大家分享了微博平臺的相關(guān)知識,包括平臺功能、平臺服務(wù)部署以及平臺Web框架介紹。希望通過本次分享,大家能夠?qū)ξ⒉┢脚_有所了解,同時對服務(wù)結(jié)構(gòu)有一個整體的認(rèn)識,對以后的工作有所幫助。
由于篇幅和主題的限制,還有很多內(nèi)容沒有具體展開,有興趣可以關(guān)注@平臺技術(shù)沙龍。
------------------新兵訓(xùn)練營簡介------------------
微博平臺新兵訓(xùn)練營活動是微博平臺內(nèi)部組織的針對新入職同學(xué)的團(tuán)隊融入培訓(xùn)課程,目標(biāo)是團(tuán)隊融入,包括人的融入,氛圍融入,技術(shù)融入。當(dāng)前已經(jīng)進(jìn)行4期活動,很多學(xué)員迅速成長為平臺技術(shù)骨干。
微博平臺是非常注重團(tuán)隊成員融入與成長的團(tuán)隊,在這里有人幫你融入,有人和你一起成長,也歡迎小伙伴們加入微博平臺,歡迎私信咨詢。
------------------講師簡介------------------
蘇星宇,@zhuidawugui,微博平臺及大數(shù)據(jù)部——通訊系統(tǒng)研發(fā)工程師,2014年1月畢業(yè)于中國科學(xué)技術(shù)大學(xué),校招進(jìn)入微博。先后負(fù)責(zé)粉服平臺、群聊、微博相機消息箱等業(yè)務(wù)后端設(shè)計和研發(fā)工作。關(guān)注分布式系統(tǒng)設(shè)計和服務(wù)保障,Storm流式處理。新兵訓(xùn)練營第三期學(xué)員
更多建議: