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

Alt

Lua 做爲一門輕量級腳本語言,源碼使用標準C語言發佈,語法簡潔,很是適合嵌入式、客戶端、遊戲等場景。javascript

Lua引擎語言特色

  • 輕量級

源碼簡單,以lua最新版5.3.5爲例,加上lua自身提供的lib庫,僅30多個.c文件,編譯後僅200多k,strip後經upx壓縮,可控制在100k如下。java

  • 語法簡潔

小巧靈活,支持閉包,有GC機制,經過語法糖可實現面向對象編程,提供了通用類型table,可實現數組、map和對象。node

  • 支持多平臺

lua語言自己和lib庫由標準C語言編寫,可在windows、*nix等各類環境編譯運行。linux

  • 易擴展

lua提供了易用的擴展接口機制,和C相互調用很是方便。git

Lua引擎應用場景

  • 嵌入式

運行環境苛刻,對CPU、內存等資源佔用狀況有嚴格限制golang

  • 遊戲及客戶端

對性能敏感,功能更新不但願全量升級,須要增量更新或熱更新算法

Lua引擎客戶端實踐

一、客戶端經常使用語言和技術選型

  • Python/Shell等腳本語言

開發效率高,但須要環境自帶腳本執行環境,有語言版本兼容性問題,適合比較統一的環境typescript

  • GoLang

自包含、跨平臺,支持交叉編譯,編譯出的可執行文件僅依賴libc,部署方便shell

  • C/C++

編譯生成的可執行文件小、移植性強、性能高,但開發、調試比較費勁
結合Lua,用C封裝io、網絡操做,Lua實現業務邏輯,就能在保證輕量和性能的前提下,提升開發效率macos

二、Lua客戶端研發目標

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

Lua客戶端工做模式分析

lua啓動時建立lua虛擬機,加載lua lib和用戶實現的C庫,讀取lua腳本文件,開始解析和執行。

Alt

因爲lua屬於編譯型語言,在讀取用戶腳本的時候,若是是luac編譯過的字節碼,則交給lua虛擬機直接執行;若是是lua腳本,則由luac編譯成字節碼,再交給lua虛擬機執行。當lua腳本中require其餘腳本時,lua引擎嘗試解析、執行被引用的腳本。

一、Lua客戶端研發分析

理解lua工做模式後,咱們的客戶端設計分爲兩部分。第一部分是C模塊:

Alt

C部分做爲程序入口,負責加載lua引擎,加載lua自身lib庫和咱們實現的C庫,最終讀取、解析執行lua腳本。

Alt

Lua部分實現業務代碼,lua入口文件經過require調用執行各lua模塊。

二、Lua客戶端之編譯原理

爲了保證客戶端儘可能小,且沒有第三方依賴,咱們最終會把C模塊和lua腳本編譯打包到一塊兒,整個客戶端是獨立的可執行文件。

Alt

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

Alt

Lua部分,咱們用lua-amalg把多個lua文件合併成一個lua文件,經luac編譯,再用ucl工具壓縮。
注:ucl是upx所使用的壓縮算法,壓縮率與gzip相近,但解壓算法僅200字節,也可替換成其餘算法

Alt

最終,咱們把壓縮後的lua腳本拼接到可執行文件末尾,實現可參考開源的srlua。

至此,咱們實現了由lua實現業務邏輯,C提供lib庫的客戶端,和golang同樣,客戶端可在macos、linux、windows編譯執行,自己只有一個可執行文件,但卻很是輕量級。以京東雲的部署客戶端爲例,客戶端包含json、socket、http、mbedtls(相似openssl)等庫,加上實現部署業務的lua腳本,整個客戶端僅100多k!

Lua引擎之擴展操做

一、加密及代碼混淆

在一些閉源的場景,咱們並不但願lua源碼被直接看到。lua做爲一門腳本語言,即便經過luac編譯成字節碼,源碼也能被工具反編譯出來。爲了對抗反編譯,咱們能夠調整lua opcode表、修改版本和lua頭等。

Alt
Lua opcode表

二、自動更新

lua腳本在編譯成字節碼,壓縮後比較小,利用這一特性,咱們能夠在server端提供編譯壓縮好的lua腳本,客戶端只需下載執行腳本,就實現了自動更新和熱更新

三、一些花操做

  • 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能力起源於自身的業務實踐,針對京東集團的複雜業務場景打造並經受住屢次61八、11.11電商大促的嚴峻考驗,保證了高效高質的交付和對變化的靈活應對。可以支持複雜場景的自動化運維需求、實現工具鏈產品與平臺化產品結合,幫助客戶根據不一樣的需求靈活定製方案。

點擊「閱讀」瞭解更多京東雲翼產品

歡迎點擊「京東雲」瞭解更多精彩內容

Alt

Alt

相關文章
相關標籤/搜索