为了“降本增效”,我用AI 5天将SpringBoot迁移到了Nodejs

news2025/3/15 14:45:39

图片

背景

大环境不好,各行各业都在流行“降本增效”,IT行业大肆执行“开猿节流”,一顿操作效果如何?普通搬砖人谁会在乎呢。

    为了收紧我的口袋,决定从头学习Nodejs+TypeScript,来重写我的Java后端服务。

    其实这波操作并不是仅仅为了实操Nodejs,更主要的原因是为了运行我的几个Java项目,服务器开支还是有点超预期了。其中最主要的原因就是Java开发的服务太占用系统内存了。

    我目前自己开发的项目有:易登、易支付、云仓库管、AI BOT、记忆旅途博客、万巷聚合推广平台,这些一个个Java作为后端服务的项目让我不得不买了两个云服务器,一年成本着实不小。

    我最开始做的是记忆旅途博客,当时1C2G的服务器足够了。但是随着需求的增多,相关项目也就一个个拔地而起。根据统计平均每个项目占用内存600MB左右,看的我心里真是有点着急。虽说的主业就是Java开发,但是在money面前,我还是通过一次次的比对,决定要重写一部分项目,来减轻我的内存负担。

技术选型之路

    为了达到内存减负目的,我对比了很多个后端技术,对比的维度有:上手难度、生态丰富度、在工作中的使用度、对内存消耗等几个方面;调研的技术有:Python、Nodejs、Golang,俗话说没有最好的只有最合适的。经过对比最终选择了Nodejs作为新的后端开发语言来进行重写。

    最终选择Nodejs的原因有以下几点:

    1. 使用Nodejs编程,最终使用的是JavaScript脚本语言,虽然我本职不是前端开发,但工作中经常在使用JavaScript,可以说是我的第二编程语言,上手起来难度最小,几乎拿来即用。

    2. Nodejs有一个最大的优点就是单线程和非阻塞IO可以处理大量并发请求。我的这几个网站基本都IO密集型网站,Nodejs的优点完全可以得到最大发挥。

    3. Nodejs生态相对非常完善,基于庞大的npm生态,开发起来更加高效。

    4. Express Web服务开发框架,使得开发web应用更加得心应手。

    5. 最主要的是Nodejs占用内存真的少,对比之后,实现相同的功能只需要90MB左右的内存,跟Java的600MB相比,看着大大的欣喜。

Nodejs后端开发技术学习

    简单说只需要JavaScript基础就可以进行开发了,但是工欲善其事必先利其器,完全使用原生JS开发效率肯定大打折扣。为此花了一天多的时间学习了以下几个技术:

    1. TypeScript:原因是因为JavaScript是弱类型的脚本语言,字段类型太过灵活,是把双刃剑。作为Java出身的程序猿还是比较容易接受静态类型和面向对象的编程方式。而TypeScript作为JS的超集,完全兼容了JS的语法,又进化出了面向对象、静态类型等高级特性,Java Boy看了喜上心头。主要学了相关语法,其实跟Java还是比较像的,用起来也比较亲切。

    2. Express web开发框架:相当于Java中的SpringBoot,将web开发难度降到了极致,开发效率得到了成倍的提升。这个框架主要是看了如何使用的和请求中的各种类型参数如何获取、处理。

    3. Sequelize:数据库ORM框架,用来提升数据库交互开发效率,相当于Java中的Hibernate、Mybatis。这个框架基本不用学,只需要看下如何连接数据库、字段映射,其它的单表查询语法只需要了解即可,具体用的时候知道有相对应的的东西,不知道如何用直接查官方文档即可。直接使用sql进行的基本查询更不在话下。

    4. Redis-connect:redis相关操作类库。主要看了如何连接redis,具体操作跟Java基本一致。

    5. PM2:PM2 是一个守护进程管理工具,帮助您管理和守护您的应用程序。由于Nodejs是单进程、单线程的,导致的严重后果就是如果程序运行过程中有异常处理不当,整个程序直接就挂掉无法提供服务了。使用PM2的原因就是它可以守护这个Nodejs进程,当发现进程出现异常后,可以自动重启,不至于直接宕机。

重写之旅

    相关技术进行了储备之后,就要开始项目的重写了。重写工程不会是一蹴而就,先选了一个功能点相对少的“万巷”进行重写。

    这里的重写也可以说是翻译,将Java语言翻译成TS语言。翻译是有窍门的,放到前几年估计没有好办法,只能一个个代码自己手敲。但今非昔比,在这个“无AI,不创业”的年代,翻译的工作就相对轻松了许多。直接对着AI这么说:

