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

2023-05-16

前言

一般常规的项目立项之初会有一份 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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 【Ubuntu-22.04.2新手安装教程】

    新手安装教程 很多小伙伴在Ubuntu的安装上总会有疑问 xff0c 今天就来给小可爱们来一套完整的Ubuntu快速安装教程 VMware Workstation Pro安装 本多的VMware Workstation Pro是从电脑管家那
  • MySql 数据库查看视图的创建sql语句

    在网上能找到大量的视图创建 修改 删除的语句 xff0c 但是查看创建语句的语句不好找 show create view VIEW NAME
  • 踩坑!WSL2报错:docker unrecognized service

    WSL2安装Docker后执行 sudo service docker start 报错 xff1a docker unrecognized service实录 在WSL中安装Docker要使用命令 xff1a curl https get
  • docker-compose安装教程

    docker compose安装教程 一 docker compose简介二 安装docker compose 1 下载docker compose2 运行 96 docker compose 96 xff0c 提示权限不够3 添加权限4
  • linux下gzip

    gunzip file1 gz 解压一个叫做 39 file1 gz 的文件 gzip file1 压缩一个叫做 39 file1 的文件 gzip 9 file1 最大程度压缩
  • Ubuntu18.04 更新后无法进入系统

    参考博客 xff1a http tieba baidu com p 5854786601 traceid 61 经常看到很多朋友说ubuntu系统更新后 xff08 特别是linux内核更新后 xff09 重新启动时进不了桌面 xff0c
  • 数学分析 - 隐函数

    简介 xff1a 用多元函数 xff08 隐函数中自变量和因变量同时存在的表达式的作为多元函数的表达式 xff09 的思维来分析隐函数 隐函数的概念 定义 xff1a 隐函数的定义 xff08 一个多元函数F x y 构成的方程F x y
  • Error occurred while trying to proxy request项目突然起不来了

    1 如果你是之前还能项目能正常运行 xff0c 突然启不来了 xff0c 或者别人启起来 xff0c 你启不来 xff0c 请尝试以下办法 xff08 1 xff09 npm版本过低 步骤一 xff1a 查看npm版本 xff1a npm
  • Docker Debian安装Docker

    Debian安装Docker 内容由 网络搜罗整理而来 xff0c 记录与共享 一 APT安装 官方Debian存储库中提供的Docker安装包可能不是最新版本 为了确保我们获得最新版本 xff0c 我们将从官方Docker存储库安装Doc
  • 使用VsCode配置MySQL实现连接、查询、等功能

    场景 xff1a 使用VsCode配置MySQL实现连接 查询 等功能 xff08 mrx xff09 步骤 xff1a 打开vscode左边的拓展栏 1 搜索MySQL MySQL Syntax两个插件 xff0c 并安装 xff1b 2
  • centos7安装mysql5.7步骤(图解版)

    目录 一 下载mysql5 7安装包 二 mysql5 7安装包上传到linux服务器 三 检查系统是否安装过mysql 四 卸载CentOS7系统自带mariadb 五 检查有无安装过mysql 用户组 没有的话创建 六 安装mysql5
  • IDEA报错之Failed to start bean ‘documentationPluginsBootstrapper‘问题及解决方案

    笔者今日创建一个Spring Boot 项目准备做产品 基于IDEA搭建是非常容易的 但是万万没想到 居然一切顺理成章的创建之后 运行报错 非常痛惜 错误截图如下 核心错误 Failed to start bean documentatio
  • Linux界面和字体大小调整

    1 调整桌面显示屏幕大小 点击页面上方的系统 gt 首选项 gt 显示 点击显示后出现显示器分辨率调节 xff0c 将分辨率选择最大基本可以覆盖虚拟机整个屏幕 2 调整屏幕字体大小 点击页面上方的系统 gt 首选项 gt 外观 选择字体栏
  • SQL语句:分组查询

    在对数据表中数据进行统计时 xff0c 可能需要按照一定的类别分别进行统计 比如查询每个部门的员工数 使用GROUP BY按某个字段 xff0c 或者多个字段中的值 xff0c 进行分组 xff0c 字段中值相同的为一组 语法格式 查询列表
  • Ubuntu18.04安装后基础配置(换源+WIFI适配+ROS+VScode)

    简单记录一下 xff0c 新安装好的Ubuntu系统 xff0c 需要什么初始化步骤呢 xff1f 1 建议首先换源 xff0c 换清华源 xff08 需要插网线 xff09 首先连接网线 xff0c 系统需要有网络环境 打开 软件和更新
  • PyInstaller库—Python第三方库—程序打包

    PyInstaller的作用是将Python源文件 xff08 py xff09 打包 xff0c 变成直接可运行的可执行文件 首先需要下载安装PyInstaller库 xff0c 在cmd 中输入pip install PyInstall
  • vcpkg问题-环境配置

    参考博客 xff1a Visual Studio开源库集成器Vcpkg全教程 利用Vcpkg轻松集成开源第三方库 https blog csdn net cjmqas article details 79282847 先说一些装好以后注意的
  • PVE系统安装

    PVE是专为家庭设计打造的 xff0c 永久免费的开源平台 xff0c 在低配置的小主机上都能轻松运行的一款轻量级平台 PVE是专业的虚拟机平台 xff0c 提供一个家庭设备集中管理平台 xff0c 你可以利用它安装任何你想要的系统 1 制
  • 初识c语言系列-1-第一个c语言程序

    目录 1 61 61 该系列的介绍 61 61 2 61 61 未来的打算 61 61 3 61 61 简单介绍c语言 61 61 4 61 61 第一个c语言程序 61 61 1 该系列的介绍 首先呢 xff0c 开始这个系列之前呢 xf
  • NestJS 项目实战 需求分析(文末附视频)

    前言 一般常规的项目立项之初会有一份 MRD xff08 Market Requirements Document xff0c 市场需求文档 xff09 用来判断产品的必需性以及价值等 对于基础项目开发来说 xff0c 使用 MRD 可能有