天涯论坛

 找回密码
 立即注册
搜索
查看: 3|回复: 0

低代码平台后端适合用什么语言研发?Java、Node、Go 还是 Rust?

[复制链接]

3129

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108605
发表于 前天 14:04 | 显示全部楼层 |阅读模式

本文分析了区别语言下实现低代码平台后端的优缺点,倘若你想引进低代码平台做数字化系统,从零研发一个低代码平台都能够参考本文。

入围选手

低代码平台后端要实现海量功能,因此不可选取太偏门的语言,本文重点讨论的是如下几个:

Java,绝大部分国内低代码平台后端的选取 优点:语法简单可读性好,JDBC 是最大护城河,所有其它语言最仰慕的功能 缺点:内存占用大,难以编写异步代码,国内大部分还在用 JDK 8,缺少非常多重要的语法糖 Kotlin,Android 下官方主推语言,日前还很少人用在后端研发 优点:能够运用 JDBC,处理了 Null 问题,比 Java 8 多了很多语法糖,还有协程 缺点:相针对 Java 功能多了不少,但寓意着需要一按时熟练 Node,Node 在国外低代码平台中非常平常,最著名的 Retool 便是,还有开源的 ToolJet、Budibase 等 优点:能够很容易处理低代码中的 JSON DSL,方便前后端共享代码 缺点:性能相对其它语言最差 Rust,同期做到了高性能和内存安全 优点:高性能且内存占用低,语言级别支持异步,能够做成扩展嵌入到其它语言中 缺点:语法繁杂,代码过段时间自己看不懂了 Go,国内许多站点的后端语言 优点:语法简单,适合编写高并发的网络应用 缺点:代码可读性通常,尤其是 enum、反常机制

至于 Python、PHP、Ruby 等语言没入选重点由于和 Node 比没显著优良,性能还更差,日前没见有哪个低代码平台运用因此呢动态语言只选了 Node。

低代码平台要实现那些功能

倘若只是实现简单的业务规律和 CRUD,所有这些语言中仅有 Rust 比较繁杂,Rust 下的 Web 框架例如 Axum 接口比较底层,文档很少,需要经过示例和源码来学习,况且中间件写起来更为麻烦,例如一个 timeout 中间件就需要上百行代码,需要把握 Rust 异步的实现原理引起门槛高。

除了业务规律和 CRUD 之外更重要的是低代码平台中相对繁杂的功能:

接下来咱们分析这些功能在区别语言下的状况

实现低代码平台功能的语言对比

前端 JSON DSL 处理

低代码前端都是基于 JSON 的自定义 DSL,因此呢低代码后端需要经常对 JSON 进行分析或二次处理,例如爱速搭在输出 amis 的时会将其中的 api 转换为代理位置此时需要遍历 JSON 找到这些位置

在处理 JSON 上动态语言 Node 有天然优良由于 JSON 便是 JS 对象,还能直接复用前端的类型定义。

而其它语言相对比较麻烦,重点有两种做法:

初期我很爱好用第二种办法由于 amis 语法非常多变,尤其是非常多属性是多类型的,引起在 Java 中定义类型就只能用 Object,完全失去了强类型的优良另一便是有些 JSON 库支持延迟解析,因此倘若只修改部分字段时这种做法性能最好。

倘若不是 amis 那样多变的语言,我更举荐第1种用法,在定义字段的时候避免多类型,解析 JSON 在区别语言下的状况如下:

Rust,Serde 是事实上的标准,因为 Rust 的 Enum 支持嵌套因此还能处理前面说到的多类型问题,使得它乃至还能像做到 Node 那样不需要定义类型,只用 serde_json::Value 就能解析。 Go,官方有供给 JSON 解析库,但 Go 语法强制需求首字母大写的字段才可公开,而 JSON 中没人会把字段名首字母大写,因此在 Go 中就得写成类似 Name string json:"name"的形式,引起比其它语言麻烦。 Java,Jackson 是事实上的标准,但官方文档很少,全靠第三方文档学习,每次遇到问题我都靠搜索。 Kotlin,因为有 data class 且自带 JSON 解析库,因此呢代码比较简洁。

因此结论是:Node 最好,其次是 Rust,接下来是 Kotlin,而后是 Java,最后是 Go 写起来最麻烦。

数据查找

专业低代码平台一般支持连接用户自己的数据库,此时就需要对应的数据库驱动,在这方面 JDBC 优良显著,所有数据库厂商都会供给 JDBC 驱动,基于 JDBC 能够容易抹平数据库差异,例如获取表结构信息等不需要查阅各个数据库的 INFORMATION_SCHEMA 结构或特殊的 SQL 语句。

