2024-10-28-【研发】nestjs微服务开发问题集

如何区分开发和生产环境

https://blog.csdn.net/m0_37890289/article/details/135419842

1. 服务调用为何没响应?

  • send 调用方需要 return await 才能正常返回微服务响应结果
1
2
3
4
5
6
<!-- 事件响应 -->
// 提供方 - 微服务
@EventPattern('fetchNewsTask')
async fetchNewsTask() {}
// 调用方 - 主服务(网关) emit
this.pushServer.emit('fetchNewsTask', {});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 提供方 - 微服务
@MessagePattern('fetchLatestNews')
async fetchLatestNews(@Payload() payload: any) {
const newsData: any = await this.newsService.fetchLatestNews(payload);
return {
code: 0,
data: newsData,
};
}

// 调用方 - 主服务(网关)send
@Get('fetchLatestNews')
async fetchLatestNews(@Query() query) {
const latestTime = query.latestTime || new Date().getTime();
return await this.pushServer.send('fetchLatestNews', latestTime);
}

2. 微服务部署,consul 网关服务发现

第一步 安装 consul 1.x(服务器中安装)

2.1 通过 docker-compose 安装 consul curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.2 设置 docker-compose 执行权限 sudo chmod +x /usr/local/bin/docker-compose
2.3 创建 docker-compose.yml 文件 vi docker-compose.yml
2.4 写入以下内容:

1
2
3
4
5
6
7
8
9
10
version: "3"

services:
consul:
image: consul:1.10.1
container_name: consul_dev
command: agent -server -node=consul_dev -bootstrap-expect=1 -bind=127.0.0.1 -client=0.0.0.0 -datacenter=dc1 -ui
ports:
- "18500:8500"
network_mode: bridge

2.5 启动 consul docker-compose up -d
2.6 验证 consul 运行状态 docker ps

第二步 nestjs 微服务注册

第三步 nestjs 网关发现微服务

第四步 pm2 部署服务

  1. 为了区分开发环境和生产环境,创建ecosystem.config.js
  2. 写入配置,启动 pm2 后可写入环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module.exports = {
apps: [
{
name: "payBack",
script: "dist/main.js",
env: {
NODE_ENV: "prod",
},
env_dev: {
NODE_ENV: "dev",
},
env_prod: {
NODE_ENV: "prod",
},
},
],
};
  1. 启动生产服务 pm2 start ecosystem.config.js --env prod --watch

3. 网络安全

consul 服务发现与注册使用内网 iP 互联

  • [注意]微服务启动 0.0.0.0 监听外网
1
2
3
4
5
6
7
8
9
10
11
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.TCP,
options: {
// 很重要
host: '0.0.0.0',
port,
},
},
);

腾讯云轻量服务器支持同地域内网 ip 互联
防火墙端口,仅需开通内网 ip 访问

常见问题

  1. 无法连接微服务
1
2
3
0|payBack  | [Nest] 356351  - 2024-11-09 12:20:11 AM   ERROR [ExceptionsHandler] connect ECONNREFUSED 10.0.0.4:3001
0|payBack | Error: connect ECONNREFUSED 10.0.0.4:3001
0|payBack | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1278:16)
  • 1.1 微服务自检端口

  • lsof -i:3001 (如果为 TCP localhost:3001 则需要将微服务启动监听 0.0.0.0)

  • node\x20/ 158029 root 19u IPv4 901314 0t0 TCP *:3001 (LISTEN)

  • 1.2 主服务访问微服务端口

  • nmap -p 3001 10.0.0.4

1
2
PORT     STATE SERVICE
3001/tcp closed nessus
1
2
3

PORT STATE SERVICE
3001/tcp open nessus

2024-10-28-【研发】nestjs微服务开发问题集
https://zhangyingxuan.github.io/2024-10-28-【研发】nestjs微服务开发问题集/
作者
blowsysun
许可协议