NestJS 项目实战 技术选型 (文末附视频)

news2024/11/15 13:43:53

前言

通过上一章的学习,我们了解了网关系统,并且针对要做的功能做了项目架构设计与需求拆解。

那在一个项目正式开发之前,我们还需要做一个技术调研,从开发框架、使用的工具、数据库等等进行一系列的预研,避免在业务开发过程中出现因为技术原因导致完成不了需求的局面。

例如团队中并没有 Java 开发,构建工具使用了基于 Java 的 Jenkins,这个时候想对 Jenkins 有一些技术改造要求无法顺利完成。

本章我们就一起对开发框架数据库的类型做简单的对比与选择。

对于工程中所使用的环境以及中间件配置,感谢后端大佬和耳朵专门写了一篇介绍的文章配合一下,内容非常全面,需要的同学可以点击查看【环境与中间件配置】

技术选型

开发框架选型

市面上常见的网关系统及框架有如下几种。

只是举了一些常见的框架,并未全部列出,还有很多其他优秀的框架可以自行找寻

  • Nginx+Lua:Open Resty、Abtesting Gateway。
  • Java:Spring Cloud Gateway。
  • Go:Janus、Grpc-Gateway。
  • Node.js:Express Gateway、MicroGateway。

上述都是业内成熟的框架以及方案,并且网关系统作为独立于业务的技术中间层,并不存在开发语言与框架的限制,所以可以根据自己团队的实际技术栈选择适合自己团队的网关框架。

但对于前端来说,使用其他语言的成本不低。同时为了更好地理解业务需求,我们并不打算使用市面已经开源或者成熟的框架去搭建一个网关系统,而是使用 JS 来从头搭建一个网关系统。

既然选择了 JS 来开发系统,服务端的开发框架也有很多比如老牌的 ExpressKoa 等,我们选择基于它俩封装的上层框架 Egg 与 NestJs 进行简单对比。

Egg 与 NestJs 对比

首先,我们先看看两家的 Slogan

  • Egg: 为企业级框架和应用而生。
  • NestJS: 用于构建高效、可伸缩的服务端应用程序的渐进式 Node.js 框架。

从 Slogan 上我们可以看出, Egg更关注企业的维度,NestJS 更注重项目这个维度。

接下来是它们的学习体验。首先是 Egg

  1. 文档体验非常棒,毕竟是阿里开源,国人开发的框架,中文文档内容很丰富,使用过程中出现问题,可以很方便地找到对应的内容。
  2. 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习与协同成本。
  3. 使用的总人数虽然不比 NestJS,但胜在国人多,遇到问题可以咨询的人也会多一些。

接着是 NestJS

  1. 中文文档大部分的内容是中文直译,有些内容没有翻译完整或者翻译意境不对。另外,中文版本的内容也会落后英文版本很多,文档资料使用、学习起来会比较麻烦。
  2. 使用总人数虽然比 Egg 更多一些,但是在国内使用的人数不及 Egg,所以很多问题解答中文版本会少于 Egg

技术分析

Egg

  1. Egg 的底层框架是基于 Koa 开发,在性能与开发体验上会比 Express 更优越。
  2. 可选用 JS 以及 TS 开发,两者都是基于 Classify 开发,对刚接触服务端开发的前端更友好。
  3. 约定优于配置,减少开发负担、学习以及协作成本。
  4. 高度可扩展的插件机制,可以方便定制插件。
  5. 内置集群:使用 Cluster,自带进程守护、多进程以及进程间通讯等功能。

NestJS

  1. NestJS 的底层框架是基于 Express 开发的。
  2. 除了 Express 之外,NestJS 也支持使用 Fastify 作为底层框架。因为 NestJS 的设计理念本身就是一个框架适配器,其主要功能是代理中间件和处理器到适当的特定库应用中,从而达到框架的独立性。
  3. TS 编程并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素,学习成本会高于 Egg,对新手前端友好度不高,再加上文档缺陷,劝退概率倍增。
  4. 模块加载方面使用 IoC 模式:模块容器 - 依赖注入(通过装饰器和元数据实现),开发效率以及维护性会更高。
  5. 整个框架的配套功能非常完善例如:鉴权、文档、微服务、CLI 工具等。

综合对比

NestJS 提供了更多的选择,更加自由以及更偏向后端开发的体验,而 Egg 作为深度定制过的框架,自定义的程度会弱于 NestJS,在团队初期快速开发业务的时候非常适合。

上述对比并不代表两个框架一定有个高下之分,针对于团队、项目的不同时期,开发人员的能力、喜好,哪一种框架能发挥最大价值,它就是当前对你来说最好的框架。

此外,使用 Egg 来对比 NestJS 并不是非常合适,两者的设计模式上有差别,理论上应该用另一款 IoC 框架 Midway 来对比,不过在 DevOps 小册中我们使用 Egg 作为开发框架,所以这本小册优先使用了 Egg 作为选型对比。

