App後臺api開發前的準備

(整理自《App後臺開發運維和架構實踐》 做者:曾健生)java

1、從業務邏輯中提煉API接口

此過程可分爲六個階段:
  • 業務邏輯思惟導圖mysql

  • 功能——業務邏輯思惟導圖程序員

  • 基本功能模塊關係web

  • 功能模塊接口UML(設計出API)算法

  • 編寫API文檔sql

  • 在設計稿中標註API數據庫

1. 業務邏輯思惟導圖

抽象業務流程,列出結構關係,相同的元素(推送、評論、圖片上傳)用同一種顏色標記。api

2. 功能——業務邏輯思惟導圖

列出功能模塊業務邏輯相結合。
功能模塊的劃分,能夠按照「人」、「事」來劃分。「人」就是一個大模塊,「事」要看有哪些事,相同的事就是一個模塊,人和事之間的關係,就是關係模塊 。數組

好比分析發消息這個業務:
  • 我 (我是人。「人」是一個模塊)緩存

  • 消息 (消息是「事物」。「消息」是一個模塊)

  • 我發消息 (發消息,是事件,不是事物,是人與物的關係,是一個關係模塊)

3. 基本功能模塊關係

理清各個模塊之間的依賴調用關係

4. 功能模塊接口UML (設計出API)

具體分析各個模塊的具體的功能(具體的API),再根據上一步驟整理的模塊間的關係,畫出UML圖

5. 編寫API文檔

提倡使用TDD(測試驅動)原則開發,編寫在線API文檔,既是一份文檔,也是一個在線測試工具。
相關的開源工具:

6. 設計稿標註API

爲了方便app端和web端的開發人員,快速理解和使用API,能夠在設計圖中在相應的界面相應的元素上,標註出須要的API,這個工做能夠分析編寫API文檔同時進行。

2、設計API的要點

1. 根據對象設計API

API設計中最重要的是根據對象而不是界面來設計API,提升API的可擴展性。

2. API的命名

API的命名務必要作到從API名稱就能明白這個API的做用。

3. API的安全性

  • 涉及到登陸和支付功能的,使用HTTPS協議

  • 使用URL簽名的方式驗證API請求的合法性

  • 使用AES對稱加密的方式,保護API請求和返回中的全部數據
    ##### 更進一步的通訊安全:

  • 使用自定義的通訊協議傳輸敏感數據

  • 使用DES(非對稱加密算法)

  • 使用邦邦加密、愛加密等第三方工具對APP進行加密

  • 涉及到支付功能的,每一次都須要輸入密碼,密碼不在本地保存

  • 使用自主開發的輸入控件輸入敏感信息

4. API返回的數據

APP客戶端主要開發語言java和objective-C都是強類型語言,因此絕對不容許返回null值。

  • 數據庫設計時,全部字段都必須有默認值,不容許出現null。

  • app客戶端必須用全局的函數處理全部API返回的數據,當返回的數據缺乏某個值時,自動補上一個默認值。

使用PHP做爲APP後臺的開發語言存在一個問題:PHP中數組和字典都屬於Array,但在java和objective-C中這二者是不同的。

5. 圖片的處理

app開發中,一般須要一張圖片有多種尺寸,以適應app的不一樣版本和各異的客戶端。
建議:

  1. App客戶端本地緩存經常使用圖片,緩存不能命中時纔去請求服務器

  2. App端須要的不一樣尺寸的圖片時,發送帶尺寸參數的請求到後臺,有後臺動態生成並緩存。

  3. 文件雲存儲服務(七牛,又拍)和CDN都提供圖片的縮放功能,高速的文件上傳下載,有條件的狀況下,推薦使用。

6. 返回的提示信息

最科學的狀況是APP後臺只返回信息代碼,具體的文字由客戶端決定。
須要給App客戶端程序員返回的提示信息,要專業清晰,好比「少傳了什麼參數,哪一個參數有問題」

7. 關於API的版本升級問題

