appstack

package
v0.6.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 15, 2024 License: AGPL-3.0 Imports: 10 Imported by: 0

README

APP STACK: 轻量级应用管理器

1677937660104 本特性用来运行本地化的轻量级业务功能,其原理是用 lua 虚拟机做运行时,lua 模块代码作为应用。该特性短时间内不会开启,预计会在0.7版本中发布。

架构设计

下图是 RULEX 和 APP STACK 组件之间的关联关系,APP STACK RUNTIME 本身也是用 go 开发的一套lua虚拟机,虽然性能来说比不过 C 语言原生的,但是目前来说性能完全足够了。

1677936533365

场景

该功能主要用来实现本地化的多样需求,比如内网部署的时候,需要读取一些设备的信息,判断后处理,这个过程其实是个业务逻辑,和 RULEX 的和兴功能有区别,RULEX 核心本质上是个规则过滤器,而不是业务执行器。

用户接口

用户通过lua来实现自己的业务,每个业务一个lua文本,其中lua文本模板如下。

-- 应用名称
AppNAME = "test_demo"
-- 版本信息,必须符合 x.y.z 格式
AppVERSION = "1.0.0"
-- 关于这个应用的一些描述信息
AppDESCRIPTION = "A demo app"
-- 必须包含 APPMain(arg) 函数作为 app 启动点
function Main(arg)
	while true do
		local value, err = rhinopi:GPIOGet(6)
		if err ~= nil
		then
			print(err)
		else
			print("value ok:", value)
		end
	end
end

内部原理

首先用户在编辑器里面写一段 lua 代码,然后 rulex 会加载这段 lua 代码执行。代码最终被保存在本地。

示例

下面展示一个数据推送到 HTTP Server 的案例

AppNAME = "test_demo"
AppVERSION = "1.0.0"
AppDESCRIPTION = "A demo app"

function Main(arg)
	for i = 1, 10, 1 do
		local err = applib:DataToHttp('OUTaaabbd23d1094c81af2874ce4ad1af55', applib:T2J({
			temp = i,
			humi = 13.45
		}))
		print("err =>", err)
		time:Sleep(1000)
	end
	return 0
end

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AddAppLibToGroup added in v0.6.7

func AddAppLibToGroup(app *Application, rx typex.RuleX,
	ModuleName string, funcs map[string]func(l *lua.LState) int)

*

  • 分组加入函数

func AppCount

func AppCount() int

* * 获取列表 *

func GetRuleX

func GetRuleX() typex.RuleX

func LoadApp

func LoadApp(app *Application, luaSource string) error

* * 加载本地文件到lua虚拟机, 但是并不执行 *

func LoadAppLibGroup added in v0.6.7

func LoadAppLibGroup(app *Application, e typex.RuleX)

func RemoveApp

func RemoveApp(uuid string) error

* * 从内存里面删除APP *

func StartApp

func StartApp(uuid string) error

* 此时才是真正的启动入口: * 启动 function Main(args) --do-some-thing-- return 0 end *

func Stop

func Stop()

func StopApp

func StopApp(uuid string) error

* * 停止应用并不删除应用, 将其进程结束,状态置0 *

func UpdateApp

func UpdateApp(app Application) error

* * 更新应用信息 *

func ValidateLuaSyntax

func ValidateLuaSyntax(bytes []byte) error

临时校验语法

Types

type AppStackRuntime

type AppStackRuntime struct {
	RuleEngine   typex.RuleX
	Applications map[string]*Application
}

* * 管理器 *

func AppRuntime

func AppRuntime() *AppStackRuntime

func InitAppStack

func InitAppStack(re typex.RuleX) *AppStackRuntime

type AppState

type AppState int

type Application

type Application struct {
	UUID        string   `json:"uuid"`        // 名称
	Name        string   `json:"name"`        // 名称
	Version     string   `json:"version"`     // 版本号
	Description string   `json:"description"` // 版本号
	AutoStart   bool     `json:"autoStart"`   // 自动启动
	AppState    AppState `json:"appState"`    // 状态: 1 运行中, 0 停止
	KilledBy    string   `json:"-"`           // 被谁杀死的: RULEX|EXCEPT|NORMAL|""
	// contains filtered or unexported fields
}

* * 轻量级应用 *

func AllApp

func AllApp() []*Application

func GetApp

func GetApp(uuid string) *Application

func ListApp

func ListApp() []*Application

func NewApplication

func NewApplication(uuid, Name, Version string) *Application

func (*Application) GetMainFunc

func (app *Application) GetMainFunc() *lua.LFunction

func (*Application) Remove

func (app *Application) Remove()

* * 清理内存 *

func (*Application) SetCnC

func (app *Application) SetCnC(ctx context.Context, cancel context.CancelFunc)

func (*Application) SetMainFunc

func (app *Application) SetMainFunc(f *lua.LFunction)

func (*Application) Stop

func (app *Application) Stop()

* * 源码bug,没有等字节码执行结束就直接给释放stack了,问题处在state.go:1391, 已经给作者提了issue, * 如果1个月内不解决,准备自己fork一个过来维护. * Issue: https://github.com/hootrhino/gopher-lua/discussions/430

func (*Application) VM

func (app *Application) VM() *lua.LState

type XAppStack

type XAppStack interface {
	GetRuleX() typex.RuleX
	ListApp() []*Application
	// 把配置里的应用信息加载到内存里
	LoadApp(app *Application) error
	GetApp(uuid string) *Application
	RemoveApp(uuid string) error
	UpdateApp(app Application) error
	// 启动一个停止的进程
	StartApp(uuid string) error
	StopApp(uuid string) error
	Stop()
}

* * APP Stack 管理器 *

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL