Skip to content

Instantly share code, notes, and snippets.

@thiagotigaz
Created February 24, 2022 05:57
Show Gist options
  • Save thiagotigaz/51ef35f14c915fa41b5e54efc288fa99 to your computer and use it in GitHub Desktop.
Save thiagotigaz/51ef35f14c915fa41b5e54efc288fa99 to your computer and use it in GitHub Desktop.
NodeJS Microservices with NestJS, Kafka, and Kubernetes - Part 1
curl --location --request POST 'http://localhost:3000/services' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Web Development",
"description": "description for Web Development"
}'
npm i -g @nestjs/cli
mkdir microservices-nestjs-k8
cd microservices-nestjs-k8
git init
# make sure to create the repository on github under your account and add the remote origin
git remote add origin https://github.com/thiagotigaz/microservices-nestjs-k8.git
nest new -g api
cd api
npm i @nestjs/microservices kafkajs class-validator @nestjs/mapped-types
npm run start
import { IsNotEmpty, IsString, MaxLength } from 'class-validator';
export class CreateServiceDto {
@MaxLength(64)
@IsString()
@IsNotEmpty()
name: string;
@MaxLength(255)
@IsString()
@IsNotEmpty()
description: string;
tags: string[];
}
import { Module } from '@nestjs/common';
import { ServicesService } from './services.service';
import { ServicesController } from './services.controller';
import { ClientKafka, ClientsModule, Transport } from '@nestjs/microservices';
@Module({
imports: [
ClientsModule.register([
{
name: 'CLIENT_KAFKA',
transport: Transport.KAFKA,
options: {
client: {
clientId: 'services',
brokers: ['host.docker.internal:9094'],
},
consumer: {
groupId: 'services',
},
},
},
]),
],
controllers: [ServicesController],
providers: [
ServicesService,
{
provide: 'KAFKA_PRODUCER',
useFactory: async (kafkaClient: ClientKafka) => {
return kafkaClient.connect();
},
inject: ['CLIENT_KAFKA'],
},
],
})
export class ServicesModule {}
import { Inject, Injectable } from '@nestjs/common';
import { CreateServiceDto } from './dto/create-service.dto';
import { UpdateServiceDto } from './dto/update-service.dto';
import { Producer } from '@nestjs/microservices/external/kafka.interface';
@Injectable()
export class ServicesService {
constructor(@Inject('KAFKA_PRODUCER') private kafkaProducer: Producer) {}
create(createServiceDto: CreateServiceDto) {
const id = Math.floor(Math.random() * 100);
this.sendKafkaEvent(`${id}`, {
eventType: 'ServiceCreated',
id,
...createServiceDto,
});
return 'This action adds a new service';
}
findAll() {
return `This action returns all services`;
}
findOne(id: number) {
return `This action returns a #${id} service`;
}
update(id: number, updateServiceDto: UpdateServiceDto) {
updateServiceDto.id = id;
this.sendKafkaEvent(`${id}`, {
eventType: 'ServiceUpdated',
...updateServiceDto,
});
return `This action updates a #${id} service`;
}
remove(id: number) {
this.sendKafkaEvent(`${id}`, { eventType: 'ServiceDeleted', id });
return `This action removes a #${id} service`;
}
sendKafkaEvent(key, value) {
this.kafkaProducer.send({
topic: 'services',
messages: [{ key, value: JSON.stringify(value) }],
});
}
}
import { PartialType } from '@nestjs/mapped-types';
import { CreateServiceDto } from './create-service.dto';
import { IsNotEmpty } from 'class-validator';
export class UpdateServiceDto extends PartialType(CreateServiceDto) {
@IsNotEmpty()
id: number;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment