DevOps專題|Lua引擎打造超輕量級客戶端

京東科技開發者發表於2019-12-12

DevOps專題|Lua引擎打造超輕量級客戶端

Lua 作為一門輕量級指令碼語言,原始碼使用標準C語言釋出,語法簡潔,非常適合嵌入式、客戶端、遊戲等場景。

Lua引擎語言特點

  • 輕量級
  • 原始碼簡單,以lua最新版5.3.5為例,加上lua自身提供的lib庫,僅30多個.c檔案,編譯後僅200多k,strip後經upx壓縮,可控制在100k以下。

  • 語法簡潔
  • 小巧靈活,支援閉包,有GC機制,透過語法糖可實現物件導向程式設計,提供了通用型別table,可實現陣列、map和物件。

  • 支援多平臺
  • lua語言本身和lib庫由標準C語言編寫,可在windows、*nix等各種環境編譯執行。

  • 易擴充套件
  • lua提供了易用的擴充套件介面機制,和C相互呼叫非常方便。

Lua引擎應用場景

  • 嵌入式
  • 執行環境苛刻,對CPU、記憶體等資源佔用情況有嚴格限制

  • 遊戲及客戶端
  • 對效能敏感,功能更新不希望全量升級,需要增量更新或熱更新

Lua引擎客戶端實踐

1、客戶端常用語言和技術選型

  • Python/Shell等指令碼語言
  • 開發效率高,但需要環境自帶指令碼執行環境,有語言版本相容性問題,適合比較統一的環境

  • GoLang
  • 自包含、跨平臺,支援交叉編譯,編譯出的可執行檔案僅依賴libc,部署方便

  • C/C++
  • 編譯生成的可執行檔案小、移植性強、效能高,但開發、除錯比較費勁

  • 結合Lua,用C封裝io、網路操作,Lua實現業務邏輯,就能在保證輕量和效能的前提下,提高開發效率

2、Lua客戶端研發目標

  • 自包含
  • 輕量級
  • 易實現自更新
  • 高效能
  • 開發效率高
  • 跨平臺
  • 原始碼保護

Lua客戶端工作模式分析

lua啟動時建立lua虛擬機器,載入lua lib和使用者實現的C庫,讀取lua指令碼檔案,開始解析和執行。

DevOps專題|Lua引擎打造超輕量級客戶端

由於lua屬於編譯型語言,在讀取使用者指令碼的時候,如果是luac編譯過的位元組碼,則交給lua虛擬機器直接執行;如果是lua指令碼,則由luac編譯成位元組碼,再交給lua虛擬機器執行。當lua指令碼中require其他指令碼時,lua引擎嘗試解析、執行被引用的指令碼。

1、Lua客戶端研發分析

理解lua工作模式後,我們的客戶端設計分為兩部分。第一部分是C模組:

DevOps專題|Lua引擎打造超輕量級客戶端

C部分作為程式入口,負責載入lua引擎,載入lua自身lib庫和我們實現的C庫,最終讀取、解析執行lua指令碼。

DevOps專題|Lua引擎打造超輕量級客戶端

Lua部分實現業務程式碼,lua入口檔案透過require呼叫執行各lua模組。

2、Lua客戶端之編譯原理

為了保證客戶端儘量小,且沒有第三方依賴,我們最終會把C模組和lua指令碼編譯打包到一起,整個客戶端是獨立的可執行檔案。

DevOps專題|Lua引擎打造超輕量級客戶端


C模組部分,把我們的入口程式、lua引擎、第三方庫靜態編譯到一起,strip後用upx進行壓縮。

DevOps專題|Lua引擎打造超輕量級客戶端


Lua部分,我們用lua-amalg把多個lua檔案合併成一個lua檔案,經luac編譯,再用ucl工具壓縮。 注:ucl是upx所使用的壓縮演算法,壓縮率與gzip相近,但解壓演算法僅200位元組,也可替換成其他演算法

DevOps專題|Lua引擎打造超輕量級客戶端

最終,我們把壓縮後的lua指令碼拼接到可執行檔案末尾,實現可參考開源的srlua。
至此,我們實現了由lua實現業務邏輯,C提供lib庫的客戶端,和golang一樣,客戶端可在macos、linux、windows編譯執行,本身只有一個可執行檔案,但卻非常輕量級。以京東雲的部署客戶端為例,客戶端包含json、socket、http、mbedtls(類似openssl)等庫,加上實現部署業務的lua指令碼,整個客戶端僅100多k!

Lua引擎之擴充套件操作

1、加密及程式碼混淆

在一些閉源的場景,我們並不希望lua原始碼被直接看到。lua作為一門指令碼語言,即使透過luac編譯成位元組碼,原始碼也能被工具反編譯出來。為了對抗反編譯,我們可以調整lua opcode表、修改版本和lua頭等。

DevOps專題|Lua引擎打造超輕量級客戶端

Lua opcode表

2、自動更新

lua指令碼在編譯成位元組碼,壓縮後比較小,利用這一特性,我們可以在server端提供編譯壓縮好的lua指令碼,客戶端只需下載執行指令碼,就實現了自動更新和熱更新

3、一些花操作

  • javascript寫輕量級客戶端
  • 在網際網路公司,lua普及程度是次於js的。通常服務端js指nodejs,node比較重,寫客戶端顯得不太合適。得力於lua和js相近的語言特性,如閉包、匿名函式等,js指令碼可透過js2lua轉換成lua,於是,我們可以用js、甚至typescript實現業務邏輯,編譯轉換成lua指令碼,實現輕量級客戶端

  • 移植到windows
  • C和lua本身都是跨平臺的,但實際開發過程中,可能初期只考慮了對linux的支援,為了快速開發,程式碼中出現大量shell呼叫。當開始需要支援windows,一種辦法是重寫shell呼叫部分的程式碼,工作量相當於重構。

  • 另一種可行的方法是引入msys或者cygwin,由msys/cygwin提供windows下的shell環境,業務程式本身只做少量修改即可執行,比較知名的例子是git-shell。
據全球權威資料調研機構IDC正式釋出的《IDCMarketScape: 中國DevOps雲市場2019,廠商評估》報告。京東雲憑藉豐富的場景和實踐能力,以及高質量的服務交付和平臺穩定性,取得優異的成績, 躋身“Major Players”(核心廠商)位置。 京東雲DevOps能力起源於自身的業務實踐,針對京東集團的複雜業務場景打造並經受住多次618、11.11電商大促的嚴峻考驗,保證了高效高質的交付和對變化的靈活應對。能夠支援複雜場景的自動化運維需求、實現工具鏈產品與平臺化產品結合,幫助客戶根據不同的需求靈活定製方案。
點選“ 閱讀 ”瞭解更多京東雲翼產品
歡迎點選“ 京東雲 ”瞭解更多精彩內容

DevOps專題|Lua引擎打造超輕量級客戶端

DevOps專題|Lua引擎打造超輕量級客戶端


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2668256/,如需轉載,請註明出處,否則將追究法律責任。

相關文章