This project sets up an API Gateway with multiple microservices, including authentication, user management, Kafka for messaging, MongoDB for data storage, and Redis for caching. The project can be orchestrated using either Kubernetes with Helm or Docker Compose.
- Kubernetes
- Helm
- Docker
- Docker Compose
- Image:
confluentinc/cp-zookeeper:latest - Ports: 2181
- Network:
kafka-network
- Image:
confluentinc/cp-kafka:latest - Ports: 9092, 9093 (use in docker)
- Depends on: Zookeeper
- Network:
kafka-network
- Image:
obsidiandynamics/kafdrop - Ports: 9000
- Depends on: Kafka
- Network:
kafka-network
- Image:
mongo - Ports: 27017
- Environment:
MONGO_INITDB_ROOT_USERNAME,MONGO_INITDB_ROOT_PASSWORD - Network:
db-network
- Image:
mongo-express - Ports: 8081
- Depends on: MongoDB
- Network:
db-network
- Image:
redis:latest - Ports: 6379
- Environment:
REDIS_PASSWORD - Command:
redis-server --requirepass root - Network:
cache-network
- Image:
rediscommander/redis-commander:latest - Ports: 8090
- Depends on: Redis
- Environment:
REDIS_HOST,REDIS_PORT,REDIS_PASSWORD - Network:
cache-network
- Build Context:
./auth-microservice - Target:
prodordev - Depends on: Kafka
- Environment:
JWT_SECRET,JWT_ACCESS_TOKEN_EXPIRES,JWT_REFRESH_TOKEN_EXPIRES,KAFKA_BROKER,KAFKA_CLIENT_ID,KAFKA_GROUP_ID - Networks:
gateway-network,kafka-network
- Build Context:
./user-microservice - Target:
prodordev - Depends on: Kafka, Redis, MongoDB
- Environment:
MONGO_HOST,MONGO_PORT,MONGO_USERNAME,MONGO_PASSWORD,MONGO_DATABASE,REDIS_HOST,REDIS_PORT,REDIS_PASSWORD,REDIS_DB,KAFKA_BROKER,KAFKA_CLIENT_ID,KAFKA_GROUP_ID - Networks:
gateway-network,kafka-network,cache-network,db-network
- Build Context:
./api-gateway - Target:
prodordev - Depends on: Kafka, Auth Service, User Service
- Environment:
APP_PORT,COOKIE_ACCESS_TOKEN_NAME,COOKIE_REFRESH_TOKEN_NAME,KAFKA_BROKER,KAFKA_CLIENT_ID,KAFKA_GROUP_ID,KAFKA_AUTH_SERVICE_GROUP_ID,KAFKA_USER_SERVICE_GROUP_ID - Ports: 3000
- Networks:
gateway-network,kafka-network
- gateway-network
- kafka-network
- db-network
- cache-network
-
Clone the repository:
git clone <your-repo-url> cd <your-repo-name>
-
Bring up the services:
docker-compose up -d
-
Access the services:
- API Gateway Swagger: http://localhost:3000/api
- Kafka UI: http://localhost:9000
- Mongo Express UI: http://localhost:8081
- Redis Commander UI: http://localhost:8090
Add the Ingress NGINX repository and install the Ingress controller.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace --set controller.replicaCount=1Add the Bitnami repository and install Kafka, Redis, and MongoDB.
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo updateLocal Testing:
helm install kafka bitnami/kafka --namespace kafka --create-namespace --set kafka.config.auto.create.topics.enable=true --set auth.enabled=false --set listeners.client.protocol=PLAINTEXT,listeners.controller.protocol=PLAINTEXT --set kafka.config."num.partitions"=3Advanced Setup:
helm install kafka bitnami/kafka --namespace kafka --create-namespace -f kafka/values.yamlLocal Testing:
helm install redis bitnami/redis --namespace redis --create-namespace --set auth.enabled=true --set auth.password=root --set replica.replicaCount=1Advanced Setup:
helm install redis bitnami/redis --namespace redis --create-namespace -f redis/values.yamlLocal Testing:
helm install mongo bitnami/mongodb --namespace mongo --create-namespace --set auth.rootUsername=root --set auth.rootPassword=root --set replicaSet.enabled=falseAdvanced Setup:
helm install mongo bitnami/mongodb --namespace mongo --create-namespace -f mongo/values.yamlkubectl apply -f k8s/namespace.yml
kubectl apply -f k8s/- Open a web browser or use a tool like
curlto access thegatewayservice via thelocalhosthost. - Api documents
localhost\api