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

图片

背景

大环境不好,各行各业都在流行“降本增效”,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.mzph.cn/diannao/15342.shtml

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

相关文章

浅谈面向对象--知识补充

This关键字 this 内存图 this关键字表示当前对象本身,一般用于类的内部,其内部存在一个地址,指向当前初始化的对象本身。 当new一个对象时,实际上产生了两个引用,一个是供类Dog内部调用其成员变量和成员方法的this关键…

kotlinx.coroutines.debug.AgentPremain

大家好 我是苏麟 . 项目引入AI大模型 debug 出现报错 设置 勾选

配置docker阿里云镜像地址

一、安装docker的步骤: 1.yum install -y yum-utils 2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo --配置阿里云仓库3.yum makecache fast4.yum install docker-ce -y5.docker version …

Vue3实战笔记(43)—Vue3组合式API下封装可复用ECharts图表组件

文章目录 前言一、封装echart图标钩子二、使用步骤总结 前言 接上文,已经安装好了ECharts,开始封装组件方便使用。 一、封装echart图标钩子 首先应用我们之前学习的钩子方式,在hooks目录下创建一个名为 useECharts.js 的文件,用…

【机器学习300问】97、机器学习中哪些是凸优化问题,哪些是非凸优化问题?

在机器学习的领域中,多数模型的参数估计问题实质上可以转化为优化问题。鉴于机器学习模型的多样性,不同的模型会对应着不同的损失函数,进而形成各具特色的优化问题。了解优化问题的形式和特点,对于提升我们求解模型参数的效率和准…

微信好友这样打标签更高效!

为什么要做标签管理? ① 通过标签管理,可以清晰的知道每个私域好友的关系程度,如哪些是忠诚客户,哪些是意向客户,哪些是刚加上的客户等等。 这样就知道下一步要怎么操作,做到精细化运营。如忠诚客户跟进维护&#x…

Embedding 模型的选择和微调

目录 引言 向量模型在 RAG 系统中的作用 1. 对 query 和 私域知识 进行向量化表示 2. 动态更新知识库 3. 数据隐私和安全 有哪些性能不错的向量模型 OpenAI Embedding JinaAI Embedding BAAI/bge Embedding 模型评测 MTEB 排行榜:https://huggingface.co…

第十六节:带你梳理Vue2: 生命周期与钩子函数

前沿: 通过前面几节的学习,我们已经对vue有了初步的了解,大致了解了vue可以帮我们干什么, 那么接下来我们就来看看vue的生命周期和它常用的钩子函数, 1. 理解生命周期的含义 生命周期:就是一个组件从实例化创建并添加到DOM树开…

读论文 | Small object detection model for UAV aerial image based on YOLOv7

目录 1、前言 2、摘要 3、论文的方法 3.1 方法描述 3.2 方法改进 3.3 本论文的模型图 3.4 本文的数据集: 3.5 论文实验 3.6 解决的问题 3.7 论文总结 (1)文章优点 (2)方法创新点 (3&#xff0…

地质考察AR远程交互展示系统辅助老师日常授课

广东这片充满活力的土地,孕育了一家引领ARVR科技潮流的杰出企业——深圳华锐视点,作为一家专注于VR/AR技术研究与业务开发的先锋公司。多年来,我们不断突破技术壁垒,将AR增强现实技术与各行各业的实际需求完美结合,助力…

Cloneable接口和深拷贝

在java中如何对对象进行拷贝呢?我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候,需要注意: 1.需要重写clone方法; 2.clone方法的返回值是Object类,需要强制类型转化&#xf…

部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

阅读笔记——《ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing》

【参考文献】Natella R, Pham V T. Profuzzbench: A benchmark for stateful protocol fuzzing[C]//Proceedings of the 30th ACM SIGSOFT international symposium on software testing and analysis. 2021: 662-665.【注】本文仅为作者个人学习笔记,如有冒犯&…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上,我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

力扣--字符串58.最后一个单词的长度

思路分析 初始化变量: num 用于记录当前单词的长度。before 用于记录上一个单词的长度。 遍历字符串: 如果字符不是空格,增加 num 计数。如果字符是空格,检查 num 是否为 0: 如果 num 为 0,说明之前没有记录到单词,所以…

嵌入式学习——3——UDP TFTP简易文件传输

tftp协议概述 简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输 特点: 是应用层协议 基于UDP协议实现 数据传输模式 octet:二进制模式(常用) mail:已经不再支持 TFTP通信…

Qt学习记录(14)线程

前言&#xff1a; 我的臀部已经翘到可以顶起一屁股债了 为什么要使用线程 什么时候用线程 复杂的数据处理 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>//定时器头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; }…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

【大数据】MapReduce JAVA API编程实践及适用场景介绍

目录 1.前言 2.mapreduce编程示例 3.MapReduce适用场景 1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。 书接上文&#xff0c;本文将会继续聊一下mapr…

光源亮度检测应用笔记

光源亮度检测应用笔记 光电检测应用光电二极管等效模型和基本参数连接并联电阻&#xff08;RJ&#xff09;串联电阻&#xff08;RS&#xff09;结电容&#xff08;CJ&#xff09;暗电流&#xff08;ID&#xff09; 光电二极管电流-电压转换器无源光电二极管电流-电压转换器有源…