(整理自《App後臺開發運維和架構實踐》 做者:曾健生)java
業務邏輯思惟導圖mysql
功能——業務邏輯思惟導圖程序員
基本功能模塊關係web
功能模塊接口UML(設計出API)算法
編寫API文檔sql
在設計稿中標註API數據庫
抽象業務流程,列出結構關係,相同的元素(推送、評論、圖片上傳)用同一種顏色標記。api
列出功能模塊
與業務邏輯
相結合。
功能模塊的劃分,能夠按照「人」、「事」來劃分。「人」就是一個大模塊,「事」要看有哪些事,相同的事就是一個模塊,人和事之間的關係,就是關係模塊 。數組
我 (我是人。「人」是一個模塊)緩存
消息 (消息是「事物」。「消息」是一個模塊)
我發消息 (發消息,是事件,不是事物,是人與物的關係,是一個關係模塊)
理清各個模塊之間的依賴調用關係
具體分析各個模塊的具體的功能(具體的API),再根據上一步驟整理的模塊間的關係,畫出UML圖
提倡使用TDD(測試驅動)原則開發,編寫在線API文檔,既是一份文檔,也是一個在線測試工具。
相關的開源工具:
swagger-ui
eolinker
sosoapi
爲了方便app端和web端的開發人員,快速理解和使用API,能夠在設計圖中在相應的界面相應的元素上,標註出須要的API,這個工做能夠分析編寫API文檔同時進行。
API設計中最重要的是根據對象而不是界面來設計API,提升API的可擴展性。
API的命名務必要作到從API名稱就能明白這個API的做用。
涉及到登陸和支付功能的,使用HTTPS協議
使用URL簽名的方式驗證API請求的合法性
使用AES對稱加密的方式,保護API請求和返回中的全部數據
##### 更進一步的通訊安全:
使用自定義的通訊協議傳輸敏感數據
使用DES(非對稱加密算法)
使用邦邦加密、愛加密等第三方工具對APP進行加密
涉及到支付功能的,每一次都須要輸入密碼,密碼不在本地保存
使用自主開發的輸入控件輸入敏感信息
APP客戶端主要開發語言java和objective-C都是強類型語言,因此絕對不容許返回null值。
數據庫設計時,全部字段都必須有默認值,不容許出現null。
app客戶端必須用全局的函數處理全部API返回的數據,當返回的數據缺乏某個值時,自動補上一個默認值。
使用PHP做爲APP後臺的開發語言存在一個問題:PHP中數組和字典都屬於Array,但在java和objective-C中這二者是不同的。
app開發中,一般須要一張圖片有多種尺寸,以適應app的不一樣版本和各異的客戶端。
建議:
App客戶端本地緩存經常使用圖片,緩存不能命中時纔去請求服務器
App端須要的不一樣尺寸的圖片時,發送帶尺寸參數的請求到後臺,有後臺動態生成並緩存。
文件雲存儲服務(七牛,又拍)和CDN都提供圖片的縮放功能,高速的文件上傳下載,有條件的狀況下,推薦使用。
最科學的狀況是APP後臺只返回信息代碼,具體的文字由客戶端決定。
須要給App客戶端程序員返回的提示信息,要專業清晰,好比「少傳了什麼參數,哪一個參數有問題」
App客戶端作了改版後,部分API不能知足需求了,這時就須要升級API,要避免同一個App客戶端調用不一樣版本的API,通常會所有升級。例如:原來是「xxx.com/v1/getpost」, 升級爲「xxx.com/v2/getpost」。
注意:
升級版本時,V2版本的API的Controller必需要繼V1版的Controller,這樣V2版本的API只重寫須要改動的API
完善文檔,在線API測試文檔中詳細說明,方便客戶端人員調試。
內存型仍是硬盤型
內存的讀取速度大概是硬盤的80倍。
內存容量頗有限。例如Ucloud服務器最多有64G內存,硬盤可高達1000G。
Redis,MongoDB,mysql 讀寫數據的區別
存儲服務 | 類型 | 說明 |
---|---|---|
Redis | 內存型 | 支持持久化保存到硬盤 |
mongoDB | 混合 | 使用MMAP機制,操做內存完成文件讀寫 |
Mysql | 硬盤型 |
Redis,MongoDB,Mysql 查詢數據的區別
存儲服務 | 說明 |
---|---|
Redis | 「鍵值對」存儲,讀寫速度快 |
MongoDB、 Mysql | 有id或索引,效率高;無id或索引,效率低 |
Redis,MongoDB,Mysql 適用場景
存儲服務 | 適用場景 |
---|---|
Redis | 適合存儲讀寫頻率很是高,且知道「鍵」的數據,好比用戶身份信息,在登陸或其餘操做中都能用到 |
mongoDB | 大尺寸、低價值的數據;高伸縮性場景;地理座標查詢功能強大,適用於LBS應用。劣勢:不支持事務,查詢功能遜於sql |
Mysql | 最經常使用的存儲服務,支持事務,支持複雜sql |
消息隊列能夠把大量的併發請求變成串行請求,起到減輕服務器負擔的做用。
有些小任務須要花不少時間,可是遲點完成也能夠,就能夠把這樣的任務交給消息隊列處理。好比一些不要求立刻完成的發送郵件,推送消息的任務。
消息隊列通常包括三個角色:隊列服務端,隊列生產者,隊列消費者。
常見的消息隊列產品:
消息隊列 | 介紹 |
---|---|
RabbitMQ | 重量級產品,支持大量協議,適合企業級開發;支持路由,負載均衡,數據持久化;自帶web監控界面,方便監控。 |
Redis | 輕量級,運維成本低 |
ZeroMQ | 號稱最快,適合大吞吐量場景 |
搜索的基本原理是「分詞」和「倒序索引」。
常見的開源搜索軟件:
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工做流程以下:
Indexer模塊從MySQL中拉取數據
Indexer模塊用通過中文分詞後的數據創建索引
客戶端向Search模塊發起搜索請求
Search模塊查找索引中的數據
Search模塊獲得索引中符合要求的數據的id等數據
把數據返回給客戶端