App 後台開發運維和架構實踐

App 後台開發運維和架構實踐

《App 後台開發運維和架構實踐》是2016年5月電子工業出版社出版的圖書,作者是曾健生。

內容簡介

《App 後台開發運維和架構實踐》通過闡述移動網際網路中 App 後台開發的特點,梳理了 App 後台開發中會遇到的各個技術點,給出了生產環境常用軟體的實戰運維經驗總結,剖析了常見 App 後台技術架構設計,為讀者呈現一幅包括技術選型、後台搭建、性能最佳化、運維實踐、架構設計的 App 後台開發藍圖。

《App 後台開發運維和架構實踐》的目標讀者是對技術感興趣的產品經理、剛入行的 App 後台開發人員,以及從傳統軟體行業轉向 App 後台開發的技術人員。  

編輯推薦

軟體開發老兵余晟為本書傾情作序,Bmob後端雲CEO何少岳、UCloud綜合研發中心高級工程師胡亞平、bilibili研發總監毛劍聯合力薦。

本書將告訴讀者如何用“正確的方式”使用各種已有的工具,將為讀者呈現一幅包括技術選型、後台搭建、性能最佳化、運維實踐、架構設計在內的App後台開發藍圖。

內容提要

《App 後台開發運維和架構實踐》通過闡述移動網際網路中 App 後台開發的特點,梳理了 App 後台開發中會遇到的各個技術點,給出了生產環境常用軟體的實戰運維經驗總結,剖析了常見 App 後台技術架構設計,為讀者呈現一幅包括技術選型、後台搭建、性能最佳化、運維實踐、架構設計的 App 後台開發藍圖。

《App 後台開發運維和架構實踐》的目標讀者是對技術感興趣的產品經理、剛入行的 App 後台開發人員,以及從傳統軟體行業轉向 App 後台開發的技術人員。

目錄

推薦序 .. 3

前言 5

致謝 7

目錄 8

第1 章 App 後台入門 .. 16

1.1 App 後台的功能 16

1.2 App 後台架構 . 17

1.3 App 和App 後台的通信 .. 19

1.4 App 後台和Web 後端的區別 .. 22

1.5 選擇伺服器 . 23

1.6 選擇程式語言 24

1.7 快速入門新技術 .. 25

1.7.1 思維模式 25

1.7.2 4 種快速入門新技術的方法 .. 25

1.8 App 是怎樣煉成的 .. 26

1.8.1 項目啟動階段 . 26

1.8.2 研發階段 28

1.8.3 測試階段 29

1.8.4 正式推出階段 . 29

1.9 最適合App 的開發模式——敏捷開發 .. 30

1.9.1 Sprint 計畫會議 . 31

1.9.2 日常開發 32

1.9.3 每日例會 33

1.9.4 測試和修復Bug 33

1.9.5 評審會議 34

1.9.6 回顧會議 34

1.9.7 及時反饋 34

1.9.8 總結.. 34

第2 章 App 後台基礎技術 . 35

2.1 從App 業務邏輯中提煉API 接口 . 35

2.1.1 業務邏輯思維導圖 .. 36

2.1.2 功能—業務邏輯思維導圖 .. 37

2.1.3 基本功能模組關係 .. 40

2.1.4 功能模組接口UML(設計出API) 41

2.1.5 編寫線上API 測試文檔 42

2.1.6 設計稿標註API 45

2.2 設計API 的要點 .. 46

2.3 如何選擇合適的資料庫產品 . 50

2.3.1 Redis,MongoDB,MySQL 讀寫數據的區別 50

2.3.2 Redis,MongoDB,MySQL 查找數據的區別 50

2.3.3 Redis,MongoDB,MySQL 適用場景 51

2.4 如何選擇訊息佇列軟體 .. 52

2.4.1 為什麼要用訊息佇列? 52

2.4.2 訊息佇列的工作流程 . 53

2.4.3 常見的一些訊息佇列產品 .. 54

2.5 使用分散式服務實現業務的復用 .. 54

2.5.1 巨無霸系統的危害 .. 55

2.5.2 遠程服務的優點 56

2.5.3 遠程服務的實現 56

2.6 搜尋技術入門 59

2.6.1 一個簡單的搜尋例子 . 59

2.6.2 搜尋技術的基本原理 . 60

2.6.3 常見的開源搜尋軟體介紹 .. 62

2.7 定時任務 .. 65

2.7.1 Linux 定時任務Crontab 65

2.7.2 在後台輕鬆管理各種各樣的定時任務 66

第3 章 App 後台核心技術 . 68

3.1 用戶驗證方案 68

3.1.1 使用HTTPS 協定 . 68

3.1.2 基本的用戶登錄方案 . 69

3.2 App 通信安全 . 72

