移動互聯網實戰--Web Restful API設計和基礎架構

 

前言:
  在移動互聯網的大潮中, Web Restful API逐漸成爲Web Server重要的一個分支. 移動端和服務端的交互, 主流的方式仍是經過Http協議的形式來進行. 請求以Get/Post方式, 響應以json(數據更小巧且自描述能力強)的方式佔據主流. 各大互聯網公司, 對自身的Web Api設計有各自的標準. 本文主要講述主流的幾種, 並對web server的基礎架構作個簡單的描述.php

百度雲實現方案:
  百度移動雲事業部的對雲服務的Web Api借鑑了亞馬遜的AWS實現方案. 具體可參見百度移動雲開發者網站: http://developer.baidu.com/.
  該Restful API的設計特色, 主要由如下幾方面來描述.
  1). URL的設計nginx

http[s]://{server}/rest/2.0/{product}/{resource}?{query_string}

  server: 具體服務的域名
  product: 具體服務的產品名稱
  resource: 具體服務的某個資源名稱
  query_string: 具體服務的某個方法全部key/value對參數(包括函數名) 
  2). 請求/響應數據格式
  基於HTTP協議, 支持GET/POST兩種方式, 通常讀請求採用GET模式, 而寫請求採用POST的模式.
  請求數據格式: 與普通的web服務並沒有區別, GET模式參數擱置在query_string中, POST模式參數擱置在POST附帶參數中
  響應數據格式: 響應的結果和業務服務相關
  #) 業務操做成功web

{
  "request_id":12394838223,
  "response_params": { ... }
}

  評註: request_id是本次請求的標識號, 用於問題查找, response_params則包含了具體業務的響應結果.
  #) 業務操做失敗json

{
  "request_id":12394838223,
  "error_code":30000,
  "error_msg":"Request params not valid"
}	

  評註: 失敗返回的結果固定包含三部分: request_id/error_code/error_msg, error_code指定錯誤碼, error_msg爲具體的出錯信息.後端

  3). 業務邏輯狀態與http響應碼的綁定
  業務結果與http響應碼的綁定, 無論是否合理, 這也算是AWS Web API的一大特點.
  好比:服務器

http狀態碼 業務錯誤碼 業務錯誤描述信息 業務錯誤描述信息
200      
404 30605 Data Required Not Found 請求數據不存在
500 30600 Internal Server Error   服務器內部錯誤

  評註: 業務服務層應該在http協議之上, 二者的狀態不應綁定, 至於AWS爲什麼這樣設計, 我只能說"存在即合理"網絡

該方案實戰和點評:
  世上沒有一個方案是完美的, 它總有它的不足存在. 這邊談談小編在工程實踐中, 對此方案所感慨的一些不足.
  在某個具體的雲服務應用中, 特定的一個方法訪問成爲了熱點(其餘方法訪問量少). 咱們想在反向代理層(lighttpd/nginx)做分流, 讓實現FastCGI的C模塊代替原生的PHP CGI. Web Server是依據URI中的服務域名和URI PATH來匹配劃分/分流, 然而遺憾的是method方法參數在URI的query_string中, 該方案沒法實施. 若是method參數在URI中的PATH中那就好辦了.
  儘管HTTP協議屬於網絡的應用層, 可是再細分的話, 業務層該在HTTP協議之上, 不一樣的協議層, 彼此之間應該互不影響. 業務錯誤碼和http狀態碼的綁定多少讓人有些困惑. 有些發生在Web Server層的真正404錯誤, 卻被Web API的Client SDK誤認爲了業務邏輯錯誤, 這些其實不該該發生.架構

我的比較推崇的作法:
  1). Http的請求分爲URL約定規則、請求參數規則
  URL規則: app

http://{server}/{product}/{version}/{logic}/{method}?{query_string}

  server: 爲具體的服務域名
  product: 爲應用工程名
  version: 爲具體版本號, 便於未來的功能擴展, 能夠暫定爲 1.0, 2.0
  logic: 爲具體業務邏輯的初步劃分, 好比後端管理方法, app端的請求方法
  method: 具體業務的方法
  具體的請求參數, 由指定的method方法決定, 全都做爲HTTP GET/POST的參數列表.
  2). Http的響應規則
  HTTP響應碼爲200, 邏輯結果以JSON字符串的形式組織:
  若是響應結果正確,則返回結果以下所示:負載均衡

{
  "success": true,
  "result_value" : {
    /* 由具體的業務方法決定 */
  }
}

  若是響應結果失敗,則返回以下結果:

{
  "success": false,
  "request_id": 10001,
  "err_code": 1001,
  "err_msg": "Internal Server Error"
}

  借鑑了AWS的設計思路, 同時拋棄了業務錯誤碼與HTTP狀態碼的綁定, 同時把method/logic/version擱置在URI中的PATH中, 便於WebServer的分流. 

Web Server的基礎架構
  對於Web Server的基礎架構, 大體有如下幾種流行的方式.
  1). 採用LVS的方式:
    對內部多個節點(IP地址)的訪問, 對外抽象爲同一個IP地址, 這就是LVS的方式. 其能夠理解爲軟件級負載均衡方式(須要依賴硬件)
  2). 採用Nginx/Apache的反向代理:
  
  評註:Nginx的反向代理,能夠方便對靜態資源和動態資源作分離, 對小企業而言, 是最經常使用的一種方式.
  3). LVS和Nginx/Apache反向代理的結合
  

  注: 圖片來自網絡.

相關文章
相關標籤/搜索