整理了一下日前数据库驱动支持状况,其中国产数据库的选自墨天轮 Top 10 中非 MySQL 和 Postgres 兼容的数据库:

能够看到大部分语言都官方驱动,而社区驱动一般仅有一个人研发因此呢在这方面 JDBC 有巨大护城河,接下来稍微好点便是 Node,有许多官方驱动,非官方的驱动咱们用过很稳定。

然而 Node JDBC 这一层抽象,引起非常多驱动表现不一致,例如预编译语句 PreparedStatement,在 JDBC 统一运用 ? 来声明变量,但在 Node 的各样驱动中有五花八门的实现:

除此之外更上层的基本设备还有连接池管理等,在 Java 下有比较成熟的方法,而其它语言都比较初级。

因此呢在数据查找这方面 Java/Kotlin 是最好选取,其次是 Node,接下来是 Go 有少许几个官方驱动,而 Rust 任何官方驱动,质量难以保准

另一你可能会想非常多数据库都供给了 C 语言驱动,Rust 直接经过 FFI 用不就行了么?答案是没那样简单,由于 Rust 下日前流行 Web 框架都是异步的,而 C 语言驱动是同步的会引起线程卡住,因此 Rust 中比较流行的 SQL 执行器 sqlx 乃至自己实现了 MySQL 和 Postgres 的连接协议,引起研发成本很高,因此她们还打算将 MSSQL 和 Oracle 等重要数据库的支持放在商场版本中。

JavaScript 引擎

在低代码平台中为了让用户实现更灵活的功能,一般需要支持自定义代码,这个代码一般是 JavaScript,因此呢低代码平台后端需要包括 JavaScript 引擎。

JavaScript 引擎日前能选的就仅有四种方法

因此区别语言下的状况如下:

Rust,Rust 的 FFI 虽然 Zig 那样直接,但是这几个语言中支持最好的 Rusty V8,Deno 团队守护的,活跃度较高。 javascriptcore,Tauri 团队守护的,活跃度通常。 Boa,纯 Rust 实现的 JavaScript 解释器,日前还不成熟 Go,因为 Go 的 CGO 有不小性能损耗,引起这方面的库不多不怎么活跃 v8go,两年没怎么更新了。 otto,纯 Go 实现的 JavaScript 解释器,不支持 ES6,正则运用 re2 引起和 JavaScript 规范不一致,用不了。 Java,Java 生态下大众为了跨平台都不爱好用原生库,因此类似 J2V8 这种库很少有人用,但 Java 下有成熟的 JavaScript 引擎实现: Nashorn,JDK 8 中内置的 JavaScript 引擎,只支持 ES5 并在 JDK 15 中删除了。 graaljs,GraalVM 中供给的引擎,能运行在 JDK 11 中,支持不少最新的 JavaScript 语法,日前举荐运用这个。 Rhino,Mozilla 研发的 JavaScript 引擎,从 1999 年起始就有了,支持部分 ES6 语法,市值超过 1400 亿的低代码平台 ServiceNow 便是运用它,倘若想支持 JDK8 又想有有些 ES6 语法,这个是独一选取,但缺点是性能较差。 Node,前面说到重点问题是安全危害例如早起咱们运用过 vm2,但它后来遇到一个安全漏洞没法处理此刻举荐用 isolated-vm,但可能有一天这个没法用了。

整体来讲在 JavaScript 引擎方面 Node 最有优良但有危害,其次是 Java,Rust 能用,Go 基本没法用。

表达式引擎

在低代码制品中有时需要有些简单的要求判断或计算,例如下面的场景:

在流程中判断金额大于多少且级别少于多少。 进行公式计算,例如计算毛利率之类的,类似 Excel 中的公式。

第1状况能够经过可视化界面例如 amis 的要求组合来实现,但第二种用界面就不太合适了,比起可视化,数学公式写起来更直观。

因此呢低代码制品的后端需要实现一个表达式引擎,这个引擎虽然用前面的 JavaScript 引擎能部分实现,但为何不直接运用 JavaScript 引擎?重点有以下几方面原由

实现表达式引擎的核心由两部分构成:语法解析、实现内置函数。

其中实现内置函数比较简单,因此重点难点是语法解析,语法解析能够手动实现或运用工具自动生成代码。

手动实现虽然看起来繁杂,但倘若认识了类似 Top Down Operator Precedence 的原理其实并不难,不外因为大部分人来讲有工具还是更方便点,因此呢接下来重点分析区别语言下运用第三库或工具实现表达式引擎的思路:

