Otasoft Microservice Template - Template for creating Nest.js microservices
About The Project
Otasoft Microservice template - Nest.js based microservice repository template. This project consists of:
- PostgreSQL Typeorm
- CQRS
- Domain Driven Design
- Event Sourcing
- Healthchecks
- .env support
- RabbitMQ Event Bus Connection
- Dockerfile and docker-compose
- doc directory
- Github workflows and issue templates
Otasoft projects are and always will be open source (MIT Licence). Anyone can use and support the project. The project is currently in the development phase.
Table of Contents
Getting Started
To start developing the project please check if you have these tools installed on your machine:
Installation
- Clone the repo
git clone https://github.com/otasoft/microservice-template
- Move into microservice-template
cd microservice-template
- Install project dependencies
yarn
- Copy .env.example file as .env and fill it with your environment variables
cp .env.example .env
- Run docker-compose to start development environment
docker-compose up
- Run project
yarn start:dev
Testing as a normal web server instead of microservice
- Replace bootstrap logic inside
main.ts
from microservice
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.RMQ,
options: {
urls: [
`amqp://${process.env.RABBITMQ_DEFAULT_USER}:${process.env.RABBITMQ_DEFAULT_PASS}@${process.env.RABBITMQ_NODENAME}:${process.env.RABBITMQ_FIRST_HOST_PORT}/${process.env.RABBITMQ_DEFAULT_VHOST}`,
],
queue: 'microservice_queue',
queueOptions: {
durable: false,
},
},
});
await app.listen(() => {
logger.log('Microservice is listening');
});
- To basic web HTTP server
const app = await NestFactory.create(AppModule);
await app.listen(3000);
- Replace message pattern in controller
@MessagePattern({ role: 'item', cmd: 'get-by-id' })
async getItemById(id: number): Promise<ItemEntity> {
return this.itemService.getItemById(id);
}
@MessagePattern({ role: 'item', cmd: 'create' })
async createItem(createItemDto: CreateItemDto): Promise<ItemEntity> {
return this.itemService.createItem(createItemDto);
}
- To HTTP methods (with Decorators like
@Body()
,@Param()
)
@Get('/get-by-id/:id')
async getItemById(@Param('id') id: number): Promise<ItemEntity> {
return this.itemService.getItemById(id);
}
@Post('/create')
async createItem(@Body() createItemDto: CreateItemDto): Promise<ItemEntity> {
return this.itemService.createItem(createItemDto);
}
Roadmap
See the open issues for a list of proposed features (and known issues).
Contributing
You are welcome to contribute to Otasoft projects. Please see contribution tips
How to support
Otasoft projects are and always will be Open Source.
Core team and contributors in the Otasoft ecosystem spend their free and off work time to make this project grow. If you would like to support us you can do so by:
- contributing - it does not matter whether it is writing code, creating designs, or sharing knowledge in our e-books and pdfs. Any help is always welcome!
- evangelizing - share a good news about Otasoft projects in social media or during technology conferences ;)
Contact
Founder -> Jakub Andrzejewski
Special Thanks
This project wouldn't be possible without amazing work of Kamil MyΕliwiec and the Nest.js Core Team. Keep doing the awesome work!
License
Distributed under the MIT licensed. See LICENSE
for more information.