Initialize Spring Boot Microservices Architecture with Docker Compose
This Pull Request lays the foundational infrastructure for a robust Spring Boot microservices architecture, leveraging Docker Compose for container orchestration. It encompasses service setup, security configurations, service discovery, resilience mechanisms, distributed tracing, and monitoring.
- Microservices: Initialized core microservices including
Order Service
,Product Service
, andInventory Service
, each with dedicated databases (MongoDB
for Product andPostgres
for Order and Inventory services). - API Gateway: Setup an API Gateway to act as the single entry point for all service requests, enhancing security and simplifying client interactions.
- Security: Integrated
Keycloak
with OAuth 2.0 for secure authentication and authorization across services. - Service Discovery: Employed
Eureka
for dynamic service discovery, enabling services to find and communicate with each other seamlessly. - Circuit Breaker: Implemented Circuit Breaker patterns to ensure system resilience and fault tolerance.
- Distributed Tracing: Configured
Zipkin
andSleuth
for effective monitoring and troubleshooting of inter-service communications. - Monitoring: Utilized
Prometheus
andGrafana
for real-time monitoring and visualization of service health metrics. - Logging: Established a centralized logging mechanism using
Kafka
, facilitating efficient log aggregation and analysis. - Containerization: Defined
Docker Compose
configurations for each service, ensuring consistent environments across development, testing, and production stages.
The PR includes detailed docker-compose.yml
configurations for setting up the entire infrastructure, Dockerfiles for containerization of each microservice, and initial Spring Boot application setups with necessary dependencies for web, security, JPA, MongoDB, Eureka client, and more.
Based on your Docker Compose file, I'll organize an endpoint documentation and a process flowchart to better understand and utilize your microservices architecture.
-
Postgres for Order Service
- Internal Port: 5431
- External Access Port: 5431
-
Postgres for Inventory Service
- Internal Port: 5432
- External Access Port: 5432
-
MongoDB for Product Service
- Internal Port: 27017
- External Access Port: 27017
-
Keycloak (OAuth 2.0 Security)
- Internal Port: 8080
- External Access Port: 8080
-
Eureka (Service Discovery)
- Internal Port: 8761
- External Access Port: 8761
-
Zipkin (Distributed Tracing)
- Internal Port: 9411
- External Access Port: 9411
-
API Gateway
- Internal Port: 8080
- External Access Port: 8181
-
Kafka (Centralized Logging and Notification)
- Internal Port: 9092
- External Access Port: 9092
-
Prometheus (Monitoring)
- Internal Port: 9090
- External Access Port: 9090
-
Grafana (Monitoring Dashboard)
- Internal Port: 3000
- External Access Port: 3000
Next, I'll create a flowchart to show how these services interact and cooperate with each other.
- User requests enter the system through the API Gateway.
- API Gateway uses Keycloak for authentication and authorization.
- Authenticated requests are routed to the respective microservices (like Order Service, Product Service, Inventory Service).
- Microservices can discover each other through Eureka for inter-service communication.
- Inter-service communication can be traced using Zipkin and Sleuth for problem-solving and performance monitoring.
- Prometheus and Grafana provide health monitoring and visualization of the system.
- Kafka is used for centralized logging and notification systems, facilitating log management and event-driven message passing.
![grafana-vitualize-prometheus](https://private-user-images.githubusercontent.com/137085653/309591828-8de4aa54-3109-4400-bcfc-bf209edf5c5e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzA5NTkxODI4LThkZTRhYTU0LTMxMDktNDQwMC1iY2ZjLWJmMjA5ZWRmNWM1ZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04ZTFlMTJjZTdjNGIxNDYyYjg5YTJhOTc0OGY0Yjc0MTY1NTYyYzJlMDczNDRiODY0ODE2ODBiNzUzNTY1NGM1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.MprWViYhx04A1IqoiD9T355syRLSC1WaNbKWx1k3_G0)
![prometheus-targets](https://private-user-images.githubusercontent.com/137085653/309591911-b7e4bc62-e151-4c2b-a02d-a06748c54214.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzA5NTkxOTExLWI3ZTRiYzYyLWUxNTEtNGMyYi1hMDJkLWEwNjc0OGM1NDIxNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03MjgzNTU2NDdiNTk4MzNiMWU1MDMwMWU5ZmFiMDIzYTljNmZjMzUwMmExNGY4OWJiNTM1MjA2Y2M3M2Y2NGUyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.i6KUXX4XUHBWkY86p-ceTr-weOZh8LXuW906kD77nL0)
![eureka-services-discovery](https://private-user-images.githubusercontent.com/137085653/309591787-7b7452bb-4cb5-4bfd-be7a-cb0dffae3cff.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzA5NTkxNzg3LTdiNzQ1MmJiLTRjYjUtNGJmZC1iZTdhLWNiMGRmZmFlM2NmZi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05ZDkwMjc5N2M1NmM5MTUxNzUyYWI5ZDUwZjg4OGEyZDZmNDVlNDBhOTJhNzgxNTMyYTRhZmY0NzY2ZWZlNTc5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.h52-qyIwyd4Iwo7u7382_JkYUUZrB59B7q2GgciohMc)
![kibana](https://private-user-images.githubusercontent.com/137085653/312667181-c113acf6-5d04-4b72-9e37-c57c4625e593.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzEyNjY3MTgxLWMxMTNhY2Y2LTVkMDQtNGI3Mi05ZTM3LWM1N2M0NjI1ZTU5My5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02YzllNmQ5NThiMzEwNDlhMzNiN2MwNWI5ZTkwZmMzYWQxNWEwODU4MDM2ZGNjZTVkZDg1ZWNiNmIxNGI2ZTg5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.ifmSmrtI-F5Z2HP0t8Ug7-fHMBsz_assWlXSuONh8Oc)
![postman-place-order](https://private-user-images.githubusercontent.com/137085653/309592099-90d55612-032a-437b-b867-3705ef763cd1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzA5NTkyMDk5LTkwZDU1NjEyLTAzMmEtNDM3Yi1iODY3LTM3MDVlZjc2M2NkMS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00YjgyMTgzNWM5ZGRkM2ZmMDI3MzQ5YWQ1M2VmOGY0M2E1NmZlOGM2Y2UyNzZiNTIzYzI2ZDJkMjYzMDFhM2NlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.4gUHhpTXHhifRDE3El8DpGPkKZI3B49IEX8rSx0joGU)
![postman-get-prodcuts](https://private-user-images.githubusercontent.com/137085653/309592114-ff114104-1ab0-44af-95ea-5c1727462b13.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzA5NTkyMTE0LWZmMTE0MTA0LTFhYjAtNDRhZi05NWVhLTVjMTcyNzQ2MmIxMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mZjRiMzI3ZWJhMmZkNzVlODJhMGFiMzcwMTA4ODY4ZTE4YzE1NTgyNDFlZmM3YmUwYmUzMGVhZDgyYTkxOGIxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.Cc5cq4P6epPV03HToCcpynI_gVsPyIINOipM5GXEEro)
![postman-search](https://private-user-images.githubusercontent.com/137085653/312667212-14db8599-8599-4e82-9318-b34c896789bd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzOTg2NTgsIm5iZiI6MTcyMTM5ODM1OCwicGF0aCI6Ii8xMzcwODU2NTMvMzEyNjY3MjEyLTE0ZGI4NTk5LTg1OTktNGU4Mi05MzE4LWIzNGM4OTY3ODliZC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcxOVQxNDEyMzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mNjFlMjFjODc3ZGNhMzhhZWZmMWIzNTFmMzlkYWQwYzk5ZDY5ZjNjNzg1YTI5ZWE3NzAxYjI2MjA0MTQyZWUwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.yLjN4bOIYVS6eEXRTaXSq8c7K4BvDgS4QGhVpXdLPLU)