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电商大促的严峻考验,保证了高效高质的交付和对变化的灵活应对。能够支持复杂场景的自动化运维需求、实现工具链产品与平台化产品结合,帮助客户根据不同的需求灵活定制方案。

点击“阅读”了解更多京东云翼产品

欢迎点击“京东云”了解更多精彩内容

DevOps专题|Lua引擎打造超轻量级客户端的更多相关文章

  1. 基于Groovy+HttpRestful的超轻量级的接口测试用例配置的设计方案及DEMO实现

    目标 设计一个轻量级测试用例框架,接口测试编写者只需要编写测试用例相关的内容(入参及结果校验),不需要理会系统的实现,不需要写跟测试校验无关的内容. 思路 测试用例分析 一个用例由以下部分组成: (1 ...

  2. 基于领域驱动设计(DDD)超轻量级快速开发架构

    smartadmin.core.urf 这个项目是基于asp.net core 3.1(最新)基础上参照领域驱动设计(DDD)的理念,并参考目前最为了流行的abp架构开发的一套轻量级的快速开发web ...

  3. 分享自己的超轻量级高性能ORM数据访问框架Deft

    Deft 简介 Deft是一个超轻量级高性能O/R mapping数据访问框架,简单易用,几分钟即可上手. Deft包含如下但不限于此的特点: 1.按照Transact-SQL的语法语义风格来设计,只 ...

  4. 超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上

    超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上 阅读目录 Deft简介 Deft 核心类介绍 Deft 3分钟即可上手使用 其他可选的配置参数 性能测试 Demo代码下载 回到顶 ...

  5. 跨平台移动开发 Xuijs超轻量级的框架 Dom与Event简洁代码实现文本展开收起

    Dom与Event简洁代码实现文本展开收起 Xuijs超轻量级的框架 Dom与Event实现文本展开收起 效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C/ ...

  6. 跨平台移动开发 Xuijs超轻量级的框架+Emile CSS动画

    Xuijs超轻量级的框架+Emile CSS动画效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  7. 跨平台移动开发 Xuijs超轻量级的框架Style CSS属性用法

    PhoneGap里面推荐使用的超轻量级的框架 Style CSS属性用法 设置css属性:setstyle 通过ID设置css属性 x$('#top1').setStyle('color', '#DB ...

  8. 超轻量级网络SqueezeNet网络解读

    SqueezeNet网络模型非常小,但分类精度接近AlexNet. 这里复习一下卷积层参数的计算 输入通道ci,核尺寸k,输出通道co,参数个数为: 以AlexNet第一个卷积为例,参数量达到:3*1 ...

  9. 基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式

    -之动态查询,查询逻辑封装复用 基于领域驱动设计(DDD)超轻量级快速开发架构详细介绍请看 https://www.cnblogs.com/neozhu/p/13174234.html 需求 配合Ea ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 图片:缩略图功能

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. imple-unpack---攻防世界

    拿到题目查壳没有发现.题目已经明确说了,基本上是有壳的,Linux下面看看 应该就是upx的壳了,下载upx进行脱壳,https://sourceforge.net/projects/upx/file ...

  3. 图形与动画在Android中的实现

    public class MyView extends View{ Bitmap myBitmap; Paint paint; public MyView(Context context, Attri ...

  4. Spring Boot -- 认识Spring Boot

    在前面我们已经学习过Srping MVC框架,我们需要配置web.xml.spring mvc配置文件,tomcat,是不是感觉配置较为繁琐.那我们今天不妨来试试使用Spring Boot,Sprin ...

  5. java中的几种单例模式

    目前比较常见的有4种(DCL为懒汉模式的线程安全版本). 单例模式的实现一般需要满足以下条件: 1.构造方法私有化,实例属性私有化. 2.必须仅在类的内部完成实例的初始化过程. 3.提供公共静态方法, ...

  6. 习题两则的简化(利用for循环)

    习题一.打印26个英文字母 public class PrintChars { public static void main(String[] args) { char ch = 'a'; int ...

  7. H5端js实现图片放大查看-插件photoswipe的使用

    这个是一个不知道什么鬼的东西,按照他需求改的,我也不知道对不对...看介绍说是h5把,我这个是用那个插件photoswipe的实现的 demo包地址: https://files-cdn.cnblog ...

  8. 京东云与AI 10 篇论文被AAAI 2020 收录,京东科技实力亮相世界舞台

    美国时间2月7-12日,AAAI 2020大会在纽约正式拉开序幕,AAAI作为全球人工智能领域的顶级学术会议,每年评审并收录来自全球最顶尖的学术论文,这些学术研究引领着技术的趋势和未来.京东云与AI在 ...

  9. HihoCoder第十周:后序遍历

    也就在大二学数据结构的时候知道了树的前序遍历.后序遍历.中序遍历.之后就忘了,在之后就是大四研究生老师考我,我当时还不知道,真够丢人的.自此之后,知道了如何通过其中两个得到第三个,但是也没有编程实现过 ...

  10. cf 500 D. New Year Santa Network

    直接按边分,2个点在边的一边,1个在另一边,组合出来就是这个边对答案的贡献,权值换了就再重新算个数而已. #include <bits/stdc++.h> #define LL long ...