A scalable, cloud-native web application designed to facilitate the creation, discovery, and booking of events using microservices architecture.
EventPlanner is built on a Microservices Architecture using Spring Boot, with the following core services:
- API Gateway (Port 8000): Single entry point for all client requests
- User Service (Port 8081): Identity management and authentication
- Event Catalog Service (Port 8082): Event creation, listing, and inventory
- Booking Service (Port 8083): Orchestration of ticket purchasing workflow
- Payment Service (Port 8084): Financial transaction processing (simulated)
- Notification Service (Port 8085): Asynchronous email notifications via RabbitMQ
- Discovery Server (Port 8761): Service registration and discovery (Eureka)
- Config Server (Port 8888): Centralized configuration management
- Java 17+ (OpenJDK or Oracle JDK)
- Maven 3.6+
- Docker & Docker Compose (for infrastructure)
- Git
| Component | Technology | Version |
|---|---|---|
| Framework | Spring Boot | 3.2.0 |
| Cloud | Spring Cloud | 2023.0.0 |
| Service Discovery | Netflix Eureka | Latest |
| API Gateway | Spring Cloud Gateway | Latest |
| Messaging | RabbitMQ | 3-management |
| Databases | PostgreSQL, MySQL, MongoDB | Latest |
| Build Tool | Maven | 3.6+ |
| JDK | OpenJDK/Oracle | 17 |
EventPlanner/
├── api-gateway/ # API Gateway Service
├── user-service/ # User Identity Service
├── event-service/ # Event Catalog Service
├── booking-service/ # Booking Orchestration Service
├── payment-service/ # Payment Processing Service
├── notification-service/ # Notification Service
├── discovery-server/ # Eureka Discovery Server
├── config-server/ # Config Server
├── docker-compose.yml # Infrastructure containers
├── pom.xml # Parent POM
├── README.md # This file
└── SYSTEM_DESIGN.md # System design documentation
git clone https://github.com/RaufkAk/EventPlanner.git
cd EventPlanner# Clean and build all modules
mvn clean package -DskipTests
# Or for detailed output:
mvn clean install -DskipTests# Start PostgreSQL, MySQL, MongoDB, and RabbitMQ
docker-compose up -d
# Verify containers are running
docker-compose psStart the services in the following order:
cd discovery-server
mvn spring-boot:run
# OR
java -jar target/discovery-server-0.0.1-SNAPSHOT.jarAccess Eureka Dashboard: http://localhost:8761
cd config-server
java -jar target/config-server-0.0.1-SNAPSHOT.jarSome services require connecting to the Docker infrastructure (PostgreSQL, MySQL). Use the docker profile for these:
# User Service (PostgreSQL)
java -jar -Dspring.profiles.active=docker user-service/target/user-service-0.0.1-SNAPSHOT.jar
# Booking Service (MySQL)
java -jar -Dspring.profiles.active=docker booking-service/target/booking-service-0.0.1-SNAPSHOT.jar# Event Service
java -jar event-service/target/event-service-0.0.1-SNAPSHOT.jar
# Payment Service
java -jar payment-service/target/payment-service-0.0.1-SNAPSHOT.jar
# Notification Service
java -jar notification-service/target/notification-service-0.0.1-SNAPSHOT.jar
# API Gateway
java -jar api-gateway/target/api-gateway-0.0.1-SNAPSHOT.jarThe project uses externalized configuration. Critical parameters can be overridden via environment variables or command line arguments:
| Service | Property | Environment Variable | Default |
|---|---|---|---|
| User Service | app.jwtSecret |
APP_JWT_SECRET |
yeditepe... |
| User Service | app.jwtExpirationMs |
APP_JWT_EXPIRATION |
86400000 |
| Notification | spring.mail.username |
MAIL_USERNAME |
763ef6e... |
| Notification | spring.mail.password |
MAIL_PASSWORD |
80fc078... |
Tip
You can set these in your IDE or pass them as -D arguments when running the JAR.
- Default (No profile): Uses H2 In-Memory database. Good for quick testing and development.
- Docker Profile (
-Dspring.profiles.active=docker): Connects to the databases defined indocker-compose.yml.- User Service -> PostgreSQL (Port 5432)
- Booking Service -> MySQL (Port 3306)
- Payment Service -> MySQL (Port 3306)
All endpoints go through the API Gateway (port 8000):
POST /users/auth/register- Register new userPOST /users/auth/login- Login and get JWT
GET /events- List all eventsGET /events/{id}- Get event detailsPOST /events- Create new event (requires JWT)PUT /events/{id}/stock- Update event stock
POST /bookings- Book ticketGET /bookings/{id}- Check booking status
POST /payments- Process payment
spring.datasource.url=jdbc:postgresql://localhost:5432/user_db
spring.datasource.username=admin
spring.datasource.password=passwordspring.datasource.url=jdbc:mysql://localhost:3306/booking_db
spring.datasource.username=root
spring.datasource.password=passwordspring.data.mongodb.uri=mongodb://admin:password@localhost:27017/event_db?authSource=adminspring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=password- User logs in via User Service → receives JWT token
- User browses events via Event Catalog Service
- User books ticket via API Gateway → Booking Service
- Booking Service orchestrates:
- Validates user (User Service)
- Checks stock (Event Service)
- Processes payment (Payment Service)
- Upon success, Booking Service publishes event to RabbitMQ
- Notification Service consumes message and sends confirmation email
- URL: http://localhost:8761
- View all registered microservices
- Check health status
- URL: http://localhost:15672
- Username:
admin - Password:
password
http://localhost:{port}/actuator/health- Service healthhttp://localhost:{port}/actuator/metrics- Metrics
mvn clean testmvn clean verifyThe project uses Spring Cloud Config Server for centralized configuration.
- Git URI:
https://github.com/RaufkAk/EventPlanner-Config.git - Configuration files are fetched at application startup
Create application-local.properties in each service's src/main/resources:
spring.cloud.config.enabled=false- Push code to GitHub
- Create web services on Render for each microservice
- Configure environment variables:
SPRING_DATASOURCE_URL=postgresql://... SPRING_DATASOURCE_USERNAME=... SPRING_DATASOURCE_PASSWORD=... EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=https://discovery-server.render.com/eureka
Build Docker images:
mvn clean package
docker build -t eventplanner:latest .
docker run -p 8000:8000 eventplanner:latest- JWT Authentication: All protected endpoints require valid JWT token
- HTTPS/TLS: Recommended for production deployment
- Secrets Management: Use environment variables for sensitive data
- CORS: Configured at API Gateway level
# Find and kill process using port
lsof -i :{port}
kill -9 {PID}- Check Discovery Server is running (port 8761)
- Verify
eureka.client.service-url.defaultZonein application.properties - Check network connectivity
- Ensure RabbitMQ container is running:
docker-compose ps - Check credentials in
application.properties - Test connection:
docker-compose exec rabbitmq rabbitmqctl status
- Verify MongoDB is running:
docker-compose logs mongodb - Check authentication credentials
- Try connecting directly:
mongosh mongodb://admin:password@localhost:27017
- Availability: 99.9% uptime
- Response Time: < 300ms for read operations
- Async Processing: < 5 seconds for email notifications
- Scalability: Horizontal scaling support for all services
{service}/target/
├── {service}-0.0.1-SNAPSHOT.jar # Executable JAR
├── {service}-0.0.1-SNAPSHOT.jar.original
├── classes/ # Compiled classes
├── generated-sources/ # Generated code
└── maven-archiver/ # Maven metadata
- H2 Database: Used for local development in Booking, Payment, and Event services
- MongoDB In-Memory: Embedded for local testing
- Mock Email: Notifications logged to console (not actual emails)
- Simulated Payments: No real banking integration
- Create a feature branch:
git checkout -b feature/your-feature - Commit changes:
git commit -am 'Add new feature' - Push to branch:
git push origin feature/your-feature - Submit a Pull Request
This project is licensed under the MIT License.
Project Team:
- Rauf Kutay Akyıldız - Booking Service
- Samet Laçin - User Service
- Erdoğan Efe Güner - Payment Service
- Selim Can Aydın - Event Catalog Service
- Ömer Yiğit Kartal - Notification Service
Course: COMP 301 - Fall 2025 University: Yeditepe University
Last Updated: 2026-01-01 Status: ✅ Production Ready