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指令碼檔案,開始解析和執行。
由於lua屬於編譯型語言,在讀取使用者指令碼的時候,如果是luac編譯過的位元組碼,則交給lua虛擬機器直接執行;如果是lua指令碼,則由luac編譯成位元組碼,再交給lua虛擬機器執行。當lua指令碼中require其他指令碼時,lua引擎嘗試解析、執行被引用的指令碼。
1、Lua客戶端研發分析
理解lua工作模式後,我們的客戶端設計分為兩部分。第一部分是C模組:
C部分作為程式入口,負責載入lua引擎,載入lua自身lib庫和我們實現的C庫,最終讀取、解析執行lua指令碼。
Lua部分實現業務程式碼,lua入口檔案透過require呼叫執行各lua模組。
2、Lua客戶端之編譯原理
為了保證客戶端儘量小,且沒有第三方依賴,我們最終會把C模組和lua指令碼編譯打包到一起,整個客戶端是獨立的可執行檔案。
C模組部分,把我們的入口程式、lua引擎、第三方庫靜態編譯到一起,strip後用upx進行壓縮。
Lua部分,我們用lua-amalg把多個lua檔案合併成一個lua檔案,經luac編譯,再用ucl工具壓縮。 注:ucl是upx所使用的壓縮演算法,壓縮率與gzip相近,但解壓演算法僅200位元組,也可替換成其他演算法
最終,我們把壓縮後的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頭等。
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電商大促的嚴峻考驗,保證了高效高質的交付和對變化的靈活應對。能夠支援複雜場景的自動化運維需求、實現工具鏈產品與平臺化產品結合,幫助客戶根據不同的需求靈活定製方案。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2668256/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- easyhttp——輕量級、語義化、 對 IDE 友好的 HTTP 客戶端HTTPIDE客戶端
- Redis客戶端連線數DevOpsRedis客戶端dev
- 一個現代化輕量級的跨平臺Redis桌面客戶端Redis客戶端
- 手把手教你打造一款輕量級canvas渲染引擎Canvas
- Electron版掘金輕客戶端客戶端
- 如何建立NEO輕客戶端客戶端
- 輕量級超級 css 工具CSS
- 推薦一個適用於SpringBoot專案的輕量級HTTP客戶端框架,快來試試它!Spring BootHTTP客戶端框架
- 阿里開源!輕量級深度學習端側推理引擎 MNN阿里深度學習
- VS2017 處理 Rdlc , microsoft report viewer 輕量級報表處理(WPF CS客戶端版本)ROSView客戶端
- looter——超輕量級爬蟲框架爬蟲框架
- 專案輕量級部署神器:Fabric
- ios 客戶端IPV6網路超時等相關問題iOS客戶端
- 搜尋引擎ElasticSearch18_ElasticSearch的客戶端操作2Elasticsearch客戶端
- core_framework —— 基於libev的輕量級lua網路開發框架Framework框架
- Android客戶端專案元件化實踐Android客戶端元件化
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端
- zinc:替代elasticsearch的輕量級Go語言搜尋引擎ElasticsearchGo
- 輕量級工作流引擎的設計與實現
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- Nacos - 客戶端心跳續約及客戶端總結客戶端
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端
- [Redis 客戶端整合] Java 中常用Redis客戶端比較Redis客戶端Java
- 適合移動端的輕量級網路
- [Hacker News 週報] 超輕量級 Python 引擎;快速閱讀英文外掛;TypeScript 釋出新版本PythonTypeScript
- 超輕量級MP4封裝方法介紹封裝
- 高德客戶端及引擎技術架構演進與思考客戶端架構
- java websocket 客戶端JavaWeb客戶端
- redis客戶端管理Redis客戶端
- iscsi linux客戶端Linux客戶端
- Zookeeper 客戶端 API客戶端API
- 客戶端加解密客戶端解密
- Tower:GIt客戶端Git客戶端
- YouTube macYouTube客戶端Mac客戶端
- Redis-客戶端Redis客戶端