13服务端实战:初始化项目

news2024/11/25 2:20:01

本章开始将进行服务端的实战开发,包含了 Devops、服务端以及其他涉及到的中间件的模块。

由于 NestJS 的文档非常完善以及之前有写过比较完整的 NestJS 的小册,如果对 NestJS 非常熟悉的同学可以快速跳过本章,另外整个实战篇的代码都会按照流程进行开发,只有重点的部分会拿出来单独讲解,如果有同学感觉哪块的内容不足够的话,请留言或者与加群沟通,我会在设计篇补充完整,理论上看完设计就应该能写出大体的框架而不是要在具体的代码中再去理解,所以如果有疑问那就是我设计篇没有写好,需要重新补充内容

环境搭建


在之前的 Demo 中,我们一直都在服务器或者虚拟机上直接安装所需要的软件服务,但这样并不利于迁移以及要解决各种复杂的环境配置问题,所以这次我们将采用基于 Docker Compose 的方式来快速搭建所需的开发环境,但这需要你熟悉 Docker 以及 Docker Compose 的使用。

  • 安装 Docker: docs.docker.com/engine/inst…
  • 安装 Docker Compose: docs.docker.com/compose/ins…

安装过程自己查看文档,嫌麻烦 Mac 与 Windows 同学可以直接下载 Dockers Desktop

在任意目录下新建 docker-compose.yml 文件,并填入以下内容:

version: '3.3'

volumes:
  mongodb_data:
  mysql_data:

services:
  mongo:
    image: bitnami/mongodb:5.0.8
    volumes:
      - 'mongodb_data:/Users/Shared/mongodb'
    ports:
      - "27017:27017"

  mysql:
    image: bitnami/mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - 'mysql_data:/Users/Shared/mysql'
    ports:
      - "3306:3306"

运行 docker-compose up 启动服务:

如果你本地没有对应的镜像,则会开始拉取对应的镜像。

如果想后台启动的话,则使用 docker-compose up -d 脚本,启动完毕之后如下图所示:

如果出现上图的问题,代表此镜像与 M1 芯片不兼容,最简单的解决办法就是切换 mongodb 的镜像为 mongo:5.0.0-focal 即可。

接下来我们可以使用客户端去验证对应的数据库是否正常启动。

数据库可视化客户端

MongoDB

  1. Robo 3T:这是一个免费的 MongoDB 客户端,提供了一个直观的界面来管理 MongoDB 数据库并支持 WindowsMacOS 和 Linux 平台;
  2. Mongo Management Studio:这是一个开源的 MongoDB 客户端,它提供了一个直观的界面来管理 MongoDB 数据库。支持 WindowsMacOS 和 Linux 平台;
  3. Mongo Express:这是一个基于 Web 的 MongoDB 客户端,支持 WindowsMacOS 和 Linux 平台。

我个人比较习惯 Robo 3T,至于其他你们随意就好,下面就是正常连接了 MongoDB 的样子

MYSQL

  1. DBeaverDBeaver 是一款开源的通用数据库管理工具,支持 MySQLPostgreSQLOracleDB2 等多种数据库系统;
  2. HeidiSQL:提供图形化界面,支持 Windows 操作系统;
  3. MySQL WorkbenchMySQL Workbench 是 MySQL 官方提供的免费的数据库管理工具,提供图形化界面并支持 WindowsMacOS 和 Linux 平台

我个人比较习惯 MySQL Workbench,至于其他你们随意就好,下面就是正常连接了 MYSQL 的样子:

对应的,其他的中间件比如 Redis 都可以采用此方式进行启动,除了一些基础的配置需要特殊处理之外,无需特别关注环境问题,对于 Docker 不熟悉的同学可以关注工程化的专栏,里面有一些相关的知识可以配合看看。

NestJS 项目初始化


因为之前有些同学初始化的过程中遇到过坑,所以这次又是一次全新的初始化过程,采用最新的 @nestjs/cli 版本以及依赖进行项目初始化。

项目初始化

执行初始化脚本:

nest new low-code-test

项目目录结构如下所示:

可以将上述的 docker-compose.yml 文件移动到此项目的根目录。

输入如下脚本即可运行工程:

pnpm start

项目拆分

在之前的项目设计中,我们将整个服务拆解成立多个微服务,但同时创建多个工程从项目维护上来说是非常不便的,同时多工程之间的共用依赖维护也是一个头疼的问题,所以我们将采用 Monorepo 的模式来开发整个后端服务。

执行以下命令创建新的子应用 devops,同时将常规工程转化为 Monorepo 模式:

nest generate app devops

新的目录结构如下所示,devops 与 low-code-test 两个工程都被收拢到了 apps 目录下:

此时脚本的启动命令也变成如下所示:

nest start // 启动默认的项目
nest start devops  // 启动 devops 子模块

直接运行如上的脚本,当然会出现端口重复的错误,我们需要修改 devops 子项目的启动端口:

# 文件目录 `low-code-test\apps\devops\src`
import { NestFactory } from '@nestjs/core';
import { DevopsModule } from './devops.module';

async function bootstrap() {
  const app = await NestFactory.create(DevopsModule);
-  await app.listen(3000);
+  await app.listen(3001);
}
bootstrap();

重新启动出现如下图所示即代表成功:

Turborepo 管理 Monorepo

每个子应用都存在互相调用的情况,开多个窗口运行也是一件非常麻烦的时候,所以我们需要借助 turbo 来帮助一次性启动所有的子应用。

Turborepo 是一个用于管理基于 Monorepo 的 Node.js 项目的工具。使用 Turborepo,你可以将多个 Node.js 项目存储在单个 Monorepo 存储库中,并使用一个命令来管理这些项目。Turborepo 提供了一些命令,例如 turborepo addturborepo buildturborepo testturborepo lint 等,用于管理 Monorepo 中所有项目的构建,测试和代码质量控制。

  1. 项目根目录添加 pnpm-workspace.yaml 将项目转成 pnpm workspace 模式:
packages:
  - "apps/*"
  1. 使用以下命令安装 Turborepo
pnpm i -w turbo 
  1. 项目根目录添加 turbo.json 配置文件
{
  "$schema": "https://turborepo.org/schema.json",
  "pipeline": {
    "dev": {
      "cache": false
    }
  }
}
  1. 子应用添加对应的 package.json,添加对应的启动命令:
# 文件目录 `low-code-test\apps\devops`
{
  "name": "devops",
  "version": "0.0.1",
  "scripts": {
    "dev": "cd .. && pnpm start:devops"
  }
}
# 文件目录 `low-code-test\apps\low-code-test`
{
  "name": "low-code-test",
  "version": "0.0.1",
  "scripts": {
    "dev": "cd .. && pnpm start:lowcode"
  }
}
  1. 修改项目根目录的启动命令:
- "start": "nest start",
+ "start": "turbo run dev",
+ "start:lowcode": "nest start",
+ "start:devops": "nest start devops",
  1. 执行启动脚本 pnpm start,出现如下图所示即可:

创建公共库

每个子服务之间也会有一些公共的功能会重复,在 Monorepos 项目中,我们可以使用 NestJS 提供的 library 能力来实现(标准模式项目可以使用 npm 包实现类似的功能)。

输入以下指令添加公用的 library

nest g library comm

写在最后


至此整个项目的前置工作已完成,后续会基于此工程进行业务开发,实战的过程就是如此枯燥且朴实无华,如果有同学哪块不清楚可以留言反馈,我们每一条留言都会有反馈的。

如果你有什么疑问或者更好的建议,欢迎在评论区提出。 👏

13 服务端实战:初始化项目

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

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

相关文章

shell命令以及运行原理、Linux权限、粘滞位

今天我带来Linux重点知识:shell命令以及运行原理、Linux权限、粘滞位的知识点。 目录 shell命令以及运行原理Linux权限的概念Linux下的用户su命令 Linux权限管理文件访问者的分类文件的类型和访问权限文件权限值的表达方法 Linux关于权限的知识点补充1.Linux创建用户…

Unity3d C#使用XCharts数据显示格式说明(如:数据类型、数据显示为百分比%等)

前言 XCharts是开源且比较强大的插件,在Unity3d中搭建UI时常常使用的数据图表的制作插件, 特别是当下的数字沙盘、数字孪生等项目中应用较广。笔者公司也一直在使用该插件,本文主要是在开发过程中的一个小需求引发的整理分享。在项目中需要将…

vue2 若依项目,使用plotly.js-dist图表库,将数据图表一键导出为图片

此代码适用的场景是一个页面有多个数据图表。 首先需要拿到你生成数据图表的数据, 然后赋值给一个数组,数组需要在data定义,还需要去重。 // 检查是否有相同的parameter值const hasDuplicate this.toImageArr.some(iiem > iiem.paramete…

由于找不到xinput1_3.dll,无法继续执行代码的解决方法都有哪些?

关于由于找不到xinput1_3.dll,无法继续执行代码这个问题,其实在网上经常看别人提及,要解决这个问题,还是不难的,今天小编就来给大家详细的说说关于这个问题的解决方法吧,本文会介绍多种的修复方法,下面一起…

商品数据封装接口(PHP/Java/Python)

封装 在面向对象程式设计方法中,封装是指—种将抽象性函式接口的实现细节部分包装、隐藏起来的方法 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问 要访问该类的代码和数据,必须通过严格的接口控制 封装最…

提升生产效率的关键:如何选择适合您企业的设备管理系统?

在现代工业生产中,设备管理对于提升生产效率和降低成本至关重要。一个高效的设备管理系统可以帮助企业实现设备的有效监控、维护和优化,从而提高设备的可靠性、降低停机时间,并最终提升生产效率。选择适合企业的设备管理系统可能是一个复杂的…