数据库选型

数据库部分,我们主要对比 MySQL 和 MongoDB

MySQL 作为典型的关系型数据库,支持单点、集群部署架构,成熟度非常高。它作为开源数据库拥有非常全的文档与社区资源,出现问题能快速获得对应的帮助,后端首推数据库之一。

但是对于复杂读写操作,需要组合索引查询多表,对性能消耗不小,需要做读写分离或者表结构拆解,对业务架构设计要求比较高。

MongoDB 是非关系型数据库、nosql 的代表作。它可以通过副本集、分片实现高可用,在集群架构拥有十分高的扩展性,但要实现这种高可用对运维的要求比较高。

MongoDB 数据处理方式 是基于内存的,将热数据存在物理内存中,从而达到高速读写。由于性能出色,一般用在博客、内管管理等大数据存储的系统中较为合适。

总的来说,这两种数据库各有千秋,我们要根据不同的项目需求来选择合适的数据库。

在之前的架构设计中,我们一共需要开发 3 个系统,其中物料系统除了需要保存物料的版本信息之外,还需要存储 HTML 这种内容数据,所以在物料系统中使用 MongoDB 无疑是非常好的选择常规的项目如用户中心,针对于权限的管理非常复杂,所以选择 MySQL 使用多表关联来存储数据更为合适。

但是用户中心使用 MySQL 作为数据库的话,用户登录信息这种共用的数据就不可能保存在每个 pod,而且频繁的读取 MySQL 也不太实际。这个时候就需要使用 Redis 来做统一缓存,弥补关系型数据的缺陷。Redis 是一个高性能的 key-value 数据库,一般常用于业务数据缓存的操作。

写在最后

本章主要针对项目需求对技术选型做了一些介绍,对于 Egg 与 NestJS 的篇幅介绍较多,毕竟小册主要还是围绕 NestJS 展开的,其他工具详细的介绍与使用会在对应的篇幅再拓展。

此外,一个团队对技术的选择除了适配业务需求,也要考虑团队的整体水平与技术栈。例如,在团队后端的开发语言使用的是 Go,那么 CICD 工具选择 Jenkins 显然不是最优的选择,要考虑到使用与后期维护的问题。同样如果团队水平梯度不高的情况下,没有必要一定强上 NestJS,可以优先选用 Egg 这种对前端体验友好的框架,后期过渡升级到 Midway 也是合理的技术规划。

如果你有什么疑问,欢迎在评论区提出或者加群沟通。 👏

NestJS 项目实战 - CookieBoty - 掘金小册从 0 搭建网关系统,玩转 NestJS 开发。「NestJS 项目实战」由CookieBoty撰写,2309人购买https://s.juejin.cn/ds/kb86fX9/

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

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

相关文章

嘿~ 基于分布式架构的技术交流社区(WhiteHoleV0.7)即将竣工!

文章目录前言项目介绍WhiteHole期望立项作者功能/模块简介用户模块问答模块社区模块博文模块Next前言 拖更,拖延了这么久,耗时超过3个月的项目,WhiteHoleV0.7 版本即将迎来最后的收尾工作。当然考虑到服务成本,和开发进度&#x…

【以太网硬件十九】SGMII到底能不能直接出光模块?

SGMII接口到底能不能直接出光模块?先说结论:我认为可以,但是有限制,此时的光口只支持强制模式,不支持自协商。如果对端是1000base-X接口,对端也需要把自协商关闭才能与SGMII直出的光口建立连接。为什么SGMI…

你是真的“C”——C语言详解求素数n种境界~

详解C语言函数模块知识(下篇)😎前言🙌必备小知识~😘C语言详解《试除法》求解素数🙌试除法第一层境界~ 😊试除法境界2~😊试除法境界3~😊试除法境界4~😊C语言详解《筛选法》…

为何限制英伟达出售GPU芯片?中国的AI技术领先,让美国怕了

2022年下半年美国突然要求GPU芯片领军者NVIDIA停止对中国出售高端GPU芯片,此举让人疑惑不解,近期日本媒体《日本经济新闻》与荷兰的一家学术信息巨头的分析给出了答案,中国在AI技术上已领先于美国,而NVIDIA的高端GPU芯片有助于中国…

Web端即时通信技术-WebSocket

最近在做项目的时候,遇到了一个前端页面需要实时刷新的功能,一种方法是我们通过短轮询的方式,但这种方式虽然简单,但是无用的请求过多,占用资源,并且如果是对数据要求高较高的场景,就不适用了。…

汽车ECU软件开发之应用层软件与底层软件

