NESTJS 服务化架构设计和项目搭建

2023-05-16


创建项目很简单,nest-cli一键创建,关键是如何基于nestjs现有能力进行架构设计。

架构设计

项目背景

项目涉及的底层数据全部来自于公司的一个公共服务(jsf),该公共服务可对接口进行发布和订阅,同时提供各种协议的接口供第三方使用。我们的项目都是基于该服务提供的接口对数据进行二次加工和使用。

我的设想

我想构建的服务,类似微服务架构,有多个产品(ge和dm或者更多),各个产品之间有重合的业务,这部分需要共享,也有各自定制化的部分由各个产品自己管理,虽可能存在相互依赖,但需要独立部署。

基于以上思路,得到如下架构模型:
在这里插入图片描述

  • JSF-SERVER
    从公共服务获取数据,有多种方式获取(TCP、Http、RPC、Grpc),同时可以暴露http接口给客户端直接获取底层数据。(有些不需要二次加工的数据可以直接吐出)。第三方服务也可通过TCP协议与服务建立通信,获取数据。

  • Ge-server和Dm-server
    基础服务,暴露http接口给客户端使用

  • libs
    存放公共模块,比如登陆、鉴权、拦截器等

DEMO地址:

项目搭建

项目初始化

web 框架选择fastify代替Express,因其网络性能,详见附件性能评测

# 初始化项目
npm install @nestjs/cli -g
nest new nest-server-demo

# 安装依赖
npm uninstall @nestjs/platform-express
npm install @nestjs/{platform-fastify,microservices}  class-transformer class-validator --save

# 创建应用
nest g app ge
nest g app dm
nest g jsf

# 创建公共模块,修改前缀为@libs
nest g library common

改造微服务

暴露微服务

路径:apps/jsf/main.ts

declare const module: any;
import { NestFactory } from '@nestjs/core';
import { JsfModule } from './jsf.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(JsfModule, {
    transport: Transport.TCP,
    options: {
      port: 4000,
    },
  });

  await app.listen();
  if (module.hot) {
    module.hot.accept();
    module.hot.dispose(() => app.close());
  }
}
bootstrap();

发布消息

  • 路径 apps/jsf/jsf.controller.ts
import { Controller, Get } from '@nestjs/common';
import { JsfService } from './jsf.service';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class JsfController {
  constructor(private readonly jsfService: JsfService) {}
  
  @MessagePattern({ cmd: 'getHelloX' })
  getHelloMessage(name: string): string {
    return this.jsfService.getHelloMessage(name);
  }
}

  • 路径 apps/jsf/jsf.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class JsfService {
  getHelloMessage(name: string): string {
    return `Hello ${name}!`;
  }
}

注册微服务

  • 路径:apps/ge/ge.module.ts
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { GeController } from './ge.controller';
import { GeService } from './ge.service';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'NEST_SERVICE',
        transport: Transport.TCP,
        options: {
          port: 4000,
        },
      },
    ]),
  ],
  controllers: [GeController],
  providers: [GeService],
})
export class GeModule {}

注入微服务并调用

  • 路径 apps/ge/ge.service.ts
