ioGame網(wǎng)絡(luò)游戲框架
愿景
讓網(wǎng)絡(luò)游戲服務(wù)器的編程變得輕松簡單!
ioGame 網(wǎng)絡(luò)游戲服務(wù)器框架簡介
- 無鎖異步化、事件驅(qū)動的架構(gòu)設(shè)計;輕量級,無需依賴任何第三方中間件或數(shù)據(jù)庫就能支持集群、分布式
- 通過 ioGame 可以很容易的搭建出一個集群無中心節(jié)點(diǎn)、集群自動化、多進(jìn)程的分步式游戲服務(wù)器
- 包體小、啟動快、內(nèi)存占用少、更加的節(jié)約、無需配置文件、提供了優(yōu)雅的路由訪問權(quán)限控制
- 讓開發(fā)者用一套業(yè)務(wù)代碼,無需任何改動,同時支持多種通信協(xié)議:WebSocket、TCP
- 讓開發(fā)者用一套業(yè)務(wù)代碼,能輕松切換和擴(kuò)展不同的通信協(xié)議:Protobuf、JSON
- 近原生的性能;業(yè)務(wù)框架在單線程中平均每秒可以執(zhí)行 1152 萬次業(yè)務(wù)邏輯
- 代碼即聯(lián)調(diào)文檔、JSR380驗證、斷言 + 異常機(jī)制 = 更少的維護(hù)成本
- 在業(yè)務(wù)開發(fā)中,提供了業(yè)務(wù)邏輯的執(zhí)行信息、代碼定位與跳轉(zhuǎn)等
- 架構(gòu)部署靈活性與多樣性:既可相互獨(dú)立,又可相互融合
- 可同時與同類型的多個游戲邏輯服通信并得到數(shù)據(jù)
- 邏輯服之間可相互跨進(jìn)程、跨機(jī)器進(jìn)行通信
- 支持玩家對游戲邏輯服進(jìn)行動態(tài)綁定
- 能與任何其他框架做融合共存
- 對 webMVC 開發(fā)者友好
- 無 spring 強(qiáng)依賴
- 零學(xué)習(xí)成本
你是否想要開發(fā)一個高性能、穩(wěn)定、易用、自帶負(fù)載均衡、避免類爆炸設(shè)計、可跨進(jìn)程跨機(jī)器通信、集群無中心節(jié)點(diǎn)、集群自動化、有狀態(tài)多進(jìn)程的分步式的網(wǎng)絡(luò)游戲服務(wù)器呢?如果是的話,這里向你推薦一個由 java 語言編寫的網(wǎng)絡(luò)游戲服務(wù)器框架 ioGame。下面將會從多個方面來對框架做一些簡單的介紹。
ioGame 是一個 java 網(wǎng)絡(luò)游戲服務(wù)器框架,有以下特點(diǎn):
- 無鎖異步化、事件驅(qū)動的架構(gòu)設(shè)計
- 支持 websocket 和 socket 兩種通信協(xié)議
- 支持 protobuf、json 等不同的通信協(xié)議
- 集群無中心節(jié)點(diǎn)、集群自動化、分布式的設(shè)計
- 輕量級,不依賴第三方中間件或數(shù)據(jù)庫就能支持集群、分布式
- 提供多種通訊方式,且邏輯服之間可以相互跨機(jī)器通信
- 與 spring 和其他框架融合方便
- 學(xué)習(xí)成本低,開發(fā)體驗好
- 支持多服單進(jìn)程、多服多進(jìn)程的啟動和部署方式
- 提供游戲文檔生成的輔助功能
- 包體小、啟動快、內(nèi)存占用少
- 提供優(yōu)雅的路由訪問權(quán)限控制
ioGame 是一個專為網(wǎng)絡(luò)游戲服務(wù)器設(shè)計的輕量級框架,它可以幫助你快速地搭建和運(yùn)行自己的游戲服務(wù)器。它適用于各種類型和規(guī)模的網(wǎng)絡(luò)游戲,無論是 H5、手游還是 PC 游戲,無論是簡單的聊天室,還是復(fù)雜的全球同服、回合制游戲、策略游戲、放置休閑游戲、即時戰(zhàn)斗、MMORPG 等,ioGame 都可以滿足你的需求。
ioGame 在打包、內(nèi)存占用、啟動速度等方面也是優(yōu)秀的。打 jar 包后大約 15MB,應(yīng)用通常會在 0.x 秒內(nèi)完成啟動,內(nèi)存占用小。詳細(xì)請看 快速從零編寫服務(wù)器完整示例。
在生態(tài)融合方面,ioGame 可以很方便的與 spring 集成(5 行代碼);除了 spring 外,還能與任何其他的框架做融合,從而使用其他框架的相關(guān)生態(tài)。
在輕量級方面,ioGame 不依賴任何第三方中間件或數(shù)據(jù)庫就能支持集群、分布式,只需要 java 環(huán)境就可以運(yùn)行。這意味著在使用上簡單了,在部署上也為企業(yè)減少了部署成本、維護(hù)難度。使用 ioGame 時,只需一個依賴即可獲得整個框架,而無需在安裝其他服務(wù),如: Nginx、Redis、MQ、Mysql、ZooKeeper、Protobuf協(xié)議編譯工具 ... ...等。
在通訊方式方面,大部分框架只能支持推送(廣播)這一類型的通訊方式;而 ioGame 則提供了 3 種類型的通訊方式,分別是推送、單次請求處理、邏輯服之間相互通信。其中邏輯服之間相互通信,除了可以讓我們跨機(jī)器通信外,還能與同類型多個游戲邏輯服同時通信并得到結(jié)果;
在通信方面,ioGame 讓開發(fā)者用一套業(yè)務(wù)代碼,同時支持 WebSocket 和 TCP 兩種通信協(xié)議,無需做任何改動。這意味著一個游戲服務(wù)器可以同時接入 WebSocket 和 TCP 的游戲客戶端。
在通信協(xié)議方面,ioGame 讓開發(fā)者用一套業(yè)務(wù)代碼,就能輕松切換和擴(kuò)展不同的通信協(xié)議,如 Protobuf、JSON 等。只需一行代碼,就可以從 Protobuf 切換到 JSON,無需改變業(yè)務(wù)方法。
在集群方面,ioGame 的 Broker (游戲網(wǎng)關(guān))采用無中心節(jié)點(diǎn)、自動化的集群設(shè)計,所有節(jié)點(diǎn)平等且自治,不存在單點(diǎn)故障。集群能夠自動管理和彈性擴(kuò)縮,節(jié)點(diǎn)加入或退出時,能夠自動保證負(fù)載均衡和數(shù)據(jù)一致性,不影響服務(wù)可用性。
在分布式方面,ioGame 的邏輯服使用了分布式設(shè)計思想,將服務(wù)器分為游戲?qū)ν夥⒂螒蜻壿嫹炔煌瑢哟危⑶颐恳粚佣加忻鞔_的職責(zé)和接口。這樣可以提高代碼可讀性和可維護(hù)性,并且方便進(jìn)行水平擴(kuò)展。
在學(xué)習(xí)成本方面,ioGame 的學(xué)習(xí)成本非常低,可以說是零學(xué)習(xí)成本,即使沒有游戲編程經(jīng)驗,也能輕松上手。開發(fā)者只需掌握普通的 java 方法或 webMVC 相關(guān)知識,就能用框架開發(fā)業(yè)務(wù)。框架不要求開發(fā)者改變編碼習(xí)慣,而是自身適應(yīng)開發(fā)者的需求。
在開發(fā)體驗方面,ioGame 非常注重開發(fā)者的開發(fā)體驗;框架提供了 JSR380驗證、斷言 + 異常機(jī)制、業(yè)務(wù)代碼定位... ...等諸多豐富的功能,使得開發(fā)者的業(yè)務(wù)代碼更加的清晰、簡潔;
在分布式開發(fā)體驗方面,通常在開發(fā)分布式應(yīng)用時是需要啟動多個進(jìn)程的。這會讓調(diào)試與排查問題變得非常困難,從而降低開發(fā)者的效率、增加工作量等,這也是很多框架都解決不了的問題,但 ioGame 做到了!ioGame 支持多服單進(jìn)程的啟動方式,這使得開發(fā)者在開發(fā)和調(diào)試分步式系統(tǒng)時更加簡單。
與前端對接聯(lián)調(diào)方面,ioGame 提供了游戲文檔生成的輔助功能,可以做到代碼即對接文檔。簡單地說,當(dāng)業(yè)務(wù)代碼編寫完后,框架會自動生成最新的文檔。如果沒有游戲文檔的生成,那么你將要抽出一些時間來編寫、維護(hù)對接文檔的工作,而且當(dāng)團(tuán)隊人數(shù)多了之后,文檔就會很亂、不同步、不是最新的、忘記更新等情況就會出現(xiàn)。
在部署方面,ioGame 支持多服單進(jìn)程的方式部署,也支持多服多進(jìn)程多機(jī)器的方式部署;在部署方式上可以隨意的切換而不需要更改代碼。日常中我們可以按照單體思維開發(fā),到了生產(chǎn)可以選擇使用多進(jìn)程的方式部署。
開發(fā)者基于 ioGame 編寫的項目模塊,通常是條理清晰的,得益于框架對路由的合理設(shè)計,同時也為路由提供了優(yōu)雅的訪問權(quán)限控制。當(dāng)我們整理好這些模塊后,對于其他開發(fā)者接管項目或后續(xù)的維護(hù)中,會是一個不錯的幫助(模塊的整理與建議)。或許現(xiàn)階段你感受不到這塊的威力,隨著你深入地使用實踐就能體會到這么設(shè)計的諸多好處與優(yōu)勢。
開發(fā)者基于 ioGame 編寫的項目,通常是語法簡潔的、高性能的、低延遲的;框架最低要求使用 JDK17,這樣即可以讓項目享受到 ZGC 帶來的改進(jìn),還能享受語法上的簡潔。從 JDK17 開始 ZGC 遠(yuǎn)低于其亞毫秒級暫停時間的目標(biāo),可以在不影響游戲速度的情況下,清理掉多余的內(nèi)存。這樣就不會出現(xiàn)卡頓或者崩潰的問題了,相當(dāng)于在項目中變相的引入了一位 JVM 調(diào)優(yōu)大師,詳細(xì)請看 JDK 17 垃圾回收 GC 性能飛躍提升。
綜上所述,ioGame 是一個非常適合網(wǎng)絡(luò)游戲開發(fā)的框架。可以讓你輕松地創(chuàng)建高性能、低延遲、易擴(kuò)展的游戲服務(wù)器,并且節(jié)省時間和資源。如果你想要快速地開發(fā)出令人驚艷的網(wǎng)絡(luò)游戲,請不要猶豫,立即選擇 ioGame 吧!框架屏蔽了很多復(fù)雜且重復(fù)性的工作,并可為項目中的功能模塊結(jié)構(gòu)、開發(fā)流程等進(jìn)行清晰的組織定義,減少了后續(xù)的項目維護(hù)成本。
相信你已經(jīng)對 ioGame 有了一個初步的了解,雖然還有很多豐富的功能與特性沒有介紹到,但你可以通過后續(xù)的實踐過程中來深入了解。感謝你的閱讀,并期待你使用 ioGame 來打造自己的游戲服務(wù)器。
ioGame 由 [網(wǎng)絡(luò)通信框架] 和 [業(yè)務(wù)框架] 組成
- 網(wǎng)絡(luò)通信框架:職責(zé)是各服務(wù)器之間的網(wǎng)絡(luò)通信
- 業(yè)務(wù)框架:職責(zé)是業(yè)務(wù)邏輯的處理方式和編寫方式
網(wǎng)絡(luò)通信框架 - SOFABolt
SOFABolt 是螞蟻金融服務(wù)集團(tuán)開發(fā)的一套基于 Netty 實現(xiàn)的網(wǎng)絡(luò)通信框架。
- 為了讓 Java 程序員能將更多的精力放在基于網(wǎng)絡(luò)通信的業(yè)務(wù)邏輯實現(xiàn)上,而不是過多的糾結(jié)于網(wǎng)絡(luò)底層 NIO 的實現(xiàn)以及處理難以調(diào)試的網(wǎng)絡(luò)問題,Netty 應(yīng)運(yùn)而生。
- 為了讓中間件開發(fā)者能將更多的精力放在產(chǎn)品功能特性實現(xiàn)上,而不是重復(fù)地一遍遍制造通信框架的輪子,SOFABolt 應(yīng)運(yùn)而生。
Bolt 名字取自迪士尼動畫-閃電狗,是一個基于 Netty 最佳實踐的輕量、易用、高性能、易擴(kuò)展的通信框架。
業(yè)務(wù)框架
如果說 sofa-bolt 是為了讓 Java 程序員能將更多的精力放在基于網(wǎng)絡(luò)通信的業(yè)務(wù)邏輯實現(xiàn)上。而業(yè)務(wù)框架正是解決業(yè)務(wù)邏輯如何方便實現(xiàn)這一問題上。業(yè)務(wù)框架是游戲框架的一部分,職責(zé)是簡化程序員的業(yè)務(wù)邏輯實現(xiàn),業(yè)務(wù)框架使程序員能夠快速的開始編寫游戲業(yè)務(wù)。
業(yè)務(wù)框架對于每個 action (即業(yè)務(wù)的處理類) 都是通過 asm 與 Singleton、Flyweight 、Command 等設(shè)計模式結(jié)合,對 action 的獲取上通過 array 來得到,是一種近原生的方式。
業(yè)務(wù)框架平均每秒可以執(zhí)行 1152 萬次業(yè)務(wù)邏輯。
架構(gòu)簡圖
通過 ioGame 你可以很容易的搭建出一個集群無中心節(jié)點(diǎn)、集群自動化、分步式的網(wǎng)絡(luò)游戲服務(wù)器!
無鎖異步化與事件驅(qū)動的架構(gòu)設(shè)計、集群無中心節(jié)點(diǎn)、自帶負(fù)載均衡、分布式支持、可動態(tài)增減機(jī)器、避免類爆炸的設(shè)計;
圖中的每個游戲?qū)ν夥⒚總€游戲邏輯服、每個 broker (游戲網(wǎng)關(guān))都可以在單獨(dú)的進(jìn)程中部署,邏輯服之間可以跨進(jìn)程通信(游戲?qū)ν夥彩沁壿嫹囊环N)。
游戲網(wǎng)關(guān)集群
broker (游戲網(wǎng)關(guān))支持集群的方式部署,集群的使用是簡單的,集群無中心節(jié)點(diǎn)、集群自動化、自帶負(fù)載均衡。ioGame 本身就包含服務(wù)注冊,你不需要外接一個服務(wù)注冊中心,如 Eureka,ZooKeeper 等(變相的節(jié)約服務(wù)器成本)。
通過 broker (游戲網(wǎng)關(guān)) 的介入,之前非常復(fù)雜的負(fù)載均衡設(shè)計,如服務(wù)注冊、健康度檢查(后續(xù)版本提供)、到服務(wù)端的連接維護(hù)等這些問題,在 ioGame 中都不需要了,結(jié)構(gòu)也簡單了很多。實際上單臺 broker (游戲網(wǎng)關(guān)) 性能已經(jīng)能夠滿足了,因為游戲網(wǎng)關(guān)只做了轉(zhuǎn)發(fā)。
邏輯服
邏輯服通常說的是游戲?qū)ν夥陀螒蜻壿嫹_壿嫹梢杂泻芏鄠€,邏輯服擴(kuò)展數(shù)量的理論上限是 netty 的連接上限。
游戲?qū)ν夥?/span>
對外服保持與用戶(玩家)的長連接。先來個假設(shè),假如我們的一臺硬件支持我們建立用戶連接的上限是 5000 人,當(dāng)用戶量達(dá)到 7000 人時,我們可以多加一個對外服務(wù)器來進(jìn)行分流減壓。由于游戲?qū)ν夥U(kuò)展的簡單性,意味著支持同時在線玩家可以輕松的達(dá)到百萬、千萬甚至更多。
即使我們啟動了多個游戲?qū)ν夥_發(fā)者也不需要關(guān)心這些玩家連接到了哪個游戲?qū)ν夥膯栴},這些玩家總是能接收到廣播(推送)消息的,因為框架已經(jīng)把這些事情給做了;在玩家的角度我們只有“一個”服務(wù)器,同樣的,在開發(fā)者的角度我們只有“一個”游戲?qū)ν夥?/span>
在結(jié)構(gòu)組合上(部署多樣性)
在部署上,支持多服單進(jìn)程的方式部署(類似單體應(yīng)用、在分步式開發(fā)時,調(diào)試更加方便)、也支持多服多進(jìn)程多機(jī)器的方式部署。
架構(gòu)由三部分組成:1.游戲?qū)ν夥?.Broker(游戲網(wǎng)關(guān))、3.游戲邏輯服;三者既可相互獨(dú)立,又可相互融合,如:
- 游戲?qū)ν夥roker(游戲網(wǎng)關(guān))、游戲邏輯服這三部分,在一個進(jìn)程中;【單體應(yīng)用;在開發(fā)分步式時,調(diào)試更加方便】
- 游戲?qū)ν夥roker(游戲網(wǎng)關(guān))、游戲邏輯服這三部分,在多個進(jìn)程中;【分布式】
- 游戲?qū)ν夥roker(游戲網(wǎng)關(guān))這兩部分在一個進(jìn)程中;而游戲邏輯服在多個進(jìn)程中;【類似之前游戲的傳統(tǒng)架構(gòu)】
- 甚至可以不需要游戲?qū)ν夥皇褂肂roker(游戲網(wǎng)關(guān))和游戲邏輯服這兩部分,用于其他系統(tǒng)業(yè)務(wù);
因為 ioGame 遵循面向?qū)ο蟮脑O(shè)計原則(單一職責(zé)原則、開閉原則、里式替換原則、依賴倒置原則、接口隔離原則、迪米特法則)等,所以使得架構(gòu)的職責(zé)分明,可以靈活的進(jìn)行組合;
游戲?qū)ν夥?/span>架構(gòu)的三部分之一,默認(rèn)的游戲?qū)ν夥腔?netty 實現(xiàn)的。如果有需要,將來我們還可以使用基于 mina、smart-socket 等通信框架編寫,額外提供一個游戲?qū)ν夥膶崿F(xiàn);即使是使用 mina、smart-socket 提供的游戲?qū)ν夥膊⒉粫绊懍F(xiàn)有的游戲邏輯服業(yè)務(wù)邏輯,因為游戲?qū)ν夥M足單一職責(zé)原則,只維護(hù)用戶(玩家)長連接相關(guān)的。
開發(fā)人員幾乎都遇見過這么一種情況;在項目初期階段,通常是以單體項目的方式進(jìn)行開發(fā),隨著需求不斷的增加與迭代,會演變成一個臃腫的項目;此時在對一個整體進(jìn)行拆分是困難的,成本是極高的。甚至是不可完成的,最后導(dǎo)致完全的重新重構(gòu);
ioGame 提供了在結(jié)構(gòu)組合上的部署多樣性,通過組合的方式,在項目初期就可以避免這些拆分問題。在開發(fā)階段中,我們可以使用單體應(yīng)用開發(fā)思維,降低了開發(fā)成本。通過單體應(yīng)用的開發(fā)方式,在開發(fā)分步式項目時,調(diào)試更加的方便;這既能兼顧分步式開發(fā)、項目模塊的拆分,又能降低團(tuán)隊的開發(fā)成本;
架構(gòu)優(yōu)點(diǎn)
架構(gòu)有很高程度的抽象,讓設(shè)計者更加關(guān)注于業(yè)務(wù),而無需考慮底層的實現(xiàn)、通信參數(shù)等問題。
邏輯服的位置透明性;同時,由于模塊化、抽象化,使得整個架構(gòu)各服務(wù)器之間耦合度很低,邏輯服注冊即可用,大大增加了可伸縮性、可維護(hù)性,動態(tài)擴(kuò)展變得簡單而高效。由于邏輯服是注冊到 Broker(游戲網(wǎng)關(guān)) 上的,所以邏輯服可以動態(tài)的增加、刪除、改變;由于邏輯服之間耦合度較小,調(diào)試和測試的工作也是可控的;
架構(gòu)比較清晰的就是,游戲?qū)ν夥?fù)責(zé)維護(hù)客戶端的接入(用戶、玩家的連接),游戲邏輯服專心負(fù)責(zé)業(yè)務(wù)邏輯,他們之間的調(diào)度由 Broker(游戲網(wǎng)關(guān))來負(fù)責(zé);因為架構(gòu)拆分的合理,所以特別方便用 k8s 來自由伸縮部署這三種服,哪個服水位高就擴(kuò)容哪個,水位過去了又可以縮容。
ioGame 支持的通信方式
ioGame 支持 3 種類型的通訊方式,分別是單次請求處理、推送、邏輯服間的相互通信;下面分別對這 3 種類型的通訊方式相關(guān)的應(yīng)用場景舉幾個例子。
框架對這 3 種類型的通訊方式提供了代碼調(diào)用點(diǎn)的日志,簡單點(diǎn)說就是框架可以讓開發(fā)者知道,是在哪一行代碼中觸發(fā)的業(yè)務(wù)邏輯。
我們可以想象一下,假如框架沒有提供代碼調(diào)用點(diǎn)的日志會是什么樣的;比如,游戲前端發(fā)送一個業(yè)務(wù)請求到游戲服務(wù)器中,但是處理這個請求的業(yè)務(wù)方法,會觸發(fā)多個響應(yīng)(通常是推送、廣播)給游戲前端。一但時間久了,開發(fā)者是很難知道分別響應(yīng)了哪些業(yè)務(wù)數(shù)據(jù)給游戲前端,特別是一些二手項目;所以這將是一個災(zāi)難性的問題,因為這會耗費(fèi)大量的時間來尋找這些相關(guān)的業(yè)務(wù)代碼。
業(yè)務(wù)交互簡圖
抽象的說,游戲前端與游戲服務(wù)器的的交互由上圖組成。游戲前端與游戲服務(wù)器可以自由地雙向交互,即發(fā)送和接收業(yè)務(wù)數(shù)據(jù)。業(yè)務(wù)數(shù)據(jù)由.proto文件作為載體,在前端和后端之間進(jìn)行編碼和解碼。.proto文件是對業(yè)務(wù)數(shù)據(jù)的描述載體,定義了數(shù)據(jù)類型和消息類型,以及它們的屬性和規(guī)則。
通過這種方式,游戲前端和游戲服務(wù)端可以建立連接,并開始相互傳遞業(yè)務(wù)數(shù)據(jù),處理各自的業(yè)務(wù)。以上是對游戲前端與游戲服務(wù)器之間交互方式的介紹。接下來,我們將編寫一個簡單的游戲業(yè)務(wù)處理示例,并定制一個適合我們需求的業(yè)務(wù)數(shù)據(jù)協(xié)議。
快速入門代碼示例
協(xié)議文件定義
首先我們自定義一個協(xié)議文件,這個協(xié)議文件作為我們的業(yè)務(wù)載體描述。這個協(xié)議是純java代碼編寫的,使用的是 jprotobuf,jprotobuf 是對 google protobuf 的簡化使用,性能同等。
可以把這理解成DTO、POJO、業(yè)務(wù)數(shù)據(jù)載體等,其主要目的是用于業(yè)務(wù)數(shù)據(jù)的傳輸;
/** 請求 */
@ProtobufClass
@FieldDefaults(level = AccessLevel.PUBLIC)
public class HelloReq {
String name;
}
Action
游戲服務(wù)器的編程,游戲服務(wù)器接收業(yè)務(wù)數(shù)據(jù)后,對業(yè)務(wù)數(shù)據(jù)進(jìn)行處理;
@ActionController(1)
public class DemoAction {
@ActionMethod(0)
public HelloReq here(HelloReq helloReq) {
HelloReq newHelloReq = new HelloReq();
newHelloReq.name = helloReq.name + ", I'm here ";
return newHelloReq;
}
}
一個方法在業(yè)務(wù)框架中表示一個 Action(即一個業(yè)務(wù)動作)。
方法聲名的參數(shù)是用于接收前端傳入的業(yè)務(wù)數(shù)據(jù),在方法 return 時,數(shù)據(jù)就可以被游戲前端接收到。程序員可以不需要關(guān)心業(yè)務(wù)框架的內(nèi)部細(xì)節(jié)。
從上面的示例可以看出,這和普通的 java 類并無區(qū)別,同時這種設(shè)計方式避免了類爆炸。如果只負(fù)責(zé)編寫游戲業(yè)務(wù),那么對于業(yè)務(wù)框架的學(xué)習(xí)可以到此為止了。
游戲編程就是如此簡單!
問:我可以開始游戲服務(wù)器的編程了嗎?
是的,你已經(jīng)可以開始游戲服務(wù)器的編程了。
訪問示例(控制臺
當(dāng)我們訪問 here 方法時(通常由游戲前端來請求),控制臺將會打印
┏━━━━━ Debug. [(DemoAction.java:4).here] ━━━ [cmd:1 - subCmd:0 - cmdMerge:65536]
┣ userId : 888
┣ 參數(shù): helloReq : HelloReq(name=塔姆)
┣ 響應(yīng): HelloReq(name=塔姆, I'm here )
┣ 時間: 0 ms (業(yè)務(wù)方法總耗時)
┗━━━━━ Debug [DemoAction.java] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
快速從零編寫服務(wù)器完整示例
如果覺得 ioGame 適合你,可以看一下 快速從零編寫服務(wù)器完整示例 。在這個示例中,你可以用很少的代碼實現(xiàn)一個完整的、可運(yùn)行的、高性能的、穩(wěn)定的服務(wù)器。
適合人群?
- 長期從事 web 內(nèi)部系統(tǒng)開發(fā)人員, 想了解游戲的
- 剛從事游戲開發(fā)的
- 未從事過游戲開發(fā),但卻對其感興趣的
- 對設(shè)計模式在實踐中的應(yīng)用和 sofa-bolt 有興趣的學(xué)習(xí)者
- 可以接受新鮮事物的
- 想放棄祖?zhèn)鞔a的
推薦實際編程經(jīng)驗一年以上的人
