這是一部從實操的角度講解各種類型的游戲和應用服務器的架構、設計、開發(fā)和優(yōu)化的著作。
作者是資深的游戲服務器技術專家和底層技術專家,有20余年開發(fā)和管理經(jīng)驗,曾在網(wǎng)易工作7年,參與過各種類型的游戲的研發(fā)。
本書針對MMORPG、SLG、卡牌、3D虛擬社區(qū)等各種游戲,以及App、深度學習服務、商城等各種應用對應的各種類型的服務器的研發(fā)和優(yōu)化給出了具體的指導意見。從單機到集群,從基礎的網(wǎng)絡編程到分布式架構,由淺入深、承上啟下、前后呼應,整本書內容前后貫穿、邏輯縝密,對于開發(fā)和運維人員來說相當實用。
全書共13章,分為三個部分:
*部分(第1~3章) 網(wǎng)絡和服務器
本書以Python為描述語言,所以首先詳細講解了Python中的網(wǎng)絡編程模塊,然后講解了服務器相關的通信加密、WebSocket、多線程等技術。
第二部分(第4~5章) 存儲和數(shù)據(jù)庫
這部分首先講解了數(shù)據(jù)庫存儲的基礎知識,如內存數(shù)據(jù)同步、數(shù)據(jù)備份與恢復、SQLite等;然后重點介紹了高并發(fā)服務器的存儲方案、高速緩存方案、二進制緩存方案、大規(guī)模計算方案,以及基于區(qū)塊鏈技術的存儲方案。
第三部分(第6~13章) 服務器架構及其優(yōu)化
第6章和第7章介紹了服務器的架構演變以及不同類型的游戲服務器各自是如何交互的;第8章和第9章詳細講解了游戲大廳和實時交互服務器的架構、開發(fā)和優(yōu)化;第10章講解了天梯和經(jīng)濟系統(tǒng)的開發(fā)與設計;第11章講解了服務器的承載量以及客戶端的優(yōu)化方案;第12章介紹了分布式服務器相關的技術;第13章從語言的角度對游戲服務器開發(fā)的技術選型給出了非常全面的分析。
(1)作者是資深服務器底層技術專家、游戲服務器開發(fā)專家,20余年經(jīng)驗總結,曾在網(wǎng)易工作7年,參與過各種類型游戲和應用的服務器的架構、設計和開發(fā);
(2)針對各種游戲和應用所對應的服務器類型,從單機到集群,有針對性地對服務器進行架構上的剖析和優(yōu)化;
(3)極客邦科技(InfoQ)和Talkingdata增長黑客負責人于洋鼎力推薦。
前 言
為什么要寫這本書在人們的觀念中,游戲行業(yè)是一個既火爆又賺錢的行業(yè),而游戲開發(fā)在非游戲開發(fā)人員的心里,則是比較神奇的存在。隔行如隔山,游戲究竟是如何開發(fā)的?游戲服務器究竟又是怎樣工作的?軟件服務器后臺開發(fā)人員對于游戲服務器的開發(fā)充滿興趣,而對于本身就是游戲開發(fā)者的人來說,對于更深層次的服務器邏輯,各種類型游戲服務器的區(qū)分和編寫,各種平臺的優(yōu)化,都需要進行更進一步的了解。
作為游戲開發(fā)人員,H5 Game和Flash Game之間通信的差異在哪里?MMORPG的服務器究竟該怎么編寫?HTTPS通信和普通HTTPS協(xié)議有何區(qū)分?如何進行分布式編程?如何提高游戲服務器的高并發(fā)量?這些都是需要重點關心的問題。
不僅僅是游戲開發(fā)人員,作為普通后臺開發(fā)人員,配置負載均衡,利用后臺程序之間的相互通信進行負載,也是比較關心的問題,F(xiàn)今琳瑯滿目的開發(fā)包、開發(fā)工具,讓這些事情變得事半功倍,在這樣的情況下,如何利用現(xiàn)有的工具來進行配置,提高并發(fā)量,或者如何利用分布式計算來提高業(yè)務效率、工作效率,盡其所能地發(fā)揮工具的最大效率,也成為我們必須面對并解決的問題。
對于運維人員來說,面對的不僅僅是服務于程序員的各種后臺配置,也需要集群配置、HTTPS,甚至各種類型數(shù)據(jù)庫的配置。
針對以上提到的所有問題,本書會進行深入挖掘。
本書中99%使用Python語言進行代碼或者偽代碼的編寫和說明,為什么使用Python?這是因為雖然開發(fā)游戲服務器的語言多種多樣,包括C/C 、Python、Node.JS等,但Python是目前上升熱度最快,且用戶呈直線增長的一種語言,其簡潔的特性,就算是非專業(yè)程序員都可以很快掌握,學習成本不高,且能達到較為滿意的產(chǎn)出。
從國內的情況來看,關于Python或游戲開發(fā)的書籍都很多,但是將兩者合二為一進行講解和說明的卻并不多見。筆者在幾十年的工作過程當中,經(jīng)歷了各種各樣的項目,雖然大部分屬于游戲行業(yè),但其他行業(yè)也有涉及,比如視頻類網(wǎng)站、人工智能、區(qū)塊鏈等。在經(jīng)歷這些項目的過程中,我看到很多的團隊和開發(fā)人員為了某一個項目和業(yè)務的功能進行各種細節(jié)上的取舍,或者各種沒有經(jīng)驗一腳踩進大坑,這讓我萌生編寫本書的想法。我希望能盡一點微薄之力,將在游戲后臺或其他后臺開發(fā)過程中所經(jīng)歷的各種問題、優(yōu)化方案及解決方案,進行一個提煉和匯總,如果能具體解決讀者的各種問題,那就是本書之幸,本人之福。
讀者對象本書針對游戲服務器、應用服務器后臺的優(yōu)化、搭建以及應用進行講解和介紹。為了照顧各個層面的讀者,本書使用的語言是Python 2.7版本,書中并沒有就Python基礎規(guī)則和語法做詳細介紹,因此要求讀者具有基本的Python編程知識,比如Python庫的導入、pip包安裝工具的使用、調用庫函數(shù)等基礎語法知識。事實上,如果你專心花上幾個小時的時間自學一下Python,就能具備Python的編程基礎。
本書對讀者的知識背景沒有特定要求,如果你擁有了Python編程基礎,看完本書應該對服務器端需要做什么、應該做什么、怎么做,有了然于胸的感覺。具體來說,本書適合以下幾類讀者閱讀:
游戲服務器程序員。本書的核心命題就是游戲服務器的優(yōu)化,其中涉及游戲服務器的基礎、搭建;Socket知識、HTTPS基礎;以及使用Python進行實作和優(yōu)化。無論你是游戲后臺開發(fā)人員還是客戶端開發(fā)人員,都可以從書中獲益。
應用服務器開發(fā)程序員。雖說游戲服務器程序員是重點,但是我們的核心議題仍然是服務器后臺的開發(fā),所以從這點來說,應用服務也是后臺程序,本書在剖析游戲服務器后臺編寫和優(yōu)化的同時,也涉及了分布式系統(tǒng)、集群,甚至Web服務器,或許在閱讀本書后你會迸發(fā)一些靈感。
運維工程師。事實上,只要是服務器開發(fā),都會涉及運維的工作,而一個好的運維,必須而且一定會涉及各種腳本語言的開發(fā)和對現(xiàn)有系統(tǒng)的擴展。當一個團隊中的程序員忙得不可開交的時候,一個好的運維能幫助程序員分擔40%甚至更多的工作量。本書也介紹和挖掘了后臺編碼過程中的各種配置和搭建,比如HTTPS的配置、Websocket的Python實現(xiàn)等。如果你是運維工程師,或多或少會從書中汲取一些知識。
Python程序員。Python能做什么?它也能編寫游戲服務器嗎?答案是肯定的。只要你做得好,搭配得當,使用Python編寫游戲后臺不會比其他語言差(比如Java),有時候甚至更方便。如果你是Python程序員,又希望涉獵游戲后臺的開發(fā),本書一定會對你有極大幫助。
如何閱讀本書本書內容從邏輯上共分為三大部分。
第一部分的內容包括第1~3章,主要介紹了Python中網(wǎng)絡的基礎模塊、通信加密,以及一部分服務器實作。其中:
第1章的內容包含Socket套接字的介紹和使用、基礎send和recv方法、阻塞和非阻塞方式、urllib和urllib2等Python基礎庫的使用。
第2章介紹了通信加密,其中包括基礎的異或加密、對稱和非對稱加密,以及OpenSSL、SSL/TLS通信方式等的詳細介紹。
第3章開始使用Python代碼編寫實際可運行的服務器代碼,并介紹了Websocket協(xié)議、GIL的優(yōu)劣,以及Python線程池的使用。
第二部分的內容包括第
蔡能(DarkSpy)
資深服務器底層技術專家和游戲服務器開發(fā)專家,有超過20年的編碼和團隊管理經(jīng)驗,是網(wǎng)易的早期員工之一。
在游戲開發(fā)領域有非常深厚的積累,帶領團隊開發(fā)了各種類型(PC游戲、手游、頁游、2D游戲、3D游戲、VR/AR游戲等)的游戲和應用服務器,對服務器的架構、編寫、優(yōu)化和并發(fā)策略有深刻的認識和獨到的見解;在C/C 、Python、PHP等技術領域的經(jīng)驗十分豐富。
1996~2009年期間,曾編寫過極富盛名的EasyCode和EasyCode Pro,以及其他被收錄到各大雜志典藏光碟的軟件,EasyCode 在參加《程序員》網(wǎng)站舉辦的"中國共享軟件評比"活動時得票數(shù)在同類軟件中名列第一。是《程序員》雜志2007~2008年C/C 領域的點評專家,擅長軟件架構和底層技術。2013年7月,接受《今日早報》關于游戲行業(yè)的采訪。
目 錄?Contents
前 言
第一部分 網(wǎng)絡和服務器
第1章 Python網(wǎng)絡編程模塊 2
1.1 Python Socket 3
1.1.1 Socket套接字 3
1.1.2 SOCK_STREAM、SOCK_DGRAM 4
1.1.3 阻塞和非阻塞模式 5
1.2 服務器端其他Socket方法 7
1.2.1 bind和listen 7
1.2.2 setsockopt 8
1.3 客戶端Socket 10
1.4 通用的Socket方法 12
1.4.1 recv和send 12
1.4.2 recvfrom和sendto 13
1.5 SimpleHTTPServer和BaseHTTPServer 14
1.5.1 SimpleHTTPServer 15
1.5.2 BaseHTTPServer 15
1.6 urllib和urllib2 17
1.6.1 urllib.urlopen和urllib2.urlopen 18
1.6.2 urllib2中的GET和POST方法 19
1.7 事件驅動框架Twisted 20
1.7.1 Reactor模式 21
1.7.2 run、stop和callLater 23
1.7.3 Transports、Protocols、Protocol Factoies以及Deferred 24
第2章 通信加密 26
2.1 軟件、通信加密的幾種常用方案 27
2.1.1 異或位運算加密 27
2.1.2 其他對稱加密 29
2.1.3 非對稱加密 30
2.2 OpenSSL 33
2.2.1 生成證書 35
2.2.2 公鑰和私鑰的配置 40
2.3 SSL/TLS通信 43
2.3.1 SSL/TLS連接 45
2.3.2 SSL/TLS HTTPS通信 46
2.4 其他加密方式 49
2.4.1 散列算法 49
2.4.2 BASE64 52
2.4.3 多國語言 53
第3章 服務器實作 55
3.1 構建Python Websocket服務器 55
3.1.1 Websocket的應用場景 57
3.1.2 實作Websocket握手協(xié)議 59
3.1.3 MAGIC_STRING在Websocket中的作用 60
3.1.4 Websocket 啟動 62
3.1.5 Websocket消息拆分和讀取 63
3.2 多線程服務器 64
3.2.1 Python的多線程模式 65
3.2.2 鎖 68
3.2.3 Python GIL 70
3.2.4 multiprocess的解決思路 72
3.2.5 給Websocket加上多線程 73
3.3 線程池 75
3.3.1 默認線程池和進程池 75
3.3.2 協(xié)程 76
3.3.3 第三方庫 78
3.3.4 gevent的數(shù)據(jù)結構 85
第二部分 存儲與數(shù)據(jù)庫
第4章 基礎內容存儲 94
4.1 數(shù)據(jù)庫存儲的種類 95
4.2 SQL與NoSQL 96
4.2.1 SQL 96
4.2.2 SQL語句語法 97
4.2.3 NoSQL 101
4.2.4 NoSQL語句語法 106
4.3 內存與IO讀寫速度 108
4.4 同步內存數(shù)據(jù) 109
4.4.1 Redis數(shù)據(jù)庫的持久性 111
4.4.2 Redis主從數(shù)據(jù)庫復制 112
4.5 數(shù)據(jù)備份和恢復 113
4.5.1 備份的類型 114
4.5.2 使用Python編寫備份代碼 115
4.6 不可或缺的SQLite 117
第5章 存儲方案 121
5.1 高并發(fā)服務器的存儲方案 121
5.1.1 網(wǎng)站高并發(fā)服務器的策略 122
5.1.2 數(shù)據(jù)庫的鎖 125
5.2 高速緩存 127
5.2.1 Memcached 127
5.2.2 大文件緩存 129
5.2.3 分布式和集群 130
5.3 二進制存儲方案 132
5.3.1 磁盤IO和緩存 133
5.3.2 圖片和影音文件 134
5.4 大規(guī)模計算 135
5.4.1 圖片服務器的架構 136
5.4.2 讀取和寫入文本 137
5.4.3 文本搜索方案 138
5.5 區(qū)塊鏈技術 139
第三部分 服務器架構及其方案
第6章 游戲服務器初探 144
6.1 服務器消息和輪詢 144
6.1.1 卡牌游戲和弱連接 145
6.1.2 消息的輪詢 147
6.2 游戲服務器架構演變 149
6.2.1 上古時代的游戲服務器 149
6.2.2 近代的網(wǎng)絡游戲服務器 153
6.2.3 近現(xiàn)代經(jīng)典游戲服務器模型 155
6.3 地圖的無縫連接 157
6.3.1 無縫連接的分析 158
6.3.2 無縫地圖更深層次的問題 160
第7章 游戲服務器的交互 165
7.1 無狀態(tài)和有狀態(tài)的服務器設計方案 165
7.1.1 無狀態(tài)的服務器設計方案 166
7.1.2 有狀態(tài)的服務器設計方案 167
7.2 輪詢 169
7.3 集群方案 171
7.3.1 集群的幾種方式 171
7.3.2 集群的方案 172
7.3.3 數(shù)據(jù)庫方案 173
7.3.4 Web服務和數(shù)據(jù)庫 174
7.3.5 其他方案 176
7.4 定時任務 178
第8章 游戲大廳 181
8.1 大廳登錄流程 181
8.1.1 登錄和選擇游戲區(qū) 182
8.1.2 注冊和登錄 183
8.2 中間件 185
8.2.1 中間件的相關概念 186
8.2.2 ElasticSearch 191
8.2.3 在Python中使用ES 193
8.3 聊天服務 195
8.3.1 聊天服務器的搭建 195
8.3.2 聊天內容的獲取和分發(fā) 196
8.4 大廳與游戲的對接 198
8.4.1 創(chuàng)建房間 198
8.4.2 與游戲的對接 199
第9章 實時交互服務器 202
9.1 長連接和強交互 202
9.1.1 TCP連接 203
9.1.2 多線程 205
9.1.3 異步控制 206
9.1.4 加入隊列 207
9.2 使用UDP的方案 210
9.2.1 什么是UDP協(xié)議 210
9.2.2 TCP協(xié)議和UDP協(xié)議的區(qū)別 212
9.2.3 使用Python編寫UDP服務 214
9.2.4 加入多線程 216
9.3 協(xié)議包的設計和實現(xiàn) 218
9.3.1 協(xié)議包頭和包身 219
9.3.2 協(xié)議包完整性 221
9.3.3 協(xié)議的加密和壓縮 222
9.3.4 協(xié)議包混淆 223
9.4 斷線重連 224
第10章 天梯和經(jīng)濟系統(tǒng) 227
10.1 什么是天梯 227
10.1.1 天梯的框架 229
10.1.2 數(shù)據(jù)載入 230
10.2 天梯層級 231
10.3 經(jīng)濟系統(tǒng) 234
10.3.1 經(jīng)濟系