### Description 丰富apijson周边
Activity
cloudAndMonkey commentedon Jan 10, 2023
@TommyLemon




在这里独立讨论吧,这两天有点忙,javascript、lua的差不多开发完了,等我忙完再测试
开发思路:
1、抽象脚本引擎执行器 ScriptExecutor
2、 JSR223 script engine的统一实现抽象类
3、可以自定义实现脚本引擎执行器 ScriptExecutor
比如实现 javascript graal.js 脚本引擎
等我后面补充
4、javascript执行器
5、lua执行器
apijson执行集成方式:




1、APIJSONFunctionParser.init 初始化默认脚本引擎
2、APIJSONFunctionParser.init 加载脚本
3、加载扩展脚本执行器(暂时放这里,等我忙完再调整,说明思路)
APIJSONApplication
4、apijson执行脚本
AbstractFunctionParser.invokeScript
5、传递 相关全局元数据
比如 request、tag、version等
等我忙完再测试
TommyLemon commentedon Jan 10, 2023
赞,新开 issue 确实方便很多。
ScriptExecutor 封装很合理,可以更好地兼容不同的脚本引擎实现。
cloudAndMonkey commentedon Jan 12, 2023
@TommyLemon
javascript已经测试完成
注意事项:
1、并发问题
ScriptEngine是线程安全的,自身没有线程问题,但是变量作用域(Bindings)存在线程问题
2、性能优化
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
String[] stringArray = new String[]{"-doe", "--global-per-engine"};
ScriptEngine engine = factory.getScriptEngine(stringArray);
Compilable compilingEngine = (Compilable) engine;
CompiledScript cscript = compilingEngine.compile(scriptVar);
比:
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("javascript");
Compilable compilingEngine = (Compilable) engine;
CompiledScript cscript = compilingEngine.compile(scriptVar);
压力测试,性能要高很多
cloudAndMonkey commentedon Jan 12, 2023
1、开始实现多种javascript 引擎
2、扩展 方法, 业务侧可以配置java类,供脚步调用执行
3、传递 相关全局元数据
比如 request、tag、version等
cloudAndMonkey commentedon Jan 13, 2023
javascript、lua已经调通
经测试:
javascript SimpleBindings 方式能保证线程安全
lua: SimpleBindings无法保证线程安全
需要通过外部锁,比如 lock、synchronized、redis 分布式锁,防止并发问题
cloudAndMonkey commentedon Jan 13, 2023
我把graalvm js加上去,其他脚步他们自己扩展
cloudAndMonkey commentedon Jan 13, 2023
搞完了,晚一点我提交
cloudAndMonkey commentedon Jan 13, 2023
@TommyLemon
校验模块好像这两个字端,没有传递到后端
function tag、version
我还没测
TommyLemon commentedon Jan 13, 2023
方便判断是 lua 就自动加锁,不方便就让用户自己加锁吧
TommyLemon commentedon Jan 13, 2023
默认有一个实现就可以了,其它的用户自己扩展
TommyLemon commentedon Jan 13, 2023
可以先提交 PR,然后再继续看这个哈
spt110 commentedon Jan 14, 2023
javascript引擎中 Nashorn引擎是最快的吗?
cloudAndMonkey commentedon Jan 16, 2023
@TommyLemon
GraalVM 是 Nashorn的替代方案
https://www.graalvm.org/latest/reference-manual/js/NashornMigrationGuide/
Nashorn 引擎已作为 JEP 335 的一部分在 JDK 11 中被弃用,并已作为 JEP 372 的一部分从 JDK15 中删除。GraalVM 可以替代之前在 Nashorn 引擎上执行的 JavaScript 代码。
官网测试:

测试证明 GraalVM JavaScript 大约比 Nashorn Community Edition 快四倍。 并且比 Nashorn Enterprise Edition 快六倍。
Nashorn 引擎: 配置 --global-per-engine 参数能提高性能
cloudAndMonkey commentedon Jan 16, 2023
1、目前支持脚步引擎



jdk默认实现 Nashorn 引擎
Nashorn(--global-per-engine)
graalvm
lua
其他脚步引擎,业务侧可以扩展
2、扩展脚步引擎,支持更多脚步执行器
3、脚本 线程安全问题
业务侧按照需求,进行锁颗粒度控制
目前测试, lua Bindings无法保证线程安全 需要通过外部锁,比如 lock、synchronized、redis 分布式锁,防止并发问题
建议锁颗粒度: 脚本名.
举例:
脚本: length, testArray_lua
锁: length
锁: testArray_lua
ConcurrentHashMap 写key实现原理差不多
4、支持传递 apijson元数据 参数:
version、tag、args
5、支持业务侧扩展参数
extParam
6、脚本编写规范
案例一:
function getType() {
var curObj = _meta.args[0];
var val = _meta.args[1];
var index = _meta.args[2];
return curObj[val] instanceof Array ? 'array' : typeof curObj[val];
}
getType()
案例二:
function getType(curObj, val, index) {
return curObj[val] instanceof Array ? 'array' : typeof curObj[val];
}
getType(_meta.args[0], _meta.args[1], _meta.args[2])
7、支持二次处理脚步
格式化等
8、数据库测试脚本
9、apijson 测试json
支持各种脚步语言
function支持脚本引擎,比如JavaScript、lua等
apijson function支持脚本引擎,比如JavaScript、lua等
apijson function支持脚本引擎,比如JavaScript、lua等
apijson function支持脚本引擎,比如JavaScript、lua等
TommyLemon commentedon Jan 19, 2023
赞!
cloudAndMonkey commentedon Feb 2, 2023
@TommyLemon
framework APIJSONApplication 代码合并缺失

请问你是觉得放在这里不合理吗?
如果不合并, 业务侧 扩展 脚步处理器,需要实现 addScriptExecutor 方法
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONDemo-Script/src/main/java/apijson/demo/DemoApplication.java#L58-L74
变为:

TommyLemon commentedon Feb 2, 2023
@cloudAndMonkey 没有手动移除,应该是 GitHub 客户端自动合并时丢掉了,可以重新加上哈
TommyLemon commentedon Feb 2, 2023
看了下这次 PR,没有包含 APIJSONApplication 的代码变更,只有 APIJSONFunctionParser.java 的变更,可能是你漏提交了哈
https://github.com/APIJSON/apijson-framework/pull/17/files
等你提交后,我合并 PR 再发一个补丁版本
cloudAndMonkey commentedon Feb 2, 2023
哈哈,不好意思
TommyLemon commentedon Feb 2, 2023
@cloudAndMonkey 发了
https://github.com/APIJSON/apijson-framework/releases/tag/6.0.1
和
https://github.com/APIJSON/apijson-router/releases/tag/1.5.1
预计脚本引擎这个新功能短期内用的人很少,而且大部分用户都是直接下载最新 Demo 源码而不是 Release 中的源码压缩包,
所以 APIJSON-Demo 暂不发新版,但更新了 APIJSONDemo-Script 的依赖
APIJSON/APIJSON-Demo@965aa9a
以及所有 Demo 的 jar 包
APIJSON/APIJSON-Demo@4cf107f
cloudAndMonkey commentedon Feb 2, 2023
嗯嗯
spt110 commentedon Feb 5, 2023
cloudAndMonkey commentedon Feb 6, 2023
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo-Script