NestJS 项目实战 需求分析(文末附视频)

news2024/9/22 14:32:11

前言

一般常规的项目立项之初会有一份 MRD(Market Requirements Document,市场需求文档)用来判断产品的必需性以及价值等。

对于基础项目开发来说,使用 MRD 可能有些重量级,但我们也需要对一个新的基建类型项目做一个简单评估,包括研发必需性、投入的成本以及产生的价值等等。有些轮子是必造,而有些轮子不是。

这一章,我们就来探讨一下:你的团队需要一个网关系统吗?

应用场景

对于现在主流的后端架构来说,微服务的普及范围还是比较广的,毕竟巨石项目的维护与开发都不太灵活。

以电商服务为例子来说,一个系统可以拆分成用户、交易、订单、商品、活动等多个功能模块,如果全部的功能都维护在一个项目里面,某些可以公用的模块(例如用户、权限等)就没办法共享给其他项目,项目的体积与代码复杂度也会逐步上升,导致后期维护与协同的成本会逐步增加。

但上述缺点都不是最主要的问题,最主要的问题是所有功能都放在一个系统里面开发部署,其中任意一个模块出现了问题都可能会导致整个系统雪崩

对于一个应用的稳定性来说,如果没办法对单一的模块做熔断、升级、回滚等操作,线上不可控的概率极大,这也是目前主流采用微服务架构最大的原因之一

但是,当一个系统的微服务模块数量非常多的情况下,也经常会出现以下问题:

  1. 通用性的认证、鉴权、限流等功能会导致每个微服务都存在造轮子的行为;
  2. 业务复杂度上升之后,存在域名分配的问题,没办法对每个服务都分配一个新的域名,同时每一个新的服务上线,运维重复配置的工作量多不少;
  3. 太多的域名服务对客户端并不友好,特别是请求层没有做 BFF 的话,每一次拆分新的微服务出来都可能会引起前端的改造;
  4. 并非每个服务都是同一种语言或者框架所开发,前面提到的公共的插件并不能满足所有的服务,这个情况可能在 DevOps 系统中比较常见。

为了解决上述的问题,网关系统随之诞生。我们可以通过网关的统一入口来调度各个微服务功能模块,使得每个微服务可以关注于自身的业务功能开发。

什么是网关系统(Gateway)

网关系统根据请求类型可以分为

  1. 静态资源网关:处理前端资源数据包括 CSRSSR 等;
  2. API 网关:随着微服务架构(MSA)的普及,通过统一的 API 网关可以聚合所有零散的微服务资源,保持统一的出入口,降低多项目的接入成本以及其他项目的使用成本。

从功能属性上可以分为

  1. 流量网关:无关业务属性,单纯做安全(黑白名单)、分流(负载均衡)等;
  2. 业务网关:用户(认证、鉴权)、服务稳定性(降级、容灾)、业务属性灰度、代理(资源代理、缓存)、统一前置(日志、数据校验)等。

所以,市面上常见的网关系统除了提供请求聚合功能之外基本都包含所有通用功能:

  • 认证(验证登录态,一般不做鉴权)
  • 分流
  • 代理(静态资源、API 等)
  • AB test (流量灰度,一般根据 IP 或者用户信息灰度)
  • 缓存(成本不低,看看就行)
  • 等等

Gateway 功能拆解

通过上面对网关系统的简单了解和分析,我们能够知道,拥有网关系统对团队技术的价值贡献不小。那么如何实现一个网关系统呢?接下来,我们可以根据自己团队情况与需求,对将要实现的网关功能进行拆解,方便后期业务开发。

前文也提到了,业务网关最大的价值是与微服务架构的配合,如果后端服务没有使用微服务架构,网关的价值会打一定的折扣,所以具体是否需要网关服务还是需要结合团队的架构设计来考虑。同时在需求拆解的过程中要考虑侧重点,例如当前只需要完成前端静态资源转发就没必要去开发后端 API 转发的逻辑,可以把架构设计方案做大一点,后面有需求方便拓展,但没必要一次性全部做完,从团队的角度来考虑,寻求 ROI(投资回报率) 的最大化。

Nginx

Nginx 作为专业的 WEB 代理服务器,在代理方面能够提供负载均衡、流量切换等功能,脚本语言也有 lua 支持。

那么 Nginx 做不到什么呢?

  1. Nginx 作为专业的转发服务器,对 Session 以及 Cookie 的处理比较弱。
  2. Nginx仅仅支持 HTTP 协议(Email 不算常用功能)。
  3. 虽然可以通过 Lua 脚本来处理一些拓展的功能,但是 Lua 脚本的变更以及修改 Nginx的配置都需要重新启动无法做到热更新,比较麻烦。
  4. 没有可视化管理界面也是一个比较大的硬伤(开源的有一些可视化配置项目,但跟可视化管理有一定的区别与差距)。