Vision Pro:多人XR协作这样玩才对味

早在iOS 15系统更新中,苹果就推出了SharePlay功能,该功能主要针对多人协作和社交,允许用户在FaceTime会话中一起看剧、听歌、共享屏幕。Vision Pro头显也支持该功能,允许用户共享AR图像和空间上下文信息,实现远程可视化…

LeetCode 每日一题——2178. 拆分成最多数目的正偶数之和

1.题目描述 2178. 拆分成最多数目的正偶数之和 给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的正偶数之和,且拆分出来的正偶数数目 最多 。 比方说,给你 finalSum 12 ,那么这些拆分是 符合要求 的(互不相同的正偶…

Spring Boot 中的服务发现

Spring Boot 中的服务发现 Spring Boot 是一个非常流行的 Java Web 开发框架,它提供了很多工具和组件来简化 Web 应用程序的开发。其中,服务发现是 Spring Boot 中的一个非常重要的组件,它可以帮助我们自动地发现和管理应用程序中的服务。 什…

Prometheus 时序数据

一 时序索引 Prometheus 存储的是时序数据,时间戳(timestamp)来源于服务端本地的系 统时间。Prometheus 使用 Unix 时间戳(即自 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数)表示时间。 数 据 格 式 : …

C#核心知识回顾——10.List、Dictionary、数据结构、LinkedList

1.List List<int> list new List<int>(); List<String> strings new List<String>();//增list.Add(0);list.Add(1);List<int> ints new List<int>();ints.Add(0);list.AddRange(ints);//插入list.Insert(0, 1);// 位置0插入1//删//1.移…

Java内存模型—工作流程、volatile原理

导入 最近在做项目的时候发现很多业务上用到了多线程&#xff0c;通过多线程去提升程序的一个运行效率&#xff0c;借此机会来复盘一下关于并发编程的相关内容。为什么要使用volatile&#xff1f;volatile底层原理是什么&#xff1f;JMM内存模型解决的是什么问题&#xff1f;带…

基于 OpenCV 开发实现眨眼计数器

文末提供免费的源代码下载链接 在本教程中,我们将了解如何使用 Dlib、Python 和 OpenCV 创建眨眼检测器/计数器。 我们将首先使用 Dlib 的人脸检测器来检测视频中的人脸。然后我们将使用 Dlib 中的形状预测器来确定眼睛在面部的位置。 最后,我们将使用眼睛的标志来计算眼睛…

小白必看:这些项目可以让你轻松月入过万

月入五W的互联网副业野路子。总有一个适合你!刷到这篇回答的。就不要在看其他的了。 这些互联网项目你也能做 1、认识个哥们&#xff0c;每天去一些热门的寺庙拍视频开直播&#xff0c;帮人代请手串&#xff0c;每串赚15元&#xff0c;月入5万多&#xff0c;非常非常稳定。 2…

基于SpringBoot+vue的口腔管家平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Image Sensor的像素时钟计算

本文介绍Image Sensor的像素时钟计算。 在配置Image Sensor寄存器的过程中&#xff0c;像素时钟至关重要&#xff0c;它的正确设置关系到帧率&#xff0c;曝光参数的正确与否。我们从相关资料中了解到像素时钟有多种方法&#xff0c;究竟该选择哪一种呢&#xff0c;本文来对常…

【C++】函数绑定器技术

1. 函数绑定器技术&#xff0c;什么情况可以用到这种技术实现? 占位符和函数绑定器技术&#xff08;如std::bind&#xff09;可以在以下情况下使用&#xff1a; 参数绑定&#xff1a;当你想要绑定函数的某些参数&#xff0c;但又不想立即提供这些参数的值时&#xff0c;可以…

在idea中使用Git技术

1.配置git环境 打开idea,点击file->setting->搜索git&#xff0c; 将git的安装路径填写进去 2.去gitee创建一个远程仓库 3.拉入一个.gitignore文件&#xff0c;过滤掉不需要管理的文件 4.在idea进行如下操作 5.选择要提交的内容 目前只是保存在了本地仓库 6.推送到远端…

简单尝试将go项目用宝塔部署到服务器

最近写了一个go项目的小demo打算放到服务器上&#xff0c;但是中间遇到一些问题&#xff0c;这里我记录下&#xff1a; 一、找一个文件夹将打包后的go项目放进去&#xff0c;如图 二、安装执行exe文件的wine 终端执行命令 yum install wine 终端在这&#xff0c;如图&#xf…

macOS Sonoma 14 beta 3 (23A5286g) Boot ISO 原版可引导镜像下载

macOS Sonoma 14 beta 3 (23A5286g) Boot ISO 原版可引导镜像&#xff0c;7 月 5 日&#xff08;北京时间今日凌晨&#xff09;已发布 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U…