3.2.1 URL 簽名 .. 72

3.2.2 AES 對稱加密 74

3.2.3 更進一步的通信安全 . 77

3.3 簡訊服務 .. 78

3.3.1 App 後台傳送簡訊簡介 78

3.3.2 選擇簡訊平台 . 78

3.3.3 建立可靠的簡訊服務 . 79

3.4 處理表情的一些技巧 80

3.4.1 表情在MySQL 的存儲 . 80

3.4.2 當文字中夾帶表情的處理 .. 80

3.4.3 Openfire 中傳送表情引起連線斷開的問題 .. 81

3.5 高效更新數據 82

3.5.1 內容的推拉 .. 83

3.5.2 數據增量更新策略 .. 84

3.6 圖片處理 .. 90

3.7 視頻處理 .. 91

3.7.1 FFmpeg 簡介 .. 91

3.7.2 後台調用FFmpeg 的功能 92

3.8 獲取APK 和IPA 檔案里的資源 . 94

3.8.1 Android 的APK 檔案 . 94

3.8.2 iOS 的IPA 檔案 96

3.9 檔案系統 .. 98

3.9.1 檔案雲存儲服務 99

3.9.2 架設檔案系統 . 99

3.10 ELK 日誌分析平台 101

3.10.1 基本模組 .. 101

3.10.2 日誌分析流程 102

3.11 Docker 構建一致的開發環境 .. 103

3.11.1 Docker 原理 103

3.11.2 搭建一致的開發環境 104

第4 章 Linux——App 後台套用最廣泛的系統 .. 107

4.1 基本的系統最佳化 107

4.1.1 開機自啟動服務最佳化 .. 107

4.1.2 增大檔案描述符 . 109

4.2 常用的命令 .. 110

4.2.1 全面了解系統資源情況——top 110

4.2.2 顯示進程狀態——ps .. 115

4.2.3 查看網路相關信息——netstat .. 116

4.2.4 查看某個進程打開的所有檔案——lsof .. 118

4.2.5 跟蹤數據到達主機所經路由——traceroute .. 119

4.2.6 檔案下載/上傳工具——“ssh secure shell client”和“lrzsz” . 119

4.2.7 查看程式的依賴庫——LD_DEBUG . 121

4.2.8 進程管理利器——superivisor 122

4.3 故障案例分析 . 125

第5 章 Nginx——App 後台HTTP 服務的利器 . 126

5.1 簡介 . 126

5.2 基本原理 127

5.2.1 工作模型 . 127

5.2.2 進程解析 . 128

5.3 常用配置 129

5.3.1 Nginx 的全局配置 . 130

5.3.2 event 配置 .. 130

5.3.3 http 配置 .. 131

5.3.4 負載均衡配置 .. 133

5.3.5 server 虛擬主機配置 134

5.3.6 location 配置 . 134

5.3.7 HTTPS 的配置 . 135

5.3.8 下載App 的配置 136

5.3.9 生產環境中修改配置的良好習慣 136

5.4 性能統計 136

5.5 實現負載均衡的方案 . 137

5.6 用Nginx 處理業務邏輯 . 139

第6 章 MySQL——App 後台最常用的資料庫 .. 140

6.1 基本架構 140

6.2 選擇版本 141

6.3 配置檔案詳解 . 142

6.4 軟體最佳化 144

6.4.1 正確使用MyISAM和InnoDB 存儲引擎 144

6.4.2 正確使用索引 .. 145

6.4.3 避免使用select * 146

6.4.4 欄位儘可能地設定為NOT NULL .. 146

6.5 硬體最佳化 147

6.5.1 增加物理記憶體 .. 147

6.5.2 增加套用快取 .. 147

6.5.3 用固態硬碟代替機械硬碟 148

6.5.4 SSD 硬碟+SATA 硬碟混合存儲方案 149

6.6 架構最佳化 149

6.6.1 分表 150

6.6.2 讀寫分離 . 151

6.6.3 分庫 153

6.7 SQL 慢查詢分析 156

6.8 雲資料庫簡介 . 157

6.9 靈活的存儲結構 158

6.10 故障排除案例 .. 159

第7 章 Redis——App 後台高性能的快取系統 . 160

7.1 Redis 簡介 . 160

7.2 Redis 的常用數據結構及套用場景 . 161

7.2.1 string——存儲簡單的數據 .. 162

7.2.2 hash——存儲對象的數據 163

7.2.3 list——模擬佇列操作 . 165

7.2.4 set——無序且不重複的元素集合 .. 167

7.2.5 sorted set——有序且不重複的元素集合 . 168

7.3 記憶體最佳化 170

7.3.1 監控記憶體使用的狀況 .. 170

7.3.2 最佳化存儲結構 .. 170

