j8typz 发表于 2024-8-18 10:29:11

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


    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="//q8.itc.cn/images01/20240719/bbc1303f02c444adb6223045204e71fb.jpeg" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">本文分析了<span style="color: black;">区别</span>语言下实现低代码平台后端的优缺点,<span style="color: black;">倘若</span>你想引进低代码平台做数字化系统,<span style="color: black;">或</span>从零<span style="color: black;">研发</span>一个低代码平台都<span style="color: black;">能够</span>参考本文。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">入围选手</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">低代码平台后端要实现<span style="color: black;">海量</span>功能,<span style="color: black;">因此</span><span style="color: black;">不可</span><span style="color: black;">选取</span>太偏门的语言,本文重点讨论的是如下几个:</p>Java,绝大部分国内低代码平台后端的<span style="color: black;">选取</span>优点:语法简单可读性好,JDBC 是最大护城河,所有其它语言最<span style="color: black;">仰慕</span>的功能缺点:内存占用大,难以编写异步代码,国内大部分还在用 JDK 8,缺少<span style="color: black;">非常多</span>重要的语法糖Kotlin,Android 下官方主推语言,<span style="color: black;">日前</span>还很少人用在后端<span style="color: black;">研发</span>优点:<span style="color: black;">能够</span><span style="color: black;">运用</span> JDBC,<span style="color: black;">处理</span>了 Null 问题,比 Java 8 多了<span style="color: black;">非常多</span>语法糖,还有协程缺点:相<span style="color: black;">针对</span> Java 功能多了不少,但<span style="color: black;">亦</span><span style="color: black;">寓意</span>着<span style="color: black;">必须</span>一<span style="color: black;">按时</span>间<span style="color: black;">熟练</span>Node,Node 在国外低代码平台中非常<span style="color: black;">平常</span>,最著名的 Retool <span style="color: black;">便是</span>,还有开源的 ToolJet、Budibase 等优点:<span style="color: black;">能够</span>很容易处理低代码中的 JSON DSL,方便前后端共享代码缺点:性能相对其它语言最差Rust,<span style="color: black;">同期</span>做到了高性能和内存安全优点:高性能且内存占用低,语言级别支持异步,<span style="color: black;">能够</span>做成扩展嵌入到其它语言中缺点:语法<span style="color: black;">繁杂</span>,代码过段时间自己<span style="color: black;">亦</span>看不懂了Go,国内许多站点的后端语言优点:语法简单,适合编写高并发的网络应用缺点:代码可读性<span style="color: black;">通常</span>,尤其是<span style="color: black;">无</span> enum、<span style="color: black;">反常</span>机制<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">至于 Python、PHP、Ruby 等语言没入选<span style="color: black;">重点</span>是<span style="color: black;">由于</span>和 Node 比没<span style="color: black;">显著</span><span style="color: black;">优良</span>,性能还更差,<span style="color: black;">日前</span><span style="color: black;">亦</span>没见有哪个低代码平台<span style="color: black;">运用</span>,<span style="color: black;">因此呢</span>动态语言只选了 Node。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">低代码平台要实现<span style="color: black;">那些</span>功能</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">倘若</span>只是实现简单的业务<span style="color: black;">规律</span>和 CRUD,所有这些语言中<span style="color: black;">仅有</span> Rust 比较<span style="color: black;">繁杂</span>,Rust 下的 Web 框架<span style="color: black;">例如</span> Axum 接口比较底层,文档很少,<span style="color: black;">必须</span><span style="color: black;">经过</span>示例和源码来学习,<span style="color: black;">况且</span>中间件写起来<span style="color: black;">亦</span>更为麻烦,<span style="color: black;">例如</span>一个 timeout 中间件就<span style="color: black;">必须</span>上百行代码,<span style="color: black;">必须</span><span style="color: black;">把握</span> Rust 异步的实现原理<span style="color: black;">引起</span>门槛高。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">除了业务<span style="color: black;">规律</span>和 CRUD 之外更重要的是低代码平台中相对<span style="color: black;">繁杂</span>的功能:</p>前端 JSON DSL 处理数据<span style="color: black;">查找</span>,对接数据源或实现宽表功能JavaScript 引擎,支持自定义后端代码表达式引擎,实现简单的定制<span style="color: black;">规律</span>API 编排,实现对接<span style="color: black;">外边</span> API 接口流程引擎,实现流转功能<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">接下来<span style="color: black;">咱们</span>分析这些功能在<span style="color: black;">区别</span>语言下的<span style="color: black;">状况</span></p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">实现低代码平台功能的语言对比</h1>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">前端 JSON DSL 处理</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">低代码前端都是基于 JSON 的自定义 DSL,<span style="color: black;">因此呢</span>低代码后端<span style="color: black;">必须</span>经常对 JSON 进行分析或二次处理,<span style="color: black;">例如</span>爱速搭在输出 amis 的时会将其中的 api 转换为代理<span style="color: black;">位置</span>,<span style="color: black;">此时</span><span style="color: black;">必须</span>遍历 JSON 找到这些<span style="color: black;">位置</span>。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在处理 JSON 上动态语言 Node 有天然<span style="color: black;">优良</span>,<span style="color: black;">由于</span> JSON <span style="color: black;">便是</span> JS 对象,还能直接复用前端的类型定义。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">而其它语言相对比较麻烦,<span style="color: black;">重点</span>有两种做法:</p>定义数据结构,自动转换为<span style="color: black;">区别</span>语言下的数据结构,好处是后续都是强类型,但<span style="color: black;">针对</span><span style="color: black;">繁杂</span>嵌套定义非常繁琐,还有部分框架在遇到不太规范数据时的容错性<span style="color: black;">欠好</span>,可能会直接报错。<span style="color: black;">运用</span> JSON 库的接口动态遍历和处理,好处是不<span style="color: black;">必须</span>定义类型,但操作起来<span style="color: black;">无</span>类型<span style="color: black;">守护</span>,容易运行时报错。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">初期</span>我很<span style="color: black;">爱好</span>用第二种<span style="color: black;">办法</span>,<span style="color: black;">由于</span> amis 语法非常多变,尤其是<span style="color: black;">非常多</span>属性是多类型的,<span style="color: black;">引起</span>在 Java 中定义类型就只能用 Object,完全失去了强类型的<span style="color: black;">优良</span>,<span style="color: black;">另一</span><span style="color: black;">便是</span>有些 JSON 库支持延迟解析,<span style="color: black;">因此</span><span style="color: black;">倘若</span>只修改部分字段时这种做法性能最好。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">而<span style="color: black;">倘若</span>不是 amis <span style="color: black;">那样</span>多变的语言,我更<span style="color: black;">举荐</span><span style="color: black;">第1</span>种用法,在定义字段的时候避免多类型,解析 JSON 在<span style="color: black;">区别</span>语言下的<span style="color: black;">状况</span>如下:</p>Rust,Serde 是事实上的标准,<span style="color: black;">因为</span> Rust 的 Enum 支持嵌套<span style="color: black;">因此</span>还能<span style="color: black;">处理</span>前面<span style="color: black;">说到</span>的多类型问题,使得它<span style="color: black;">乃至</span>还能像做到 Node 那样不<span style="color: black;">必须</span>定义类型,只用 serde_json::Value 就能解析。Go,官方有<span style="color: black;">供给</span> JSON 解析库,但 Go 语法强制<span style="color: black;">需求</span>首字母大写的字段<span style="color: black;">才可</span>公开,而 JSON 中没人会把字段名首字母大写,<span style="color: black;">因此</span>在 Go 中就得写成类似 Name string json:"name"的形式,<span style="color: black;">引起</span>比其它语言麻烦。Java,Jackson 是事实上的标准,但官方文档很少,全靠第三方文档学习,每次遇到问题我都靠搜索。Kotlin,<span style="color: black;">因为</span>有 data class 且自带 JSON 解析库,<span style="color: black;">因此呢</span>代码比较简洁。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">因此</span>结论是:Node 最好,其次是 Rust,接下来是 Kotlin,<span style="color: black;">而后</span>是 Java,最后是 Go 写起来最麻烦。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">数据<span style="color: black;">查找</span></h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">专业低代码平台<span style="color: black;">一般</span>支持连接用户自己的数据库,<span style="color: black;">此时</span>就<span style="color: black;">必须</span>对应的数据库驱动,在这方面 JDBC <span style="color: black;">优良</span><span style="color: black;">显著</span>,所有数据库厂商都会<span style="color: black;">供给</span> JDBC 驱动,基于 JDBC <span style="color: black;">能够</span><span style="color: black;">容易</span>抹平数据库差异,<span style="color: black;">例如</span>获取表结构信息等不<span style="color: black;">必须</span>查阅各个数据库的 INFORMATION_SCHEMA 结构或特殊的 SQL 语句。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">整理了一下<span style="color: black;">日前</span>数据库驱动支持<span style="color: black;">状况</span>,其中国产数据库的选自墨天轮 Top 10 中非 MySQL 和 Postgres 兼容的数据库:</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="//q0.itc.cn/images01/20240719/23b77961f46e40b2ae73122d20f27acd.png" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">能够</span>看到大部分语言都<span style="color: black;">无</span>官方驱动,而社区驱动<span style="color: black;">一般</span>只有一个人<span style="color: black;">研发</span>,<span style="color: black;">因此呢</span>在这方面 JDBC 有巨大护城河,接下来稍微好点<span style="color: black;">便是</span> Node,有许多官方驱动,非官方的驱动<span style="color: black;">咱们</span>用过<span style="color: black;">亦</span>很稳定。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">然而 Node <span style="color: black;">无</span> JDBC 这一层抽象,<span style="color: black;">引起</span><span style="color: black;">非常多</span>驱动表现不一致,<span style="color: black;">例如</span>预编译语句 PreparedStatement,在 JDBC 统一<span style="color: black;">运用</span> ? 来声明变量,但在 Node 的<span style="color: black;">各样</span>驱动中有五花八门的实现:</p>在 node-postgres 中是用 $1在 oracle 中是用 :1在 mssql 中是用 @<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">除此之外更上层的<span style="color: black;">基本</span><span style="color: black;">设备</span>还有连接池管理等,在 Java 下有比较成熟的<span style="color: black;">方法</span>,而其它语言都比较初级。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">因此呢</span>在数据<span style="color: black;">查找</span>这方面 Java/Kotlin 是最好<span style="color: black;">选取</span>,其次是 Node,接下来是 Go 有<span style="color: black;">少许</span>几个官方驱动,而 Rust <span style="color: black;">无</span>任何官方驱动,质量难以<span style="color: black;">保准</span>。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">另一</span>你可能会想<span style="color: black;">非常多</span>数据库都<span style="color: black;">供给</span>了 C 语言驱动,Rust 直接<span style="color: black;">经过</span> FFI 用不就行了么?答案是没<span style="color: black;">那样</span>简单,<span style="color: black;">由于</span> Rust 下<span style="color: black;">日前</span>流行 Web 框架都是异步的,而 C 语言驱动是同步的会<span style="color: black;">引起</span>线程卡住,<span style="color: black;">因此</span> Rust 中比较流行的 SQL 执行器 sqlx <span style="color: black;">乃至</span>自己实现了 MySQL 和 Postgres 的连接协议,<span style="color: black;">引起</span><span style="color: black;">研发</span>成本很高,<span style="color: black;">因此</span><span style="color: black;">她们</span>还打算将 MSSQL 和 Oracle 等重要数据库的支持放在<span style="color: black;">商场</span>版本中。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">JavaScript 引擎</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在低代码平台中为了让用户实现更灵活的功能,<span style="color: black;">一般</span><span style="color: black;">必须</span>支持自定义代码,这个代码<span style="color: black;">一般</span>是 JavaScript,<span style="color: black;">因此呢</span>低代码平台后端<span style="color: black;">必须</span><span style="color: black;">包括</span> JavaScript 引擎。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">JavaScript 引擎<span style="color: black;">日前</span>能选的就<span style="color: black;">仅有</span>四种<span style="color: black;">方法</span>:</p>原生语言实现的 JavaScript 引擎,<span style="color: black;">这儿</span><span style="color: black;">独一</span>成熟的<span style="color: black;">仅有</span> Java 中的实现。接入基于 C++ 实现的成熟引擎,优点是兼容性最好,缺点是<span style="color: black;">必须</span>语言良好支持 FFI。Deno/Node 里实现的沙箱机制,优点是性能最好,缺点是有安全<span style="color: black;">危害</span>。进程沙盒,优点是除了 JavaScript 之外还能支持其它语言,缺点是性能差,强依赖系统内核,<span style="color: black;">例如</span> NsJail 只能在 Linux 下<span style="color: black;">运用</span>,<span style="color: black;">区别</span>系统下得<span style="color: black;">运用</span><span style="color: black;">区别</span><span style="color: black;">方法</span>,<span style="color: black;">研发</span>成本高,后面要支持信创系统可能会坑。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">因此</span><span style="color: black;">区别</span>语言下的<span style="color: black;">状况</span>如下:</p>Rust,Rust 的 FFI 虽然<span style="color: black;">无</span> Zig 那样直接,但<span style="color: black;">亦</span>是这几个语言中支持最好的Rusty V8,Deno 团队<span style="color: black;">守护</span>的,活跃度较高。javascriptcore,Tauri 团队<span style="color: black;">守护</span>的,活跃度<span style="color: black;">通常</span>。Boa,纯 Rust 实现的 JavaScript 解释器,<span style="color: black;">日前</span>还不成熟Go,<span style="color: black;">因为</span> Go 的 CGO 有不小性能损耗,<span style="color: black;">引起</span>这方面的库不多<span style="color: black;">亦</span>不怎么活跃v8go,两年没怎么更新了。otto,纯 Go 实现的 JavaScript 解释器,不支持 ES6,正则<span style="color: black;">运用</span> re2 <span style="color: black;">引起</span>和 JavaScript 规范不一致,用不了。Java,Java 生态下<span style="color: black;">大众</span>为了跨平台都不<span style="color: black;">爱好</span>用原生库,<span style="color: black;">因此</span>类似 J2V8 这种库很少有人用,但 Java 下有成熟的 JavaScript 引擎实现:Nashorn,JDK 8 中内置的 JavaScript 引擎,只支持 ES5 并在 JDK 15 中删除了。graaljs,GraalVM 中<span style="color: black;">供给</span>的引擎,<span style="color: black;">亦</span>能运行在 JDK 11 中,支持不少最新的 JavaScript 语法,<span style="color: black;">日前</span>最<span style="color: black;">举荐</span><span style="color: black;">运用</span>这个。Rhino,Mozilla <span style="color: black;">研发</span>的 JavaScript 引擎,从 1999 年<span style="color: black;">起始</span>就有了,支持部分 ES6 语法,市值超过 1400 亿的低代码平台 ServiceNow <span style="color: black;">便是</span><span style="color: black;">运用</span>它,<span style="color: black;">倘若</span>想支持 JDK8 又想有<span style="color: black;">有些</span> ES6 语法,这个是<span style="color: black;">独一</span><span style="color: black;">选取</span>,但缺点是性能较差。Node,前面<span style="color: black;">说到</span>了<span style="color: black;">重点</span>问题是安全<span style="color: black;">危害</span>,<span style="color: black;">例如</span>早起<span style="color: black;">咱们</span><span style="color: black;">运用</span>过 vm2,但它后来遇到一个安全漏洞<span style="color: black;">没法</span><span style="color: black;">处理</span>,<span style="color: black;">此刻</span><span style="color: black;">举荐</span>用 isolated-vm,但<span style="color: black;">亦</span>可能有一天这个<span style="color: black;">亦</span>没法用了。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">整体<span style="color: black;">来讲</span>在 JavaScript 引擎方面 Node 最有<span style="color: black;">优良</span>但有<span style="color: black;">危害</span>,其次是 Java,Rust <span style="color: black;">亦</span>能用,Go 基本没法用。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">表达式引擎</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在低代码<span style="color: black;">制品</span>中有时<span style="color: black;">必须</span><span style="color: black;">有些</span>简单的<span style="color: black;">要求</span>判断或计算,<span style="color: black;">例如</span>下面的场景:</p>在流程中判断金额大于多少且级别<span style="color: black;">少于</span>多少。进行公式计算,<span style="color: black;">例如</span>计算毛利率之类的,类似 Excel 中的公式。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">第1</span>种<span style="color: black;">状况</span><span style="color: black;">能够</span><span style="color: black;">经过</span>可视化界面<span style="color: black;">例如</span> amis 的<span style="color: black;">要求</span>组合来实现,但第二种用界面就不太合适了,比起可视化,数学公式写起来更直观。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">因此呢</span>低代码<span style="color: black;">制品</span>的后端<span style="color: black;">必须</span>实现一个表达式引擎,这个引擎虽然用前面的 JavaScript 引擎<span style="color: black;">亦</span>能部分实现,但<span style="color: black;">为何</span>不直接<span style="color: black;">运用</span> JavaScript 引擎?<span style="color: black;">重点</span>有以下几方面<span style="color: black;">原由</span>:</p>性能,初始化 JavaScript 引擎比较<span style="color: black;">最少</span>毫秒级别,而表达式引擎简单计算<span style="color: black;">能够</span>在微秒级别。安全性,内嵌 JavaScript 引擎<span style="color: black;">必须</span>做沙箱处理,有可能<span style="color: black;">显现</span>逃逸等安全问题,相对<span style="color: black;">来讲</span>自己实现的表达式引擎会安全得多。语法<span style="color: black;">更易</span><span style="color: black;">掌控</span>,<span style="color: black;">例如</span><span style="color: black;">能够</span>忽略<span style="color: black;">体积</span>写方便非<span style="color: black;">开发</span>用户<span style="color: black;">运用</span>。支持大数计算,自己实现的引擎<span style="color: black;">能够</span>默认都<span style="color: black;">运用</span> BigNumber,<span style="color: black;">能够</span>避免 JavaScript 精度问题。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">实现表达式引擎的核心由两部分<span style="color: black;">构成</span>:语法解析、实现内置函数。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">其中实现内置函数比较简单,<span style="color: black;">因此</span><span style="color: black;">重点</span>难点是语法解析,语法解析<span style="color: black;">能够</span>手动实现或<span style="color: black;">运用</span>工具自动生成代码。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">手动实现虽然看起来<span style="color: black;">繁杂</span>,但<span style="color: black;">倘若</span><span style="color: black;">认识</span>了类似 Top Down Operator Precedence 的原理其实并不难,<span style="color: black;">不外</span><span style="color: black;">因为</span>大部分人<span style="color: black;">来讲</span>有工具还是更方便点,<span style="color: black;">因此呢</span>接下来<span style="color: black;">重点</span>分析<span style="color: black;">区别</span>语言下<span style="color: black;">运用</span>第三库或工具实现表达式引擎的思路:</p>Rust现成的:零星找到几个但看起来都不成熟解析工具:<span style="color: black;">能够</span>用 lalrpop 或 pest,没<span style="color: black;">实质</span>用个不确定成熟度Go现成的:Expr 和 Cel 等解析工具:<span style="color: black;">能够</span><span style="color: black;">运用</span> ANTLR 或 peg,但不确定成熟度Java现成的:非常多,<span style="color: black;">能够</span>参考<span style="color: black;">这儿</span>,值得一提的是 Spring 内置的 SpEL,代码质量高,还支持转成字节码来<span style="color: black;">提高</span>性能解析工具:ANTLR,非常成熟,官方示例中有<span style="color: black;">海量</span>实现可供参考Node现成的:<span style="color: black;">无</span>很著名的,大概是<span style="color: black;">由于</span> Node 这种动态语言<span style="color: black;">能够</span>直接用 eval 执行,用不上解析工具:有<span style="color: black;">非常多</span>,除了 ANTLR 这种生成代码的方式,还有 Chevrotain 这种动态解析,成熟度比较高<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">整体<span style="color: black;">来讲</span><span style="color: black;">倘若</span>你<span style="color: black;">晓得</span>怎么手写解析,这几个语言区别不大,但<span style="color: black;">倘若</span>不<span style="color: black;">晓得</span>怎么写解析,用现成的话 Java 最成熟,Go 其次,解析工具的话 Node 和 Rust <span style="color: black;">亦</span>都有,而 Node 中的相对成熟点,<span style="color: black;">不外</span>学 Rust 的人均大神,<span style="color: black;">因此呢</span>应该写个解析难度不大,<span style="color: black;">能够</span>参考<span style="color: black;">这儿</span>。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;"><span style="color: black;">规律</span>编排</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">规律</span>编排<span style="color: black;">能够</span>用来实现简单的后端业务<span style="color: black;">规律</span>,使得完全不写代码就能完成业务<span style="color: black;">规律</span><span style="color: black;">研发</span>,<span style="color: black;">因此呢</span>是低代码平台中的重要功能。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="//q8.itc.cn/images01/20240719/b6acbea1e75c490280715bd0cda4faee.jpeg" style="width: 50%; margin-bottom: 20px;"></p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">实现<span style="color: black;">规律</span>编排<span style="color: black;">必须</span>实现两种类型的节点:</p><span style="color: black;">掌控</span>类节点,<span style="color: black;">例如</span>循环、分支<span style="color: black;">要求</span>、事务等,类似代码中的<span style="color: black;">掌控</span>结构执行节点,<span style="color: black;">例如</span>执行数据<span style="color: black;">查找</span>、调用 HTTP 接口等<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">持有</span>了这些节点后,许多简单的业务<span style="color: black;">规律</span>就能完全<span style="color: black;">经过</span>可视化的方式实现。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在有 GC 的语言中实现这个功能不难,但 Rust 会有点问题,<span style="color: black;">由于</span>它<span style="color: black;">无</span> GC,<span style="color: black;">仅有</span>引用计数机制,而这些节点底层数据结构<span style="color: black;">一般</span>是树或图,为了方便操作<span style="color: black;">一般</span>会有相互引用的<span style="color: black;">状况</span>,<span style="color: black;">例如</span>引用父级节点,在 Rust 下<span style="color: black;">必须</span><span style="color: black;">运用</span> Weak 引用来避免内存<span style="color: black;">没法</span>释放,<span style="color: black;">或</span><span style="color: black;">运用</span> arena 这种古老的内存池技术。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">另一</span>这部分<span style="color: black;">触及</span>到数据库和 HTTP 这些<span style="color: black;">外边</span>请求,<span style="color: black;">倘若</span><span style="color: black;">想要</span>用异步机制来<span style="color: black;">提高</span>并发性能,<span style="color: black;">例如</span>接口可能是下载个大文件,<span style="color: black;">此时</span> Node 和 Go 就比 Java 更有<span style="color: black;">优良</span>,Java 响应式代码写起来太难懂了,而 Kotlin 有协程相对好点。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">整体<span style="color: black;">来讲</span>这几个语言我更倾向于用 Node 实现这个功能,<span style="color: black;">不外</span>低代码平台<span style="color: black;">一般</span>不<span style="color: black;">必须</span>太高并发,<span style="color: black;">运用</span> Java 实现问题<span style="color: black;">亦</span>不大,但 Rust 下要实现这个功能会相对更<span style="color: black;">繁杂</span>。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">流程引擎</h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">流程引擎和<span style="color: black;">规律</span>编排看起很<span style="color: black;">类似</span>,有部分低代码<span style="color: black;">制品</span>中还将这两部分合并了,流程引擎和<span style="color: black;">规律</span>编排有个最大<span style="color: black;">区别</span>是流程引擎有些特殊的流转功能,<span style="color: black;">例如</span>:</p><span style="color: black;">倘若</span>审批人是自己就自动跳<span style="color: black;">太多</span>人审批是只要一个<span style="color: black;">经过</span>就行还是<span style="color: black;">必要</span><span style="color: black;">所有</span>回退是要回到上个节点还是最初节点<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">流程引擎的数据存储更适合用图来<span style="color: black;">暗示</span>,还经常要找父节点,<span style="color: black;">因此呢</span>容易形成循环引用,<span style="color: black;">引起</span> Rust 下编写起来更加繁琐。</p>
    <h1 style="color: black; text-align: left; margin-bottom: 10px;">可选<span style="color: black;">方法</span></h1>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">综合各个语言下的优缺点,<span style="color: black;">日前</span>可选<span style="color: black;">方法</span>有:</p>Java/Kotlin上面所有功能 Java 都能胜任,<span style="color: black;">况且</span>是<span style="color: black;">独一</span>支持所有国产数据库的<span style="color: black;">方法</span>,<span style="color: black;">重点</span>缺点是内存占用比<span style="color: black;">很强</span>,异步编写麻烦。Kotlin 虽然对异步有更好支持,但<span style="color: black;">日前</span>服务端很少人<span style="color: black;">运用</span>。Node仅次于 Java 的<span style="color: black;">方法</span>,除了国产数据库之外都能胜任,<span style="color: black;">况且</span>很容易实现异步 IO,<span style="color: black;">重点</span>缺点是性能相对较差。Java + Node结合这两个语言的特点<span style="color: black;">同期</span><span style="color: black;">运用</span>,数据部分用 Java,异步及 JSON 处理用 Node,缺点是有通讯代价。Rust + JavaRust 在数据库方面还不成熟,<span style="color: black;">必须</span><span style="color: black;">协同</span> Java <span style="color: black;">运用</span>,优点是性能和内存占用都是最好,但 Rust <span style="color: black;">研发</span>业务<span style="color: black;">规律</span>实现成本较高。Go + JavaGo 在数据<span style="color: black;">查找</span>、JavaScript 引擎方面不太适合,<span style="color: black;">必须</span><span style="color: black;">协同</span> Java <span style="color: black;">运用</span>,这个<span style="color: black;">方法</span>整体优点是比 Rust 简单<span style="color: black;">非常多</span>。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">倘若</span>不<span style="color: black;">思虑</span>团队成员<span style="color: black;">熟练</span><span style="color: black;">状况</span>,让我<span style="color: black;">选取</span>的话,我个人倾向于 Node+Kotlin 或 Rust+Kotlin。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">选取</span> Kotlin 的<span style="color: black;">重点</span><span style="color: black;">思虑</span>是国内<span style="color: black;">广泛</span><span style="color: black;">运用</span>的 JDK 8,而 Java 8 缺少<span style="color: black;">非常多</span>重要特性,代码写起来冗余,Kotlin 丰富的语法<span style="color: black;">能够</span>大幅简化,它的缺点是有许多容易<span style="color: black;">引起</span>其他人看不懂的写法,多人<span style="color: black;">研发</span>时<span style="color: black;">必须</span>禁止炫技。</p>
    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Rust 虽然上手门槛高,但它有个独特<span style="color: black;">优良</span>,<span style="color: black;">便是</span>能<span style="color: black;">容易</span>嵌入到其它语言中,<span style="color: black;">倘若</span>想做低代码平台<span style="color: black;">基本</span><span style="color: black;">设备</span>,让底层能力<span style="color: black;">能够</span><span style="color: black;">供给</span>给<span style="color: black;">各样</span>语言<span style="color: black;">运用</span>,除了 C/C++ 之外 Rust <span style="color: black;">便是</span><span style="color: black;">日前</span><span style="color: black;">独一</span>成熟<span style="color: black;">靠谱</span>的语言,其它都差得更远,<span style="color: black;">例如</span> Zig 虽然语法简洁,但它做不到内存安全,<span style="color: black;">更易</span>运行时出报错。<a style="color: black;"><span style="color: black;">返回<span style="color: black;">外链论坛:www.fok120.com</span>,查看<span style="color: black;">更加多</span></span></a></p>

    <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">责任编辑:网友投稿</span></p>




流星的美 发表于 2024-8-20 05:56:14

说得好啊!我在外链论坛打滚这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。

情迷布拉格 发表于 2024-8-23 11:16:47

你的见解真是独到,让我受益匪浅。

流星的美 发表于 2024-8-24 17:44:56

大势所趋,用于讽刺一些制作目的就是为了跟风玩梗,博取眼球的作品。

qzmjef 发表于 2024-10-6 02:41:20

seo常来的论坛,希望我的网站快点收录。

1fy07h 发表于 2024-10-13 15:19:36

楼主听话,多发外链好处多,快到碗里来!外链论坛 http://www.fok120.com/
页: [1]
查看完整版本: 低代码平台后端适合用什么语言研发?Java、Node、Go 还是 Rust?