图片

    可以看出,这个接口的Controller基本就翻译过来了,当然具体的实现逻辑还需要再做调整,如果一个Controller有十几二十个接口,AI这么一帮忙,省了大把的时间。

    AI对数据库实体类的翻译更是高效,来看一个例子:

图片

图片

    翻译结果并没有达到预期,因为如果字段上没有@Column字段,ORM框架查出来的数据是不能映射到实体类中的。我们可以调整一下提示词: 

图片

图片

    提示词经过这么修改之后,AI生成的代码基本就是可用的了,即使还有需要调整的部分,也是微调即可了。如果数据库有几十张表,靠手码代码来翻译这些实体类,估计内心是非常绝望的。

    剩下的就是具体逻辑的实现了,也是可以让AI来辅助进行翻译的,如果效果差不多,仅需要微调就行了;如果效果相差甚远,就需要自己来手动翻译了。

总结

    1. 编程思想是互通的。虽然编程语言语法、实现形式、技术路线各有千秋,但是编程的思想是相通的。学通了一种编程语言,其它语言很多能触类旁通,比如你是一个技术还可以的java boy,当你去阅读其它编程语言的代码,可能看着语法很奇怪,但是有些逻辑还是能捋出来的,即使让你用那种语言写不出来。

    2. 技术没有优劣,只有合不合适。技术实现千千万万,但在不同领域、不同业务中各有优劣。很流行的一句话“PHP是最好的语言”,很调侃的一句话,但也说明了PHP有那么一段时期对彼时的多数业务是适用的。但正所谓时势造英雄,近年来的人工智能领域python正大范围落地、云原生领域Go正大行其道。技术选型不能迷信,合适的就是最好的。

    3. 拥抱AI。不同于元宇宙、区块链当初被吹得神乎其神,最终一切沉寂于海底,AI正在切切实实影响和改变着我们每个人的生活,未来会有更多生活场景接入AI。元宇宙和区块链热度低了很多,但并不是它们技术上不行,只是离普通人太远了。而AI则不同,它已经深深嵌入我们日常生活中,你有意、无意能感受到的。

    身处IT界,有一句看似“谣言”的话:人工智能越来越智能之后,以后就没有程序员这个行业了。个人感受,如果真的因为人工智能导致程序都由机器来生产,可能到那时也就不需要人类这个物种了。但未来谁又能说得准呢?当ChatGPT凌空出世时,多少人被惊叹出了“哇”,我是其中一个,第一次用的时候真的很震惊,但在ChatGPT发布的前一天,又有几个人会知道明天会出现这么一个惊艳的东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ECharts】数据可视化

目录 ECharts介绍ECharts 特点Vue2使用EChats步骤安装 ECharts引入 ECharts创建图表容器初始化图表更新图表 示例基本柱状图后台代码vue2代码配置 组件代码运行效果 基本折线图示例代码组件 基础饼图示例代码后台前端配置组件运行效果 其他 ECharts介绍 ECharts 是一个由百度开…

找不到msvcr110.dll无法继续执行代码的原因分析及解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是找不到msvcr110.dll文件。这个错误通常发生在运行某些程序或游戏时,系统无法找到所需的动态链接库文件。为了解决这个问题,下面我将介绍5种常见的解决方法。 一&#…

重学java 44.多线程 Lock锁的使用

昨日之深渊,今日之浅谈 —— 24.5.25 一、Lock对象的介绍和基本使用 1.概述 Lock是一个接口 2.实现类 ReentrantLock 3.方法 lock()获取锁 unlock()释放锁 4.Lock锁的使用 package S78Lock;import java.util.concurrent.locks.Lock; import java.util.concurrent.lo…

类与对象:接口

一.概念 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。 二.语法规则 与定义类相似,使用interface关键词。 Idea可以在开始时直接创建…

【控制实践——二轮平衡车】【三】基于PID的直立控制

传送门 系列博客前言直立运动分析基于PID控制器的直立控制角度环控制角速度控制总结 电机转速的控制前言电机转速控制 结语 系列博客 【控制实践——二轮平衡车】【一】运动分析及动力学建模 【控制实践——二轮平衡车】【二】实物设计和开源结构&代码 【控制实践——二轮…

常见 JVM 面试题补充

原文地址 : 26 福利:常见 JVM 面试题补充 (lianglianglee.com) CMS 是老年代垃圾回收器? 初步印象是,但实际上不是。根据 CMS 的各个收集过程,它其实是一个涉及年轻代和老年代的综合性垃圾回收器。在很多文章和书籍的划分中&…

