组织代码之前看 NestJS 社区有什么?
- 具有 workspace 的功能包管理工具 pnpm/yarn/npm 等
- NestJS CLi 提供的 monorepo 模式
- Nx 一个全栈管理框架
- Turbo monorepo 管理工具
以下文章都建立在 pnpm + workspace 基础上, 以 gRPC 为例的微服务。
以 api-gateway 方式暴露 api
此模式的特点是: api-gateway 方式实现 api,但是具体的业务逻辑放在微服务汇总,api-gateway 实现的内容需要通过 gRPC
调用远程微服务函数实现。
特点:
- 使用 api-gateway 服务对外暴露 api。
- 使用 微服务 完成业务逻辑。
- 使用 tcp/gRPC 等在 api-gateway 服务器之间进行通信。
- 自己就是一整模块功能的实现。
缺点:
- 功能不单一,有业务聚合性。
进阶:
- 聚合接口:有些模块不需要实现自己的业务,但是需要对外暴露接口,此需要聚合其他业务的微服务,使得此时开发的层级加深。
一个目录结构:
.├── REAMEME.md├── package.json├── packages│ ├── api-gateway│ └── ms-user├── pnpm-lock.yaml└── pnpm-workspace.yaml. ├── REAMEME.md ├── package.json ├── packages │ ├── api-gateway │ └── ms-user ├── pnpm-lock.yaml └── pnpm-workspace.yaml. ├── REAMEME.md ├── package.json ├── packages │ ├── api-gateway │ └── ms-user ├── pnpm-lock.yaml └── pnpm-workspace.yaml
服务与微服务
此模式的特点是:微服务与服务一起对外暴露,服务一般对外暴露 api, 而 微服务一般用来暴露内部通信使用。
特点
- 自己就是一个 api-gateway,功能专一
- 一般需要实现两套 api, http api 对外,给 nginx 等方向代理,gRPC 等微服务,对内,提供给其他微服务。
缺点
- 每一个模块就是一个项目,单人的管理难度增大。
看起来目录结构:
.├── REAMEME.md├── nginx│ └── nginx.conf├── package.json├── packages│ ├── ms-link│ ├── ms-tag│ └── ms-user├── pnpm-lock.yaml└── pnpm-workspace.yaml. ├── REAMEME.md ├── nginx │ └── nginx.conf ├── package.json ├── packages │ ├── ms-link │ ├── ms-tag │ └── ms-user ├── pnpm-lock.yaml └── pnpm-workspace.yaml. ├── REAMEME.md ├── nginx │ └── nginx.conf ├── package.json ├── packages │ ├── ms-link │ ├── ms-tag │ └── ms-user ├── pnpm-lock.yaml └── pnpm-workspace.yaml
管理微服务
启动微服务
使用 pnpm 的平行运行脚本能力
{"scripts": {"dev:be": "pnpm -r --parallel --filter=./packages/* run start:dev",}}{ "scripts": { "dev:be": "pnpm -r --parallel --filter=./packages/* run start:dev", } }{ "scripts": { "dev:be": "pnpm -r --parallel --filter=./packages/* run start:dev", } }
要运行 packages 目录下的所有项目,启动命令是 run start:dev
, pnpm 会以颜色作为区分输出不同的醒目的输出内容。
启动具有 debug 功能的微服务
此处以 VS Code 为例,添加 launch.json
文件, 同时还需要在 pnpm 的根目录添加脚本配置
- 根目录脚本
{"scripts": {"dev:api-gateway": "pnpm run --filter=api-gateway start:dev","dev:ms-user": "pnpm run --filter=ms-user start:dev",}}{ "scripts": { "dev:api-gateway": "pnpm run --filter=api-gateway start:dev", "dev:ms-user": "pnpm run --filter=ms-user start:dev", } }{ "scripts": { "dev:api-gateway": "pnpm run --filter=api-gateway start:dev", "dev:ms-user": "pnpm run --filter=ms-user start:dev", } }
- VS Code 对应的配置
{"version": "0.2.0","configurations": [{"type": "node","request": "launch","name": "api-gateway","runtimeExecutable": "pnpm","args": ["run", "dev:api-gateway"],"skipFiles": ["<node_internals>/**"],"console": "integratedTerminal"},{"type": "node","request": "launch","name": "dev:ms-user","runtimeExecutable": "pnpm","args": ["run", "dev:ms-user"],"skipFiles": ["<node_internals>/**"],"console": "integratedTerminal"}]}{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "api-gateway", "runtimeExecutable": "pnpm", "args": ["run", "dev:api-gateway"], "skipFiles": ["<node_internals>/**"], "console": "integratedTerminal" }, { "type": "node", "request": "launch", "name": "dev:ms-user", "runtimeExecutable": "pnpm", "args": ["run", "dev:ms-user"], "skipFiles": ["<node_internals>/**"], "console": "integratedTerminal" } ] }{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "api-gateway", "runtimeExecutable": "pnpm", "args": ["run", "dev:api-gateway"], "skipFiles": ["<node_internals>/**"], "console": "integratedTerminal" }, { "type": "node", "request": "launch", "name": "dev:ms-user", "runtimeExecutable": "pnpm", "args": ["run", "dev:ms-user"], "skipFiles": ["<node_internals>/**"], "console": "integratedTerminal" } ] }
在后就可以在 VS Code 调试中找到配置可选的调试工具了。
小结
本文主要探索了 NestJS 微服代码组织探索,两种模式:一种是 api-gateway 实现业务逻辑,另外一种是全部微服务化使用 nginx 实现反向代理。然后再 VS Code 中实现了启动调试微服务的能力。希望这些探索能够帮助大家。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END