Gateway

业务性的 Gateway 需要做点啥:

  1. 统一鉴权收口,通过统一配置给接口资源添加权限;
  2. 支持 RPC 微服务调用,减少资源消耗;
  3. 系统易于监控,同时可以采集收口进来的信息。

通过两者的对比可以看出,Nginx 更关注负载均衡以及反向代理,对业务部分的侵入很低,而 Gateway 作为后端应用,可以携带业务属性,两者可以很好的互补。

在系统架构设计上,我们可以使用 Nginx 作为上文所说的流量网关,由 Nginx 做一层流量代理,通过负载均衡到 Gateway 做业务层的转发处理,这样可以减少我们自建网关系统的工作量。

我们的网关系统设计

一个完整的网关系统是大而全的,接下来我们将挑选几个比较常见的模块来完成自研 Gateway 开发(如果目前团队欠缺或者自己有需求的话,可以接着使用 demo 项目继续优化,拓展需要的模块,达到理想可用的状态):

由上图可以看出,我们的网关系统架构可以分为两大模块,分别是代理转发的基础模块以及独立的用户模块

  • 网关基础服务

因为流量入口已经有 Nginx 作负载均衡,我们网关的基础服务就可以专注于代理模块的开发:

  1. 专注于前后端资源分发以及不同类型的项目 API 分发;
  2. 常用资源缓存模块;
  3. AB Test 模块;
  4. 通用日志模块。
  • 统一用户中心系统

用户系统需要提供的功能有:

  1. 用户登录、认证等基础功能;
  2. 权限系统(基于 RBAC 包括角色、系统、资源等权限控制)。

如果当前团队中没有统一用户中心的话,建议将用户中心系统优先级提高,作为第一优先级的基建项目,完成之后可以赋能给予其他后端项目用户登录、鉴权的功能,可以减少其他后端基建的很多重复工作量。

  • 物料系统

物料系统主要是针对于静态资源的管理,一般物料系统会跟 DevOps 体系关联比较大,毕竟物料会涉及构建部署的过程,但我们的主题并不是 DevOps,所以物料系统在小册的占比不会很高,只是作为一个辅助类型的项目为网关服务提供静态资源路由的配置、资源版本的管理等功能。

写在最后

本章主要针对网关系统的必要性做了简单分析,介绍了网关系统应用的场景以及网关的类型、作用等,最后针对我们要做的系统进行架构设计与功能拆解。

按照一个完整的项目迭代来说,在架构设计与需求模块都敲定之后,接下来就需要开发同学出技术方案进行项目开发,所以下一章我们将对技术方面的内容进行设计与规划。

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

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

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

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

相关文章

【快速幂】875. 快速幂

875. 快速幂 文章目录题目描述输入格式:输出格式:数据范围输入样例输出样例方法:快速幂解题思路代码复杂度分析:题目描述 给定 nnn 组 ai,bi,pia_i,b_i,p_iai​,bi​,pi​,对于每组数据,求出 aibimodpia_i…

Numpy常用random随机函数

Numpy常用random随机函数 seed 向随机数生成器传递随机状态种子 只要random.seed( * ) seed里面的值一样,那随机出来的结果就一样。所以说,seed的作用是让随机结果可重现。也就是说当我们设置相同的seed,每次生成的 随机数相同。如果不设置…

冯 • 诺依曼体系结构与操作系统

目录 一、冯 • 诺依曼体系结构 1.1 冯 • 诺依曼体系结构推导 1.2 内存提高效率 1.3 具体案例理解冯 • 诺依曼体系结构 1.4 其他认识 二、操作系统 2.1 操作系统概念 2.2 操作系统的上下层 2.3 管理理念:先描述,再组织 一、冯 • 诺依曼体系结构 1.1 冯 …

Acwing - 算法基础课 - 笔记(数学知识 · 四)(补)

数学知识(四) 这一小节讲的是容斥原理和简单博弈论。 容斥原理 定义 最基本的,假设有3个两两相交的圆。那么三个圆所覆盖的面积大小为 S1S2S3−S1∩S2−S2∩S3−S1∩S3S1∩S2∩S3S_1S_2S_3 - S_1 \cap S_2 - S_2 \cap S_3 - S_1 \cap S_3…

【JavaEE】如何开始最基础的Servlet编程(借助Tomcat实现)

