忙中偷閑,經過幾天的努力,将lua腳本嵌入到系統中。之前公司的時候,偌大一個伺服器全部使用c++編寫,對于新手經常發生一些當機事件,被主程責罵。在後來接觸的一些人中,發現很多公,都已經引入lua來适應多變的環境和靈活開發!正如一個主程所說的,在n年前網易已經腳本為王了,現在很多公司拿着c++不放,作為開發人員不苦逼才怪! 想想在廣州開發遊戲的日子,每次在群裡面看到運維說某某伺服器上面有coredump檔案時,總是驚出冷汗,趕緊用gdb去查詢,是哪行代碼引起的當機;還要應對主程的責罵!其實不僅是程式,就是策劃也經常因為配置檔案的問題引起當機!引入lua,不僅是為了程式開發的友善,更是為了應對苛刻的營運商,新手的邏輯bug等。在這些方面lua所表現出來的優異,自是不必說。再加上其小巧靈活,嵌入友善,用來嵌入到遊戲伺服器之中,處理邏輯實在是太方面了!
在底層通訊方面還是傳統的c++ 和 epoll 或者iocp ,在成功接收到用戶端的消息之後,按照協定将其封裝成messageblock的結構(關于messageblock ,可以參考我之前的部落格 http://www.cnblogs.com/archy_yu/archive/2012/09/07/2674909.html ),傳遞給邏輯線程,邏輯線程,在消息隊列裡面取消息,然後處理,引入lua之後,就是要将這個messageblock類的對象傳遞給lua,讓lua來處理!那麼好,我們要将必要的接口暴漏給lua,為了友善在lua 和 c++之間協調,我們引入lua_tinker庫
為了将接口暴漏給lua,我們在類messageblock 中添加了一個新的成員函數!如下面的代碼:
之前資料的拼接和取值,我都是重載了操作符,為了配合lua的調用,這裡添加上述接口! 我們通過使用lua_tinker将這些接口暴漏給lua。關于如何引入lua_tinker和lua_tinker的介紹請參考百度,或者聯系作者!
如此,我們就可以像這樣來處理消息,如下面的代碼(msgprc.lua):
這樣就實作了用lua來處理所有的邏輯!
我們調整一下代碼邏輯,就可以實作諸如熱更新的功能,來應對日益激烈的頁遊山寨競争!之前就有聽說過,說為什麼搞it的人看起來都很閑,說運維總是在重新開機,web前端開發者總是在上傳,c++開發者總是在編譯。因為語言特性,c++開發者總要面臨編譯的問題,對于伺服器代碼,如果全是c++來編寫,必然也是要面對這個問題,據說之前公司一個團隊的後端代碼要編譯三個小時才能編譯出可執行檔案來。用lua來寫主邏輯,其他的底層代碼用庫封裝,豈不是又解決了一個問題!
歡迎讨論!!!