7.3.3 限制使用的最大記憶體 .. 172

7.3.4 設定過期時間 .. 172

7.4 集群 . 174

7.4.1 客戶端分片 174

7.4.2 Twemproxy 175

7.4.3 Codis . 176

7.4.4 Redis 3.0 集群 .. 179

7.4.5 雲伺服器上的集群服務 . 180

7.5 持久化 . 180

7.5.1 RDB .. 181

7.5.2 AOF 182

7.6 故障排除案例 . 184

第8 章 MongoDB——App 後台新興的資料庫 .. 185

8.1 簡介 . 185

8.2 核心機制解析 . 186

8.2.1 MMAP(記憶體檔案映射) 186

8.2.2 Journal 日誌 .. 187

8.3 入門 . 187

8.3.1 基本操作 . 188

8.3.2 數組操作 . 190

8.3.3 實例演示MySQL 和MongoDB 設計資料庫的區別 191

8.4 高可用集群 .. 195

8.4.1 主從 195

8.4.2 副本集 .. 196

8.4.3 分片 198

8.5 LBS——地理位置查詢 . 200

8.6 MongoDB 3.0 版本的改進 205

8.6.1 靈活的存儲架構 . 206

8.6.2 性能提升7~10 倍 .. 206

8.6.3 存儲空間最多減少80% 207

8.6.4 運維成本最多降低95% 207

第9 章 App 後台架構剖析 .. 208

9.1 聊天App 後台架構 .. 208

9.1.1 移動網際網路的網路特性 . 209

9.1.2 協定 212

9.1.3 整體架構 . 218

9.2 社交App 後台架構 .. 221

9.2.1 基本表結構 222

9.2.2 推拉模式 . 223

9.2.3 資料庫架構的演進 225

9.2.4 快取架構的演進 . 229

9.3 LBS App 後台架構 . 234

9.3.1 地理坐標詳解 .. 235

9.3.2 查找附近的人 .. 236

9.3.3 基於MongoDB 的LBS 後台架構演進 . 240

9.4 推送伺服器後台架構 . 242

9.4.1 Android 推送 242

9.4.2 iOS 推送 .. 248

9.5 獲得更多App 後台架構資料 . 252

第10 章 App 後台架構的演進 255

10.1 架構的核心要素 . 255

10.1.1 高性能 256

10.1.2 高可用 258

10.1.3 可伸縮 261

10.1.4 可擴展 262

10.1.5 安全性 262

10.2 架構選型的要點 . 262

10.2.1 用成熟穩定的開源軟體 .. 263

10.2.2 儘可能使用雲服務 . 264

10.3 架構的演進 268

10.3.1 單機部署 .. 269

10.3.2 分散式部署 . 275

10.3.3 服務化 277

10.4 架構的特點 279

10.4.1 每個App 的後台架構不會完全一樣 .. 279

10.4.2 架構的演進是由業務驅動的 279

10.4.3 架構不是為了炫耀技術 .. 280

精彩節摘

推薦序

十八般兵器入門

軟體開發工具的成長速度遠遠超過開發人員的成長速度,這是現實。

每個月,甚至每天,我們都可以見到新的類庫、框架、工具、語言。它們或者極大地降低了開發的成本,或者極大地提升了開發的效率。

隨之而來的問題就是,如何讓開發人員妥善地運用好這些工具?

曾經有好幾個做開發的同事跟我說:“寫軟體誰不會?從網上找些開源的類和項目來改改就是了”。目前也確實充斥著這種“改改就是”的工作思維。介紹某個類庫和項目如何安裝和調用的文章俯拾皆是。

但是每種工具究竟有什麼優缺點?適合用來解決什麼問題?需要以怎樣的方式來解決問題?因此還需要做怎樣的權衡?這樣的問題基本沒有人考慮,但是,它們又很重要。

這有點像練武。斧鉞鉤叉、刀槍劍戟,製造手藝日漸精良;可是習武的人心裡沒有分寸,該劈的時候提了槍,該刺的時候掄了斧…… 耍幾下花把式還算足夠,真正打起來哪能取勝?

我在面試新人中經常提的問題是:NoSQL 分為哪幾種類型?每種類型的典型代表和套用場景是什麼?要知道,用過MongoDB 和Redis 的人比比皆是,但回答不上這幾個問題的也大有人在。這樣的候選人,我是決計不敢要的。稍加不注意,他們就可能用Redis 存文檔,用MongoDB 做複雜運算,甚至“大膽”用Redis 來替換資料庫以解決性能瓶頸——噢,你說起“事務”,Redis 也是有“事務”的呀。

