当前位置: 首页 > 科技观察

Web开发对比:SpringBootvs.Express.js

时间:2023-03-12 23:01:26 科技观察

服务端开发JavaScript比Java好吗?它可能仅取决于正在开发的应用程序。我现在可以听到来自Java开发人员的声音。从Java开发人员的角度对使用SpringBoot生态系统和JavaScript的Web开发与Express进行简单比较。本文的目标是进行较少的技术比较(您可以在其他地方找到更具体的技术比较)。我只想概述当您是Java开发人员时如何在Node.js中开发Web应用程序。所以请记住,这篇文章充满了个人意见。在开始之前,我概述了一些前提:1.我是一名使用Java语言的软件开发人员。我已经开发基于Java的软件大约15年了。2.我目前正在学习JavaScript开发(我从2007年开始编写前端JavaScript,但服务器端JavaScript已成为它自己的野兽)。我想比较的内容我想强调在开发基于Node/Express堆栈的应用程序与基于SpringBoot的应用程序相比时感受到的一些差异。为什么我要比较这些TL;DR:在完成一个承包项目后,我决定测试另一个生态系统以检查它是否可以避免一些Java最受批评的点。我最近的一个客户是一家创建加密货币交易所的公司(是的,在当今市场很常见,但对一家意大利公司而言则不然)。他们让我加入他们的团队(三个不同的开发团队)并帮助他们构建平台。我主要开发用于授权和身份验证、核心事务处理以及其他类似KYC微服务的微服务,用于客户端和不同微服务之间共享的代码库。这是一个大而有趣的项目。但在与其他团队和人员的讨论中,我经常听到对基于Java的Web开发支持Python或Go的批评。其他语言似乎没有受到Java的一些批评是:Java冗长。Java中的一切都是界面混乱。Java应用程序的内存消耗是巨大的。磁盘空间消耗也可能是巨大的。开发需要很多时间。编写数百个基于Docker的微服务时,应考虑3.和4。我认为这个规模问题可能是无稽之谈,因为如果你有数百个微服务在运行,你的组织可能会非常有利可图,你可以负担得起“昂贵”的实例来支持内存贪婪的Java应用程序。老实说,有时候我觉得,在2019年,以上五点都是合理的批评,所以我想尝试自费项目来测试一些其他技术。由于我需要进行Web开发而不一定是基于微服务的项目,在快速(非常快速)地查看GO之后,我决定反对这种语言。我认为这是一种很棒的语言(根据我的阅读),但它不适合我当前的项目。所以我看了看Python并开始使用Python,但我需要编写一些JavaScript代码,因为我将使用PuppeteerforPricePaladin(一个价格跟踪和监控工具),在查看了一个非常好的语言比较后我决定使用Node.js.比较语言如果你是Java开发者,你会发现JavaScript并不难学。当你在处理回调时,你肯定会卡住。你会找到Promises,最终,你会使用async-await语法糖来让事情正常进行。也就是说,JavaScript听起来有点奇怪,但今天的JavaScript绝对没问题(正如我之前所说,2015年不是JavaScript)。它简单、强大且简洁。我留下了我对动态类型的所有观察,在我看来,这没什么大不了的。Node.js是单线程的,这是让Java开发者最“震惊”的事情之一。但震惊会在一段时间后消失。您应该考虑在单个线程上运行的所有内容(在任何JavaWeb应用程序上,您都有多个线程),并且回调函数(异步函数)在执行时排队并执行,但所有代码都在单个线程上运行(Node的关键.js的速度和低内存消耗)。从Java开发者的角度来看,这意味着:1.不要运行占用CPU时间的代码,否则一切都会等待CPU空闲后再执行新的排队函数。2.如果出现问题,Node.js崩溃,一切都会崩溃:在web应用程序中,在一个程序服务于多个并发请求的情况下,所有请求都会崩溃。您没有JavaWeb应用程序的隔离。JS相当于SpringBoot生态系统:Express.js、Passport.js、Sequelize如果我们将比较限制在MVCweb应用程序部分,SpringBoot绝对很棒:轻量级、快速、完整和极其可配置。从这个角度来看,与Express.js提供的功能相比,Java开发人员没有任何重大缺点。Express.js也提供了同样的潜力。两种路由是否更好理解,取决于个人品味:不是在Java注释级别定义的,而是在路由文件级别定义的。更一般地说,SpringBoot代表了一种将代码组织到包(模型、服务、控制器)中的非常精确的方法,而在Express.js的上下文中没有这样的指导。尽管如此,类似的代码结构是可以重复应用的,并且经常有代码结构与SpringBoot项目类似的项目。对于身份验证部分,SpringSecurity是一个“黑客工具”……但如果用于一些特别复杂的情况,它也是一个“驯服的野兽”。JavaScript的对应物是Passport.js,它非常强大,但结构和成熟度较低。但是,您觉得它能够处理与SpringSecurity相同的情况和条件。无论如何,该框架还广泛支持开发通用身份验证机制,例如JWT身份验证或其他通用身份验证机制。SpringSecurity的成熟度还比不上Passport.js,但是我觉得SpringSecurity提供的80%的功能也是在Passport.js中实现的,有时更简单。在我看来,Java中的ORM一直是Java应用程序的致命弱点。Java标准大致是Hibernate(虽然有多种选择,但是范围很广,比如Jooq和MyBatis),而对于关系数据库相关的JS世界,最好的库是Sequelize。HibernatevsSequelizeTL;DR:Hibernate仍然是最完整、最成熟、最通用的解决方案,但成本非常高!Sequelize可能涵盖了90%的用例。我不讨厌Hibernate,但我肯定不喜欢它。它设计过度、缓慢且复杂。它就像一头大象。但是,它可以对任何支持的数据库执行任何操作。相反,Sequelize小而简单却无法管理所有用例。我通过使用Sequelize发现的一些事情:1.您将有一个不那么困难,但绝对不那么容易的时间来尝试使用带有snakecases的表领域。您可以手动一一指定它们(但这太过分了),或者您可以使用一些hack将名称转换为蛇形。这是一个简单的解决方案,但缺点是会破坏迁移命令行工具。无论如何,放弃和忽略所有引入由命名约定定义的灵活性的请求是不可接受的。2.不完全支持组合键。正如此处明确指出的那样,“虽然可以在Sequelize中创建复合主键,但Sequelize目前不支持复合外键,因此无法引用具有复合主键的模型/表。”在我看来,这还为时过早。3.由于时区解释(这确实出乎意料),您必须采取一些巧妙的技巧来管理日期字段。4.当一个实例被添加到两个实体(例如Book和Author)之间相关的字段时,该实体被立即保存。这不是什么大问题,但表明Sequelize远没有Hibernate复杂,Hibernate具有决定何时刷新数据的内部机制。在Sequelize中还有一些我喜欢的东西,比如在运行时创建查询的简便性(这很容易,您可以在运行时编写一个JSON对象并将其传递给查询引擎)。尝试在创建JPQL查询时执行此操作,或者考虑使用某些条件使过程复杂化。老实说,当尝试在运行时通过某些字段动态过滤查询时,使用Hibernate和SpringDataJPA是一件痛苦的事情,而在Sequelize中这很容易(应该使用任何框架/语言)。Sequelize与Hibernate一起闪耀的另一个方面是当您遇到一些困难的情况并且需要执行本机查询时:它们都允许您执行本机查询,但老实说,使用Sequelize将结果转换为模型比使用SpringDataJPA/Hibernate更简单。我不是在谈论启动时间:引入Hibernate会增加启动时间,而Sequelize则非常简单。作为一个绝对的考虑,很明显:1.Sequelize比Hibernate成熟得多,2.Hibernate无所不能,而Sequelize只涵盖了90%的用例。3.Sequelize不那么抽象,更容易使用。4.这可能是一个很大的优势,尤其是当你有数据库schema,不用适配遗留数据库,也不打算哪天迁移数据库引擎的时候(老实说,我只看到了一个)案例)数据库迁移在我的生活中,当两家银行决定合并时,因此决定只保留一个IT系统,将陈旧的代码重写到另一个平台上。有成千上万的存储过程需要重写,所以在我看来,代码可移植性在谈论ORM时是一个无用的特性。)***注意事项我目前正在使用所描述的JavaScript堆栈,到目前为止我对它非常满意。PricePaladin(一种价格跟踪和监控工具)是使用上述堆栈构建的,由于内存占用少,目前部署在廉价服务器上。使用JavaScript可以为您带来更高层次的简单性。它是脚本和标准Web开发的理想选择,但我不会将它用于复杂的项目(小型专用和独立的微服务除外),也不会用于具有数字或计数数字的应用程序(例如Java和Java的加密交换),它的BigDecimal类是非常适合该范围)。最终,我在开发服务器端JavaScript时的总体感觉是,一切都比等效的基于Java的应用程序更简单、更简单,尽管我强烈觉得它缺乏稳定性和成熟度。Java中提供的库(仅当特定项目需要某些库时缺乏实用性,否则没有任何区别)。另一种说法是JavaScript开发周期快了大约20%。我的意思是,由于更复杂的代码和过度设计的Java应用程序结构,您在Java中开发相同功能的时间比在JavaScript中花费的时间要多得多。所以,如果应用程序不提供计算或阻塞处理,并且专注于开发经典的小型Web应用程序,我几乎肯定会选择使用描述的JavaScript堆栈进行开发,而在其他情况下,我会使用ProgrambasedIn从长远来看,我认为SpringBoot堆栈提供了更强的可维护性。