Rust 现成的:零星找到几个但看起来都不成熟 解析工具:能够用 lalrpop 或 pest,没实质用个不确定成熟度 Go 现成的:Expr 和 Cel 等 解析工具:能够运用 ANTLR 或 peg,但不确定成熟度 Java 现成的:非常多,能够参考这儿,值得一提的是 Spring 内置的 SpEL,代码质量高,还支持转成字节码来提高性能 解析工具:ANTLR,非常成熟,官方示例中有海量实现可供参考 Node 现成的:很著名的,大概是由于 Node 这种动态语言能够直接用 eval 执行,用不上 解析工具:有非常多,除了 ANTLR 这种生成代码的方式,还有 Chevrotain 这种动态解析,成熟度比较高

整体来讲倘若晓得怎么手写解析,这几个语言区别不大,但倘若晓得怎么写解析,用现成的话 Java 最成熟,Go 其次,解析工具的话 Node 和 Rust 都有,而 Node 中的相对成熟点,不外学 Rust 的人均大神,因此呢应该写个解析难度不大,能够参考这儿

规律编排

规律编排能够用来实现简单的后端业务规律,使得完全不写代码就能完成业务规律研发因此呢是低代码平台中的重要功能。

实现规律编排需要实现两种类型的节点:

持有了这些节点后,许多简单的业务规律就能完全经过可视化的方式实现。

在有 GC 的语言中实现这个功能不难,但 Rust 会有点问题,由于 GC,仅有引用计数机制,而这些节点底层数据结构一般是树或图,为了方便操作一般会有相互引用的状况例如引用父级节点,在 Rust 下需要运用 Weak 引用来避免内存没法释放,运用 arena 这种古老的内存池技术。

另一这部分触及到数据库和 HTTP 这些外边请求,倘若想要用异步机制来提高并发性能,例如接口可能是下载个大文件,此时 Node 和 Go 就比 Java 更有优良,Java 响应式代码写起来太难懂了,而 Kotlin 有协程相对好点。

整体来讲这几个语言我更倾向于用 Node 实现这个功能,不外低代码平台一般不需要太高并发,运用 Java 实现问题不大,但 Rust 下要实现这个功能会相对更繁杂

流程引擎

流程引擎和规律编排看起很类似,有部分低代码制品中还将这两部分合并了,流程引擎和规律编排有个最大区别是流程引擎有些特殊的流转功能,例如

倘若审批人是自己就自动跳过 多人审批是只要一个经过就行还是必须所有 回退是要回到上个节点还是最初节点

流程引擎的数据存储更适合用图来暗示,还经常要找父节点,因此呢容易形成循环引用,引起 Rust 下编写起来更加繁琐。

可选方法

综合各个语言下的优缺点,日前可选方法有:

Java/Kotlin 上面所有功能 Java 都能胜任,况且独一支持所有国产数据库的方法重点缺点是内存占用比很强,异步编写麻烦。 Kotlin 虽然对异步有更好支持,但日前服务端很少人运用。 Node 仅次于 Java 的方法,除了国产数据库之外都能胜任,况且很容易实现异步 IO,重点缺点是性能相对较差。 Java + Node 结合这两个语言的特点同期运用,数据部分用 Java,异步及 JSON 处理用 Node,缺点是有通讯代价。 Rust + Java Rust 在数据库方面还不成熟,需要协同 Java 运用,优点是性能和内存占用都是最好,但 Rust 研发业务规律实现成本较高。 Go + Java Go 在数据查找、JavaScript 引擎方面不太适合,需要协同 Java 运用,这个方法整体优点是比 Rust 简单非常多

倘若思虑团队成员熟练状况,让我选取的话,我个人倾向于 Node+Kotlin 或 Rust+Kotlin。

选取 Kotlin 的重点思虑是国内广泛运用的 JDK 8,而 Java 8 缺少非常多重要特性,代码写起来冗余,Kotlin 丰富的语法能够大幅简化,它的缺点是有许多容易引起其他人看不懂的写法,多人研发时需要禁止炫技。

Rust 虽然上手门槛高,但它有个独特优良便是容易嵌入到其它语言中,倘若想做低代码平台基本设备,让底层能力能够供给各样语言运用,除了 C/C++ 之外 Rust 便是日前独一成熟靠谱的语言,其它都差得更远,例如 Zig 虽然语法简洁,但它做不到内存安全,更易运行时出报错。返回搜狐,查看更加多

责任编辑:网友投稿





上一篇:一品威客:研发社交应用应该用哪种语言?研发社交应用有哪些优良?
下一篇:优化Shopee Listing秘笈,学“爆单神功”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-24 19:04 , Processed in 0.117586 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.