Lua 做爲一門輕量級腳本語言,源碼使用標準C語言發佈,語法簡潔,很是適合嵌入式、客戶端、遊戲等場景。javascript
lua啓動時建立lua虛擬機,加載lua lib和用戶實現的C庫,讀取lua腳本文件,開始解析和執行。java
因爲lua屬於編譯型語言,在讀取用戶腳本的時候,若是是luac編譯過的字節碼,則交給lua虛擬機直接執行;若是是lua腳本,則由luac編譯成字節碼,再交給lua虛擬機執行。當lua腳本中require其餘腳本時,lua引擎嘗試解析、執行被引用的腳本。node
理解lua工做模式後,咱們的客戶端設計分爲兩部分。第一部分是C模塊:linux
C部分做爲程序入口,負責加載lua引擎,加載lua自身lib庫和咱們實現的C庫,最終讀取、解析執行lua腳本。git
Lua部分實現業務代碼,lua入口文件經過require調用執行各lua模塊。golang
爲了保證客戶端儘可能小,且沒有第三方依賴,咱們最終會把C模塊和lua腳本編譯打包到一塊兒,整個客戶端是獨立的可執行文件。算法
C模塊部分,把咱們的入口程序、lua引擎、第三方庫靜態編譯到一塊兒,strip後用upx進行壓縮。typescript
Lua部分,咱們用lua-amalg把多個lua文件合併成一個lua文件,經luac編譯,再用ucl工具壓縮。注:ucl是upx所使用的壓縮算法,壓縮率與gzip相近,但解壓算法僅200字節,也可替換成其餘算法shell
最終,咱們把壓縮後的lua腳本拼接到可執行文件末尾,實現可參考開源的srlua。macos
至此,咱們實現了由lua實現業務邏輯,C提供lib庫的客戶端,和golang同樣,客戶端可在macos、linux、windows編譯執行,自己只有一個可執行文件,但卻很是輕量級。以京東雲的部署客戶端爲例,客戶端包含json、socket、http、mbedtls(相似openssl)等庫,加上實現部署業務的lua腳本,整個客戶端僅100多k!
在一些閉源的場景,咱們並不但願lua源碼被直接看到。lua做爲一門腳本語言,即便經過luac編譯成字節碼,源碼也能被工具反編譯出來。爲了對抗反編譯,咱們能夠調整lua opcode表、修改版本和lua頭等。
Lua opcode表
lua腳本在編譯成字節碼,壓縮後比較小,利用這一特性,咱們能夠在server端提供編譯壓縮好的lua腳本,客戶端只需下載執行腳本,就實現了自動更新和熱更新
據全球權威數據調研機構IDC正式發佈的《IDCMarketScape: 中國DevOps雲市場2019,廠商評估》報告。京東雲憑藉豐富的場景和實踐能力,以及高質量的服務交付和平臺穩定性,取得優異的成績, 躋身「Major Players」(核心廠商)位置。
京東雲DevOps能力起源於自身的業務實踐,針對京東集團的複雜業務場景打造並經受住屢次61八、11.11電商大促的嚴峻考驗,保證了高效高質的交付和對變化的靈活應對。可以支持複雜場景的自動化運維需求、實現工具鏈產品與平臺化產品結合,幫助客戶根據不一樣的需求靈活定製方案。
點擊「閱讀」瞭解更多京東雲翼產品
歡迎點擊「京東雲」瞭解更多精彩內容