创建项目很简单,nest-cli一键创建,关键是如何基于nestjs现有能力进行架构设计。
架构设计
项目背景
项目涉及的底层数据全部来自于公司的一个公共服务(jsf),该公共服务可对接口进行发布和订阅,同时提供各种协议的接口供第三方使用。我们的项目都是基于该服务提供的接口对数据进行二次加工和使用。
我的设想
我想构建的服务,类似微服务架构,有多个产品(ge和dm或者更多),各个产品之间有重合的业务,这部分需要共享,也有各自定制化的部分由各个产品自己管理,虽可能存在相互依赖,但需要独立部署。
基于以上思路,得到如下架构模型:
![在这里插入图片描述](https://img-blog.csdnimg.cn/0baa0a6fa6014796b1e8998dd874ddff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAa2FxaWlub25v,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
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
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}!`;
}
}
注册微服务
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 {}
注入微服务并调用
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框架性能评测
![在这里插入图片描述](https://img-blog.csdnimg.cn/69e10179e6674bfda70c5e80445dc5e1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAa2FxaWlub25v,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)