随着汽车产品日渐趋向电子化,人们对各类先进的安全系统、高级驾驶辅助系统的接受程度日益提升。而原本昂贵的盲点检测、自动紧急制动等功能的成本下滑,使其快速获得了市场青睐。富士奇美拉研究所(Fuji Chimera Research Institute&#xff09…

MySQL算术/比较/逻辑/位/运算符与正则全解

文章目录1. 算术运算符加法与减法运算符乘法与除法运算符求模(求余)运算符2. 比较运算符等号运算符安全等于运算符不等于运算符非符号类型的运算符空运算符非空运算符最小值运算符最大值运算符BETWEEN AND运算符IN运算符NOT IN运算符LIKE运算符ESCAPEREG…

〖金融帝国实验室〗(Capitalism Lab)v8.2.00官方重大版本更新(2023.01.17正式发布)

〖金融帝国实验室〗(CapLab)v8.2.00正式发布! ————————————— ※v8.2.00更新内容摘要: 1.新增生活服务业:快餐店、比萨店、蛋糕店和咖啡店。 2.可以通过在农场周围购买土地并耕耘来实现产能扩容。 3.…

九龙证券|重磅会议召开,工信部强调推进民爆行业高质量发展

工信部强调推动民爆职业高质量开展,民爆概念股午后拉升。 工业和信息化部举行 民爆职业安全出产视频会议 据工信部网站,1月17日,工业和信息化部举行民爆职业安全出产视频会议。 工业和信息化部副部长徐晓兰表明,部党组对安全出…

【Linux操作系统】环境变量和命令行参数

文章目录一.环境变量1.什么是环境变量?2.windows下配置PATH环境变量的原理3.一览常见的环境变量4.指令方式如何查看环境变量5.PATH-存放系统默认搜索路径的环境变量6.两种方法使运行我们写的可执行程序不带路径二.环境变量和本地变量三.和环境变量相关的命令1.echo:…

元组的操作

1 元组的定义: 元组就是用一对小括号括起来的多个元素的有序集合,个元素之间用逗号隔开。 2 元组的创建: 2.1 使用()创建元组对象。例:lt(12,34,"one") 2.2 使用内置方法tuple创建元组对象。…

mysql 为什么说加上了索引,查询速度就快了呢?(文末附视频)

一天,老板跟我们提出说网站访问的速度太慢,要求我们尽快优化一下。我赶快去查询了一下,发现有几条 SQL 查询的时间异常,我相信这个时候很多小伙伴的大脑里浮现出来的第一个解决办法就是:加索引。 那么到底什么是索引呢…

字符加密-C语言实现

任务描述 请编写程序将一串5个字符组成的英文字符串译成密码,规则为:例如,将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母A后面第4个字母是“E”,用“E”…

虚拟电厂负荷控制系统三维可视化监控 | 数字孪生

随着国家“双碳”及“构建以新能源为主体的新型电力系统”等目标的提出,清洁化、数字化越来越成为电力系统面临的迫切需求,负控系统的发展对电力营销现代化建设具有重要的意义。负控管理系统是一个着眼于全面加强电力信息管理的,集负荷控制、…

FMC子卡设计方案原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡

FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡一、产品概述 ADRV9002 是一款高性能、高线性度、高动态范围收发器,旨在针对性能与功耗系统进行优化。该设备是可配置的,非常适合要求苛刻、低功耗、便携式和电池供电的设备。ADRV9002 的工作频率为 …

我的2022年度总结

今天是腊月廿七,又到了写年度总结的时候了,这是写年度总结的第七个年头,希望可以一直坚持写下去。今年是新冠疫情的第三年,疫情管控结束了,同时疫情流行也开始了。我在北京刚全面放开的时候就阳了。用了差不多一周多的…

Go 语言就是在“面向未来”学习(文末附视频)

你好,欢迎学习 Go 语言! 我们知道,Go 程序设计语言是由 Robert Griesemer、Rob Pike、Ken Thompson 主持,于 2007 年末开始开发的全新高级编程语言。在 2009 年 11 月开源,并于 2012 年发布了第一个稳定版本&#xff…

基于OpenCv的人脸识别,翻车了居然识别错误。

前言 我们身边的人脸识别有车站检票,监控人脸,无人超市,支付宝人脸支付,上班打卡,人脸解锁手机。 人脸检测是人脸识别系统组成的关键部分之一,其目的是检测出任意给定图片中的包含的一个或多个人脸&#xf…

23种设计模式(十)——原型模式【对象创建】

原型模式 文章目录 原型模式意图什么时候使用原型真实世界类比原型模式的实现原型模式的优缺点亦称:克隆、Clone、Prototype 意图 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。这就是原…

Tailscale 开源版中文部署指南

目前国家工信部在大力推动三大运营商发展 IPv6,对家用宽带而言,可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址,也是个大内网地址,根本不是真正的公网 IP,访问家庭内网的资源将会变得越来越…