Scrapy顺序执行多个爬虫

Scrapy顺序执行多个爬虫 有两种方式: 第一种:bat方式运行 新建bat文件 cd C:\python_web\spiders\tiktokSelenium & C: & scrapy crawl spider1 & scrapy crawl spider2 & scrapy crawl spider3 & scrapy crawl spider4 第二种&a…

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

windows 11上自带时间管理-番茄工作法

在 Windows 11 中,你可以使用 专注 功能来最大程度地减少干扰,帮助你保持专注。 专注的工作原理 专注时段打开后,将会出现以下情况: 专注计时器将显示在屏幕上 请勿打扰将打开 任务栏中的应用不会闪烁发出提醒 任务栏中应用的…

MySQL 8.4.0 LTS 变更解析:I_S 表、权限、关键字和客户端

↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ MySQL 8.4.0 LTS 已经发布 ,作为发版模型变更后的第一个长期支持版本,注定要承担未来生产环境的重任,那么这个版本都有哪些新特性、变更,接下来少…

UIKit之猜图器Demo

需求 实现猜图器Demo 功能分解: 1>下一题切换功能 2>点击图片后能放大并背景变暗(本质是透明度的变化)。再次点击则缩小,删除暗色背景。 3> 答案区按钮点击则文字消失,选择区对应文字恢复。 4> 选择区…

python爬虫登录到海康相机管理页面

简述 1.最近接到个任务是在管理页面更改相机的某个参数,下载官方的sdk貌似没有提供这个接口,所以只能自己写爬虫登录发请求了。 1.主要步骤 1.1 发送get请求获取到salt,sessionID,challenge等信息 http://admin:123456192.168.…

将 MOV 转换为 MP4 的 10 个最佳工具

在当今的数字时代,内容创作和消费正处于巅峰,对多功能和兼容媒体格式的需求从未如此之高。在众多可用的视频格式中,MOV 和 MP4 因其在各种设备和平台中的广泛使用而脱颖而出。然而,将 MOV 文件转换为更通用兼容的 MP4 格式的需求已…

OZON的物流有哪些,OZON物流Unitrade

随着跨境电商的快速发展,OZON作为俄罗斯领先的电商平台,其物流服务的重要性不言而喻。对于卖家而言,选择合适的物流合作伙伴,不仅关乎商品的运输效率,更直接关系到店铺的口碑和消费者的购物体验。本文将带您深入了解OZ…

傲软抠图一款专为抠图打造的AI智能抠图应用,智能识别人物物体抠图软件,无广vip版 v1.8.1

软件介绍 傲软抠图,作为一款高度专业化的智能人工智能图片处理软件,被设计专门用于执行精确的图像提取功能。该程序利用其先进的算法能动地识别和分辨图像中的人物或物体轮廓,并能够从原始图片材料中分离出带有透明背景的目标图像。除了自动…

容器化:ES和Kibana

1 缘起 最近在学习使用ES, 为了找一个功能强大的可视化工具,之前使用了ES-Head,可以满足学习需求。 闲暇时间又折腾了另一个工具Kibana, 分享如下。 Kibana优点: 用户友好性:Kibana提供直观易用的用户界面…

IC卡水表抄表是什么?什么叫IC卡水表抄表?

一、什么叫IC卡水表抄表 IC卡水表抄表是一种现代化水资源管理方法,主要是通过集成智能IC卡科技的水表开展计量检定和传送数据。用户在预付模式中,根据IC卡在线充值后再用,用水量会自动保存在卡上,大大提高了抄表效率精确性。 二…

机器学习预测-CNN手写字识别

介绍 这段代码是使用PyTorch实现的卷积神经网络(CNN),用于在MNIST数据集上进行图像分类。让我一步步解释: 导入库:代码导入了必要的库,包括PyTorch(torch)、神经网络模块&#xff0…

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

0 工具准备 1.STM32CubeMX1 前言 本文介绍基于STM32CubeMX,使用stm32h743xi的对FDCAN2进行配置的方法。 2 初始化代码生成 2.1 选择FDCAN引脚 本例选择PB5、PB6作为FDCAN2的RX、TX引脚。 2.2 选择FDCAN时钟源 本例选择PLL2Q作为FDCAN时钟源,频率…

Redis(1)-Jedis连接配置

问题 阿里云安装并启用Redis后,尝试在本地用Jedis调用,发现报错 public class Jedis01 {Testpublic void connect(){Jedis jedis new Jedis("101.37.31.211", 6379); // 公网ipjedis.auth("123"); // 密码String ping jedis.pin…