App客戶端作了改版後,部分API不能知足需求了,這時就須要升級API,要避免同一個App客戶端調用不一樣版本的API,通常會所有升級。例如:原來是「xxx.com/v1/getpost」, 升級爲「xxx.com/v2/getpost」。
注意:

  1. 升級版本時,V2版本的API的Controller必需要繼V1版的Controller,這樣V2版本的API只重寫須要改動的API

  2. 完善文檔,在線API測試文檔中詳細說明,方便客戶端人員調試。

3、選擇合適的數據庫

  1. 內存型仍是硬盤型

  • 內存的讀取速度大概是硬盤的80倍。

  • 內存容量頗有限。例如Ucloud服務器最多有64G內存,硬盤可高達1000G。

  1. Redis,MongoDB,mysql 讀寫數據的區別

存儲服務 類型 說明
Redis 內存型 支持持久化保存到硬盤
mongoDB 混合 使用MMAP機制,操做內存完成文件讀寫
Mysql 硬盤型
  1. Redis,MongoDB,Mysql 查詢數據的區別

存儲服務 說明
Redis 「鍵值對」存儲,讀寫速度快
MongoDB、 Mysql 有id或索引,效率高;無id或索引,效率低
  1. Redis,MongoDB,Mysql 適用場景

存儲服務 適用場景
Redis 適合存儲讀寫頻率很是高,且知道「鍵」的數據,好比用戶身份信息,在登陸或其餘操做中都能用到
mongoDB 大尺寸、低價值的數據;高伸縮性場景;地理座標查詢功能強大,適用於LBS應用。劣勢:不支持事務,查詢功能遜於sql
Mysql 最經常使用的存儲服務,支持事務,支持複雜sql

4、選擇消息隊列

1. 消息隊列應用場景

消息隊列能夠把大量的併發請求變成串行請求,起到減輕服務器負擔的做用。
有些小任務須要花不少時間,可是遲點完成也能夠,就能夠把這樣的任務交給消息隊列處理。好比一些不要求立刻完成的發送郵件,推送消息的任務。

2. 消息隊列介紹

消息隊列通常包括三個角色:隊列服務端,隊列生產者,隊列消費者。
常見的消息隊列產品:

消息隊列 介紹
RabbitMQ 重量級產品,支持大量協議,適合企業級開發;支持路由,負載均衡,數據持久化;自帶web監控界面,方便監控。
Redis 輕量級,運維成本低
ZeroMQ 號稱最快,適合大吞吐量場景

5、搜索技術介紹

搜索的基本原理是「分詞」和「倒序索引」。
常見的開源搜索軟件:

Lucene
很受歡迎的免費java信息檢索程序庫
solr
基於Lucene,查詢語言更豐富,查詢性能更好,提供了完善的功能管理界面。對外提供相似於Web-service的API接口,用戶能夠經過http請求向搜索引擎服務器提交必定格式的xml文件,生成索引;也能夠經過http get操做提出查找請求,獲得XML格式的返回結果。
ElasticSearch
它是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶的全文搜索引擎,基於RESTful Web接口。
Sphinx
Sphinx是一個基於Sql的全文檢索引擎,其結合MySQL、PostgreSQL作全文索引,能夠提供比數據庫自己更專業的搜索功能,使應用程序更容易實現專業化的全文索引。Sphinx特別爲一些腳本語言設計搜索API接口,如PHP、Python、Perl、Ruby等,同時爲MySQL也設計了一個存儲引擎插件。
CoreSeek
CoreSeek是一款中文全文索引/搜索軟件,基於Sphinx研發,專攻中文搜索和信息處理領域,適用於行業/垂直搜索、論壇/站內搜索、數據庫搜索、文檔/文獻檢索、信息檢索、數據挖掘等應用場景,用戶能夠免費下載使用。
Coreseek有兩個核心模塊Indexer和Search。

  • Indexer: 負責從mysql拉取數據源,把數據源分詞,創建索引

  • Search: 搜索模塊

Coreseek工做流程以下:

圖片描述

  1. Indexer模塊從MySQL中拉取數據

  2. Indexer模塊用通過中文分詞後的數據創建索引

  3. 客戶端向Search模塊發起搜索請求

  4. Search模塊查找索引中的數據

  5. Search模塊獲得索引中符合要求的數據的id等數據

  6. 把數據返回給客戶端

相關文章
相關標籤/搜索