什么是Servlet我们知道服务器工作的三部曲:接收请求 -> 处理请求并计算响应 -> 发送响应Servlet是个接口,实现这个接口的类就是用来进行中间的一个步骤“处理请求并计算响应的”,应用于HTTP传输的中间层。借助Tomcat服务器进行Servlet编…

【论文速递】WACV2022 - 从边界框标注学习小样本分割

【论文速递】WACV2022 - 从边界框标注学习小样本分割 【论文原文】:Learning Few-shot Segmentation from Bounding Box Annotations 获取地址:https://openaccess.thecvf.com/content/WACV2023/papers/Han_Learning_Few-Shot_Segmentation_From_Bound…

Word文档和PDF文件如何互相转换?

工作中,有时候我们需要把Word转换成PDF格式,转换后不但更美观、专业,也可以防止文档被修改。 那Word文档如何转换成PDF文件呢?其实在Word里面就可以直接转换。 文档编辑好后,在菜单中点击【文件】选项,然…

搭建 Go 语言的开发环境(文末附视频讲解)

从本小节开始,我们就要正式动手实践了。 类比现实生活,我们若要钉钉子,就需要准备锤子;想要烧菜,就需要准备灶具和食材…… 类似地,若要在电脑上编写 Go 语言程序,便要先配置开发环境。 下载和…

干货 | 互联网广告数据的匿名化方案研究

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分:背景介绍一、匿名化必要性互联网广告具有非常重要的商业价值,同时也是涉及数据处理十分密集的行业,出现了操作规范化、个人信息保护和商业数据安全等…

[GXYCTF2019]禁止套娃(无参数RCE)

目录 信息收集 知识讲解 涉及函数 PHP的正则表达式 无参rce 用到的函数 思路分析 方法一 方法二 信息收集 拿到这道题,抓包看了看,啥也没有,用dirsearch爆破目录发现.git目录,猜测存在.git源码泄露,用githac…

Web Spider XHR断点 堆栈跟值 逆向案例(四)

声明 此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途; 文章目录声明前言一、任务说明二、网站分析三、XHR断点调试,扣JS加密代码四、代码实现1、JS加密代码:encode.js2、…

安卓逆向:基础入门(一)

前言随着app的广泛应用,使用过程中,难免会遇到些很不友好的功能,比如:游戏充值、间断性弹窗广告、续费解锁下一回等等。而随之会产生如何将这些功能取消掉,而Android逆向就可以做到,纵向丝滑。当然这只是安…

Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析

Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析 Kinect v1和Kinect v2之间的参数比较 从图中可以看出,Kinect v2的表现比Kinect v1要好得多:首先最令人印象深刻的是分辨率的提高,v2达到了1080p,甚至视野也大…

JavaWeb | JDBC概述及IDEA连接MySQL

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 文章目录一、前言二…

java基础学习 day36(字符串相关类的底层原理)

字符串存储的内存原理 直接赋值会复用字符串常量池中已有的new出来的不会复用,而是开辟一个新的空间来创建 “”号比较的到底是什么 基本数据类型比较数据值引用数据类型比较地址值 PS. 所以以后对引用数据类型,不要用“”,改用.equals()…

RS485接线方式小科普

欢迎来到东用知识小课堂!RS-485采用平衡发送和差分接收方式实现通信:发送端将串行口的ttl电平信号转换成差分信号a,b两路输出,经过线缆传输之后在接收端将差分信号还原成ttl电平信号。RS-485总线网络拓扑一般采用终端匹配的总线型…

【Linux】基于 Pintos 实现新的用户级程序的系统调用 | 冯诺依曼架构

💭 写在前面:本章我们首先会明确冯诺依曼体系结构的概念,旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统,这个在之前的章节已经有所铺垫,当时我们只讲解了操作系统是什么&a…

车载以太网 - 车辆信息和车辆声明 - 09

到今天这一篇,对于ISO 13400 - 2的DoIP协议介绍就完事了,对DoIP协议的规范介绍基本已经全部包括了,无论是我们作为软件开发人员还是测试人员,了解这部分内容基本就能够满足这块基础的开发要求,大家如果在研究或者学习这块内容的时候有什么问题欢迎私聊;并且在本篇文章结束…

Nginx使用(四)动静分离实例

一、简介Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面,动静分离从目前实…

Linux系统安装Redis

我这里以CentOS7为例 VMware安装完centOS7之后 1.首先开启网络: 查看ip的命令不是传统的ifconfig或者ipconfig而是ip address 刚安装完使用ip address查看的时候会发现没有ip地址,这里需要修改设置启动网卡 vi /etc/sysconfig/network-scripts/ifcf…