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电商大促的严峻考验,保证了高效高质的交付和对变化的灵活应对。可以支持复杂场景的自动化运维需求、实现工具链产品与平台化产品结合,帮助客户根据不一样的需求灵活定制方案。
点击“阅读”了解更多京东云翼产品
欢迎点击“京东云”了解更多精彩内容