A distributed microservices application for managing student attendance, assignments, and academic progress. Built with Spring Boot, gRPC, RabbitMQ, Docker, and Kubernetes.
Browser/Client
↓
BFF (Port 8080) — JWT validation, request proxying
↓
┌─────────────────────────────────────────────────┐
│ Internal Services │
├─────────────────┬───────────────────────────────┤
│ Auth Service │ Student Service (+ gRPC) │
│ Port 8081 │ Port 8082 / gRPC 9090 │
├─────────────────┼───────────────────────────────┤
│ Attendance │ Assignment Service │
│ Service 8083 │ Port 8084 │
├─────────────────┴───────────────────────────────┤
│ Notification Service — Port 8085 │
└─────────────────────────────────────────────────┘
↓
RabbitMQ (Event Bus)
| Service | Port | Description |
|---|---|---|
| BFF | 8080 | Backend-for-Frontend, JWT validation, proxying |
| Auth Service | 8081 | User registration, login, JWT generation |
| Student Service | 8082 | Student profiles, gRPC endpoint |
| Attendance Service | 8083 | Attendance recording, 3-absence warning bot |
| Assignment Service | 8084 | Assignment management, grading |
| Notification Service | 8085 | Email notifications via RabbitMQ events |
| Database | Port | Service |
|---|---|---|
| authdb | 5432 | Auth Service |
| studentdb | 5433 | Student Service |
| attendancedb | 5434 | Attendance Service |
| assignmentdb | 5435 | Assignment Service |
| notificationdb | 5436 | Notification Service |
- Backend: Java 24, Spring Boot 4.0.6
- Communication: REST API, gRPC 1.77.1, RabbitMQ
- Authentication: JWT (jjwt 0.12.6)
- Database: PostgreSQL 16
- Frontend: Thymeleaf (server-side templates)
- Containerization: Docker
- Orchestration: Kubernetes (Minikube)
- Email: Mailtrap (development SMTP)
- Register and manage students
- Record attendance (Present, Late, Absent, Sick)
- Create assignments for all students at once
- Grade assignments with feedback categories
- Dashboard with overview stats and pending submissions
- View profile and attendance statistics
- See active and completed assignments
- Submit assignments with comments
- View grades and teacher feedback
- Receive email notifications for new assignments and grades
- Attendance warning fires automatically after 3 absences
- Email reminders sent when assignments are created
- Email notifications sent when assignments are graded
Assignment created → assignment.exchange → assignment-created queue
→ Notification Service → Email
Student submits → assignment.exchange → assignment-graded queue
→ Notification Service → Email
3rd absence recorded → attendance.exchange → attendance-warning queue
→ Notification Service → Email
- Docker Desktop
- Java 24
- Maven 3.9+
# Build all jars
cd auth-service && mvn clean package -DskipTests && cd ..
cd studentservice && mvn clean package -DskipTests && cd ..
cd attendanceservice && mvn clean package -DskipTests && cd ..
cd assignmentservice && mvn clean package -DskipTests && cd ..
cd notificationservice && mvn clean package -DskipTests && cd ..
cd bff && mvn clean package -DskipTests && cd ..
# Build Docker images
docker compose build
# Start everything
docker compose up -d
# Check all containers are running
docker compose psOpen browser at: http://localhost:8080
docker compose down- Minikube
- kubectl
# Start Minikube
minikube start --driver=docker --memory=4096 --cpus=2
# Load Docker images into Minikube
minikube image load academic-platform-authservice:latest
minikube image load academic-platform-studentservice:latest
minikube image load academic-platform-attendanceservice:latest
minikube image load academic-platform-assignmentservice:latest
minikube image load academic-platform-notificationservice:latest
minikube image load academic-platform-bff:latest
# Deploy all services
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/databases/
kubectl apply -f k8s/rabbitmq/
kubectl apply -f k8s/services/
# Verify all pods are running
kubectl get pods -n academic
# Get the application URL
minikube service bff -n academic --urlServices communicate via Kubernetes internal DNS — no IP addresses:
authservice → jdbc:postgresql://authdb:5432/authdb
studentservice → jdbc:postgresql://studentdb:5432/studentdb
bff → http://auth-service:8081
bff → http://student-service:8082
attendanceservice → rabbitmq:5672
# Tag new version
docker tag academic-platform-bff:latest academic-platform-bff:v2
minikube image load academic-platform-bff:v2
# Update yaml image tag and apply
kubectl apply -f k8s/services/bff.yaml
# Restart all deployments
kubectl rollout restart deployment -n academic
kubectl get pods -n academic --watchAll requests go through BFF on port 8080. JWT token required in Authorization: Bearer <token> header for all endpoints except auth.
POST /api/auth/register — Register new user
POST /api/auth/login — Login, returns JWT token
POST /api/students — Create student profile
GET /api/students/{id} — Get student
GET /api/students/teacher/{teacherId} — Get teacher's students
PUT /api/students/{id} — Update student
DELETE /api/students/{id} — Delete student
POST /api/attendance — Record attendance
GET /api/attendance/student/{id} — Get student attendance
GET /api/attendance/student/{id}/stats — Get attendance statistics
POST /api/assignments — Create assignment (single student)
POST /api/assignments/all — Create assignment for all students
GET /api/assignments/{id} — Get assignment
GET /api/assignments/student/{studentId} — Get student assignments
GET /api/assignments/teacher/{teacherId} — Get teacher assignments
PUT /api/assignments/{id}/grade — Grade assignment
PUT /api/assignments/{id}/submit — Submit assignment
GET /api/notifications/student/{id} — Get student notifications
GET /api/notifications/recent — Get recent notifications
academic-platform/
├── auth-service/ — JWT auth, user registration
├── studentservice/ — Student profiles, gRPC server
├── attendanceservice/ — Attendance tracking, warning events
├── assignmentservice/ — Assignments, grading, events
├── notificationservice/ — Email notifications, event consumer
├── bff/ — API gateway, JWT validation, Thymeleaf UI
│ └── src/main/resources/
│ └── templates/ — HTML pages (Thymeleaf)
├── proto/ — Shared gRPC contract definitions
├── k8s/ — Kubernetes manifests
│ ├── namespace.yaml
│ ├── databases/
│ ├── rabbitmq/
│ └── services/
└── docker-compose.yml — Local development setup
- JWT tokens validated on every request at BFF level
- Passwords hashed with BCrypt
- Internal services not exposed outside Docker/Kubernetes network
- Services communicate via internal DNS only
- Role-based access: TEACHER and STUDENT roles