Go或者C中调用Lua业务脚本,实现终端应用的热更新方案

简介: Go或者C中调用Lua业务脚本,实现终端应用的热更新方案

随着5G网络的普及,大胆预测下未来终端架构发展的两个方向,终端设备功能将会更加的强大和智能。


一是随着5G的普及,联机类的业务,终端设备上的业务会轻量化,即瘦客户端的思想。业务在后台实现,终端仅成为操作实体的媒介,这样维护量将大大降低,业务都在后台,更利于升级迭代和维护。


二是脱机类,空闲联机的业务,终端可实现轻量化,热更新应用。把业务模块化,组件化,脚本化。每次升级不用整个都升级,可能仅需要写好业务脚本把轻量的几K的脚本下发下去实现应用的热更新,用户无感知。


借用docker的图标来说下,它的图标很形象,一个大船拖动了很多的集装箱。以此类比现实世界,那么嵌入式应用的其他功能相当于大船,提供基础服务,业务则相当于集装箱。所有地方的终端,对维护好一个大船就行了,这样利于迭代做好做稳定,而业务脚本化更利于复用和实现热更新,轻量化升级,用户无感知,快速迭代业务。这将大幅度的提高用户体验和降低运维成本并提高开发效率,这些在未来会成为可能。



跟硬件驱动相关联的,做一层封装,进行一个分层。这样即便底层再怎么变,上层的应用也不会受影响。


且充分考虑模块化,组件化。技术组件可复用,业务模块可复用。底层提供了稳定强大的基础设施,应用就会像搭积木一样敏捷迅速,精力放在业务和更有创新的事情上。


当然一切技术的使用都不是银弹,都是用来解决痛点和某一实际问题。不是为了哗众取宠,舍近求远,为了技术而技术。


在做选择时,要权衡一下利弊。是利大于弊,还是弊大于利。比如,假如终端功能很简单,业务很简单,也不常变动,不常迭代,也不涉及需要复用的地方,就没必要这么做,怎样简单怎样来。


而这样做,也并不是很难,涉及的学习成本想对高点,Golang,Lua,C都有涉及。前期的基础和轮子打造需要下点功夫,而后续的业务实现可能很简单,就是在大的容器环境下写业务脚本,类似搭积木的方式灵活的实现业务和快速更新迭代。


以下是Go应用中调用Lua业务脚本的一个尝试:(注,同时在电脑上和ARM板子上已验证都是可行的)


以下是我的一个验证:


package main
import (
  "fmt"
  "github.com/sryanyuan/luago"
  "strconv"
  "sync"
)
func export(L luago.Lua_Handle) int {
  //  get args from lua
  num := int(luago.Lua_tonumber(L, -2))
  str := luago.Lua_tostring(L, -1)
  fmt.Printf("this is a luago func\n")
  //  push value to lua
  val := str + strconv.Itoa(num)
  luago.Lua_pushstring(L, val)
  return 1
}
func main() {
  var wg sync.WaitGroup
  wg.Add(1) //
  L := luago.LuaGo_newState()
  fmt.Printf("lua ver:%#v\n", luago.Lua_version(L.GetHandle()))
  L.OpenStdLibs()
  L.LuaGo_PushGoFunction("export", export)
  luago.LuaGo_stackDump(L.GetHandle())
  ret := luago.LuaL_dofile(L.GetHandle(), "test1.lua")
  fmt.Printf("ret:%d\n", ret)
  //  invoke
  ret = luago.LuaL_dostring(L.GetHandle(), ` 
    local val = export(1, "hello luago")
    print(val)
    shanghu = string.format("%012u",123456789011) 
    print(shanghu)
  `)
  fmt.Printf("ret:%d\n", ret)
  luago.LuaGo_stackDump(L.GetHandle())
  ret = luago.LuaL_dofile(L.GetHandle(), "test.lua")
  luago.LuaGo_stackDump(L.GetHandle())
  //wg.Wait() // 等待
}


附测试的test1.lua脚本:


--this is a demo:
----------------------------------------------------
print("this is a lua script,begin:")
--通信服务地址
ip= "127.0.0.1"
--通信服务端口
port = 5050
function CONNECT( ip,port )
  -- body
  print("this is CONNECT,"..ip..port)
end
function TxData( tx )
  -- body
  print("this is TxData,"..tx)
end
function DISCONNECT( ... )
  -- body
  print("this is DISCONNECT")
end
--连接到通信前置服务
ret = CONNECT(ip,port)           --建立连接
-------------------------------------------  
--通讯报文规范是基于TCP/IP 通讯协议而设计,支持二进制字节流。采用统一的消息类型标识识别方式进行处理
--通信协议格式: MTI+STI+DBL+DATA
--签到报文 ,
MTI = 'B001'    --消息类型标识
STI = '52'      --请求类型标识
DBL = '0000001C'      --报文体长度
DATA = ''       --数据域
shanghu = string.format("%012d",3456789012) 
poscode = string.format("%016d",34567890112233)
samcode = '313233343536'
optcode = '3132333435363738'
DATA = shanghu..poscode..samcode..optcode
DBL = string.format("%08x",string.len(DATA)/2)
TX = MTI .. STI .. DBL .. DATA
ret,rcv = TxData(TX)      --调用接口TxData(str),实际会以二进制的字节流发送报文
--print(rcv)
--黑名单下载
MTI = 'B004'
blackver = '00000000'
DATA = blackver .. poscode
DBL = string.format("%02x",string.len(DATA)/2)
TX = MTI .. STI .. DBL .. DATA
ret,rcv = TxData(TX)           
print(rcv)
----lua test go function 
print("this is go function test by lua")
--LtestGofunc0(7,8,9)
--LtestGofunc1()
DISCONNECT()                          --断开连接
print("lua script over")


相关文章
|
人工智能 监控 安全
Go通道机制与应用详解
本文全面解析了Go语言中的通道(Channel),从基础概念到高级应用,涵盖创建、操作、垃圾回收及实际场景使用。通道作为Go并发模型的核心,支持协程间安全高效的数据通信与同步。文章介绍了无缓冲和有缓冲通道的特性,以及发送、接收、关闭等操作,并探讨了`select`语句、超时处理、遍历通道等高级用法。此外,还深入分析了通道的垃圾回收机制,包括引用计数、生命周期管理和循环引用问题。最后通过数据流处理、任务调度和状态监控等实例,展示了通道在实际开发中的广泛应用。理解通道不仅有助于构建高并发系统,还能优化资源管理,提升程序性能。
496 31
|
11月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
550 86
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
348 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
监控 Java Go
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
本文将介绍一种基于 Docker 多阶段构建的无侵入 Golang 应用观测方法,通过此方法用户无需对 Golang 应用源代码或者编译指令做任何改造,即可零成本为 Golang 应用注入可观测能力。
640 85
|
监控 编译器 Go
1 行命令引发的Go应用崩溃
这篇文章分析了Go编译时插桩工具导致go build -race竞态检测产生崩溃的原因。
993 179
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
713 1
|
人工智能 Go
GO语言之泛型应用
本文介绍了Go语言中泛型的使用,包括为何引入泛型、泛型语法详解以及如何自定义约束。通过实例展示了泛型在简化代码、提高复用性方面的优势,并演示了泛型在slice、指针、map等数据类型中的应用。
291 1
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
254 0
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
930 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性

热门文章

最新文章