對這樣的人,你真讓他們去研究MongoDB 或者Redis,讓他們去通讀一本專著,似乎有點划不來,他們自己也沒有那么多耐心。所以我常想,有沒有一本“薄而廣”的書,專注於開拓大家的眼界,並教導大家用“正確的方式”來使用各種已有的工具。如今我們雖然有海量的框架和類庫,有突飛猛進的雲服務,但是只要沒有掌握“正確的套用方式”,就無法保證“把事情做對”,就只能開發出某幾個方面明顯不及格的產品。

所以當我看到曾健生編著的《App 後台開發運維和架構實踐》時,不由得眼前一亮。這正是一本“薄而廣”的書,它絕不像《打狗棍法》或者《辟邪劍法》,不負責地教你把某門特別的武功練到極致,而更像《十八般兵器入門》,告訴你刀槍劍戟各適合什麼場景,使用時有什麼注意事項。典型的例子如關於Redis 的部分,它講的不是Redis 如何安裝,如何調用,而是結合傳送簡訊、社交關係計算等典型套用場景講解Redis 的使用方式,並介紹在Redis 提供內建集群之前,市面上的各種集群的方案和優劣。這樣雖然只有一章的篇幅,但為普通開發人員提供的價值絕對要比兩三本Redis 專著都要大,而且讀起來更有效率。

古代練武的人,未必人人都要做武林高手,許多人只是把十八般兵器都耍熟,就已經足夠防賊、保平安,受益匪淺了。同樣的道理,對今天的App 後台開發人員來說,把基本的點都踩到、踩準,把系統拎到及格線以上,避免明顯的缺憾,對大多數場景來說,已經是意義重大了。

余晟

軟體開發老兵,微信公眾號“余晟以為”

前言

筆者在2012 年從開發電子商務網站轉向了開發App 後台,當時在一家做社交App 的創業公司里工作,筆者和搭檔都沒有任何從事移動網際網路開發的經驗,不清楚App 後台怎么架構,只能摸著石頭過河,那時網路上只有一些零散的資料,當遇到問題時只能不斷地摸索和思考,來找到解決問題的方法。

在從事開發App 後台接近4 年的時間中,筆者參與了兩款社交App 的開發,現在就職於bmob,從事雲後台服務的研發工作,慢慢地對App 後台的架構有了一些體會。

從2013 年年底開始,筆者把工作筆記發表在CSDN 部落格專欄“App 後端技術架構”,陸陸續續收到了很多網友的反饋,後來在QQ 裡面接觸了很多剛剛從事開發App 後台的開發者、找技術合伙人的創業者,在聊天的過程中,發現很多基本的問題被不停地問,例如:

佇列有什麼用?

Redis 的套用場景有哪些?

怎么保證通信的安全性?

看著對未來無限嚮往的同行也在重複著本人當初經歷過的迷茫,也在糾結著這些技術問題,在網路上,沒找到一本系統講述App 後台架構的書籍,能搜尋到的不是“高大尚”公司的解決方案,就是針對一個技術點很詳細的講解。

於是在網友的鼓勵下,筆者決定把本人所掌握的開發App 後台的知識系統地講解一次(當時計畫是寫30 篇左右的文章),筆者利用業餘的時間陸陸續續地寫成文章發表在CSDN部落格專欄“App 後端技術架構”,這也是本書前3 章的初稿。

後來在博文視點的付睿編輯幫助下,筆者有機會把自身所學習的知識再系統地整理一次,以書籍的形式展現給各位讀者,希望本書能夠幫助更多的剛進入App 後台開發的朋友們,以及對App 後台技術感興趣的產品經理和Android、iOS 開發者。App 後台開發運維和架構實踐

因為本書的讀者定位主要是App 後台的初學者,因此筆者儘量以圖文並茂的方式給讀者介紹App 後台各方面的技術。

筆者一向推崇的架構原則是,“儘量使用成熟可靠的雲服務和開源軟體,自身只專注於業務邏輯”,對於某項具體的技術必須掌握下面兩點。

技術的套用場景。

技術的基本原理。

掌握上面兩點後就能對這項技術有了基本的了解,在此基礎上技術選型的優先權如下。

雲服務。

開源軟體。

自主研發。

通過上面的措施能在最大程度上減輕技術人員的額外研發負擔,讓自身的精力更加專注於業務。

至於某項技術的其他方面,例如怎么部署、開源軟體的深度剖析等,筆者並不打算在本書中做深入的闡述,讀者如果感興趣可自行深入學習。筆者希望在本書中能給讀者描繪一個App後台開發的藍圖。

本書主要分為4 部分。

第1~3 章:App 後台常用技術的講解。

第4~8 章:App 後台常用軟體的運維和相關原理。

第9 章:4 種類型App 的後台架構。

第10 章:App 後台架構的知識。

相關詞條

熱門詞條

聯絡我們