新浪微博平臺服務部署及Web框架

一、大綱

微博平臺主要負責微博基礎功能。接下來將會介紹

  • 平臺的作用,以及服務提供的形式
  • 平臺Web服務的部署
  • 平臺Web框架簡介

二、背景

目前整體架構大體上分爲三層

  • 展現層:手機端,主站和第三方應用,承擔相關業務的前端展示
  • 適配層:負責服務端和多個展示端的接口適配
  • 服務層:提供基礎功能服務,包括Feed服務,用戶關係,開放平臺和消息箱等

平臺作爲整個微博架構的基礎功能服務層,對外以Http接口的方式提供服務。接口遵守RESTful規範。接口示例如下:

關於RESTful,與其說是規範,其實更像是一種架構設計風格。它主要是提供了一組設計原則和約束條件,廣泛應用於C/S或者B/S架構中。要想理解什麼是RESTful,可以從它的全稱入手--Representational State Transfer,翻譯成中文是表現層狀態轉化。這段晦澀的文字省略了主語,"表現層"其實指的是"資源"(Resources)的"表現層"。核心概念包括

  • 資源是由URI來指定。
  • 對資源的操作包括獲取、創建、修改和刪除資源,這些操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法。
  • 通過操作資源的表現形式來操作資源。

概括起來,平臺對外提供服務的形式就是通過HTTP接口對基礎資源進行存取。

三、平臺服務部署

對平臺的定位和服務形式有所瞭解後,我們看下平臺的Web服務部署結構。

平臺的服務部署在多個機房中。以北京爲例,就有AX、BX和CX三個機房。自建的DNS服務會將用戶的流量根據不同的運營商切換到不同的機房。

用戶請求到達服務端後,首先會經過反向代理服務器。反向代理(Reverse Proxy)方式是指以代理服務器來接受公網上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給公網上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。平臺目前使用的反向代理有LVS和Nginx。

  • LVS:Linux Virtual Server,基於IP的負載均衡和反向代理技術
  • Nginx:基於HTTP的負載均衡和反向代理服務器

關於Nginx,除了以上提到的之外,還負責集羣的健康檢查。這個主要是通過Nginx自帶的健康檢查模塊實現的。Nginx server會輪詢後端集羣的index.jsp頁面,如果返回200則認爲服務器正常,請求會正常被轉發到該服務器;返回503則進行服務器摘除,請求將不會再到達該服務器。

經過反向代理轉發後,請求會到達部署Web應用的應用服務器。平臺目前主要使用Tomcat作爲應用容器。之後,請求會被統一的Web框架解析並處理。稍後會詳細講述Web框架的內容。

對於上行和下行不同的請求,請求處理的鏈路也不同。

以微博核心業務Feed流爲例。應用服務器在收到下行請求(如查詢一條微博的內容)時,會直接訪問緩存資源,如果命中則直接返回結果給客戶端,否則繼續查詢DB,將結果返回客戶端。

而收到上行請求(如發微博)時,應用會將上行請求寫入一個消息隊列中。由另一個單獨的處理應用讀取消息隊列,執行上行請求的資源操作,比如寫入緩存、更新DB等等。

這種隊列加處理機的上行請求模式被平臺廣泛使用,主要有以下優點:

  • 解除前端應用和後端資源的耦合
  • 削峯填谷:在請求量很大時,隊列可以作爲緩衝,緩解後端資源的壓力

由於請求被分配到不同機房,因此多機房之間的數據也需要同步。目前我們使用虛擬消息管道WMB來同步機房之間的數據:所有的上行請求在到達某個機房後都會通過WMB重放到其他機房,從而保證機房後端資源一致。除此之外,爲了容災,後端資源如緩存,DB的主從集羣會分佈在不同機房。彼此之間通過應用自身(Redis、MySql)或者客戶端(Memcached)來同步主從數據。

四、平臺Web框架

下面給大家簡單介紹下我們使用的Web框架。前面我們提到,在請求到達應用容器後,首先會被統一Web框架進行處理。用戶請求在應用容器中的整個處理鏈路如下。

Web框架的處理主要是將Http形式的請求轉換成應用運行環境(如JVM)理解的請求,包括接口路由、參數處理和參數校驗等等。平臺目前使用Credus作爲統一的Web框架,它是一個基於Jersey改造的自研框架。

Jersey是JAX-RS(JSR311)開源參考實現用於構建RESTful Web service。特性比較豐富,包括

  • 接口路由
  • 功能豐富的Filter
  • Http參數校驗
  • 文檔生成

此外Jersey還提供一些額外的API和擴展機制,所以開發人員能夠按照自己的需要對Jersey進行擴展。

在Jersey提供的擴展機制上,我們開發了Credus,主要功能有

  • 封裝Jersey框架
  • 定製內容
  • Wiki模板

在Jersey提供的Filter機制上,Credus框架定製了一系列接口通用策略和功能。包括用戶認證、接口頻次限制、接口信息統計和返回接口JsonP封裝。另外,還進一步擴展了Jersey原有的參數校驗,增加了更多了參數校驗方式。Web請求在Credus框架中的處理過程如下

五、總結

這次和大家分享了微博平臺的相關知識,包括平臺功能、平臺服務部署以及平臺Web框架介紹。希望通過本次分享,大家能夠對微博平臺有所瞭解,同時對服務結構有一個整體的認識,對以後的工作有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章