import { Inject, Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { Observable } from 'rxjs';

@Injectable()
export class GeService {
  constructor(@Inject('NEST_SERVICE') private readonly client: ClientProxy) {}
  getHelloMessage(name: string): Observable<string> {
    return this.client.send<string>({ cmd: 'getHelloX' }, name);
  }
}

创建http接口供客户端使用

  • 路径:apps/ge/ge.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { GeService } from './ge.service';

@Controller()
export class GeController {
  constructor(private readonly geService: GeService) {}

  @Get(':name')
  getHello(@Param() params) {
    return this.geService.getHelloMessage(params.name);
  }
}

启动项目

安装concurrently,同时启动多应用并改造start脚本

"start": "concurrently --kill-others \"npm run start:ge\" \"npm run start:jsf\"",
"start:ge": "nest start ge --watch",
"start:jsf": "nest start jsf --watch",
"start:dm": "nest start dm --watch",
npm install concurrently -D
npm run start

防伪接口:localhost:3000/songmeinuo
注意:修改apps/dm/dm.main.ts的端口号,否则会冲突

建立代码规约

npm install kaqiinono-script -D
dm-rule

详见:
代码规范脚本自动化
利用npm bin创建可执行命令实现项目代码规范自动化

附录

web框架性能评测

在这里插入图片描述

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

NESTJS 服务化架构设计和项目搭建 的相关文章

随机推荐

  • Windows下重启Linux子系统(WSL)

    Linux子系统 xff08 WSL xff09 是基于 LxssManager 服务运行的 重启WSL的话只需要将 LxssManager 重启即可 命令重启 以管理员权限运行cmd命令即可 停止LxssManager服务 net sto
  • Mac安装dmg程序提示无可装载的文件系统

    安装dmg程序是提示 无可装在的文件系统 1 查看SIP状态 在终端中输入csrutil status xff0c 就可以看到是 enabled 还是 disabled 2 关闭SIP 重启MAC xff0c 按住commond 43 R直
  • windows恶意软件删除工具 MRT.EXE

    MRT 是微软自Windows7开始就自带的一款绿色的恶意软件删除工具 具体路径为C WINDOWS system32 MRT exe 默认已经在系统环境变量中 所以我们直接 win 43 R 输入 mrt 即可运行 操作也极其简单 xff
  • BitLocker正在等待激活,怎样可以关闭?

    问题 xff1a 装完win10系统后有时候会显示 BitLocker正在等待激活 一直有个黄色的小锁图标看着有些头疼 xff0c 怎样才能取消启用Bitlocker呢 xff0c 也没有关闭的按钮 处理方法 控制面板 在 Bitlocke
  • PROXMOX 开源虚拟服务器系统安装及配置

    前言 说到学习Linux xff0c 在适应图形化界面后 xff0c 我们逐渐可以通过一些shell命令来操作Linux系统 xff0c 此时何曾不想多尝试几个不同的Linux系统 xff0c 但是每每安装配置虚拟机又很麻烦 xff0c 如
  • Deepin 深度操作系统安装教程

    简介 深度操作系统 deepin 是一个致力于为全球用户提供美观易用 安全稳定服务的Linux发行版 xff0c 同时也一直是排名最高的来自中国团队研发的Linux发行版 xff0c 下面我们开始从下载镜像到安装系统一步步进行讲解 系统下载
  • 香橙派 OrangPi PC 安装Lakka游戏系统及使用指南

    香橙派 Orange Pi PC Orange Pi PC 采用了全志四核A7高性能处理器Allwinner H3 xff0c 集成以太网 DC电源输入 视频 音频输出等接口 xff0c 支持HDMI AVOUT视频输出等功能 尽管体积很小
  • 我把华为云的Ubuntu 18.04升级到了Ubuntu 22.04

    华为云建站有些年头了 xff0c 当时装的是ubuntu18 04 xff0c 停止维护更新日期是2023年4月 xff0c 只剩半年时间就该停服了 xff0c 这么看来是时候升级以下系统版本了 xff0c 不然升级版本都可能会有问题 由于
  • Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法

    之前将ubuntu server 22 04 安装了 Budgie Desktop 桌面环境 xff0c 系统语言是英文的 xff0c 如果要作为桌面使用还有些不适应 xff0c 我们要如何将系统语言切换为中文并支持中文输入呢 xff1f
  • OpenKylin常用软件安装

    由于OpenKylin仍处于测试阶段 xff0c 应用商店软件并不全 xff0c 所以很多软件的安装非常麻烦 xff0c 以下列出了一些常用软件的安装方法 需要的童鞋可以直接复制命令后进行安装 xff0c 安装软件需要使用root权限 xf
  • 利用sourceinsight宏(Quicker.em)提高编码效率和质量

    利用sourceinsight宏 Quicker em 提高编码效率和质量 Marco是sourceinsight软件一个强大的功能 xff0c 用户可以通过编写宏来实现自定义功能 这里有个比较流行的宏文件quicker em xff0c
  • Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

    如果您在尝试克隆Git存储库时得到 SSL certificate problem unable to get local issuer certificate 的错误 这意味着Git无法验证远程存储库的SSL证书 如果SSL证书是自签名的
  • 树莓派从源码构建安装Git最新版

    1 查看Git版本 首先我们通过SSH客户端连接树莓派 在树莓派中通过查看 Git 版本信息 xff0c 我们只能看到最高版本显示为 2 30 2 xff0c 并且通过apt安装也无法将Git更新到最新版 git version sudo
  • linux安装部署免费confluence wiki

    Centos7安装部署免费confluence wiki 知识库 详细操作步骤 前言 xff1a confluence是团队协作软件 xff0c 改变团队工作方式 xff0c 作为现代化办公不可缺少的工具 wiki所需的安装包 xff1a
  • 对printf源码的分析

    对printf源码的分析 一 printf的源码如下 span class token macro property span class token directive keyword include span span class to
  • iPhone开发:可拉伸的图片

    还记得在Windows下用MFC或WTL写用户界面程序的时候 xff0c 为了给可改变大小的对话框加上背景图案 xff0c 需要对设计师提供的图片进行裁剪 把图片切成九块 xff0c 其中四个角是不拉伸的 xff0c 四条棱边可以在一个方向
  • 解决在KDE桌面环境WebStorm不能输入中文问题

    由于jetbrains官方包的问题 xff0c Fcitx5输入法文字候选托盘暂时不能更改 xff0c 如有最新解决办法 xff0c 可查看ArchWiki官方 xff0c 或者查看jetbrains官方 排查错误 cat etc loca
  • NAS如何使用SnapShot快照功能?

    Snapshot是基于Btrfs文件系统产生的快速备份和还原数据的第三方应用 xff0c 利用Snapshot为数据提供保护 xff0c 以防止因意外删除 应用程序崩溃 数据损毁和病毒所造成的数据丢失 1 TOS应用中心 xff0c 找到S
  • 备份电脑不求人,"时间机器"轻松备份你的Mac

    相比Windows 自带的系统还原功能 xff0c Mac有内置的Time Machine功能 xff0c 可以方便我们进行整机备份 xff0c 在关键时刻成为你重要数据的一颗 后悔药 xff01 Time Machine xff08 时间
  • NESTJS 服务化架构设计和项目搭建

    创建项目很简单 xff0c nest cli一键创建 xff0c 关键是如何基于nestjs现有能力进行架构设计 架构设计 项目背景 项目涉及的底层数据全部来自于公司的一个公共服务 jsf xff0c 该公共服务可对接口进行发布和订阅 xf