This repository contains a bunch of examples of how to deal with common technical challenges, which developers face frequently, when implementing services with SpringBoot.
The project structure is oriented to domain driven design (DDD) and clean architecture. However, the primary purpose of this repository is to serve continuing education, and therefore the architectural concepts are not consistently followed.
- Feign - Declarative REST Client
- used to implement a REST client
- Example
- RabbitMQ
- Listener Example
- Integration tested with Testcontainers
- JMS - ActiveMQ
- Producer Example
- Integration test with Testcontainers
Unit Tests follow the naming pattern "Test".
Integration Tests follow the naming pattern "IT". An integration test scenario is created with tools, which can be easily integrated into JUnit & SpringBoot.
- WireMock
- used to test outgoing http requests
- Example
- Testcontainers
- used to start any type of external services, i.e. databases or message queues.
- Example
- Awaitility
- used to ensure a given state after a given time. Practical especially for asynchronous communications.
- Example
- ArchUnit
- used to enforce a defined architecture patterns, conventions and much more
- Examples:
- jib
- used to build an image without a Docker daemon
- Example
- Docker Compose
- used to start the service together with the surrounding infrastructure, i.e. message broker, databases, etc.
- Example
- Semantic Release
- used to create releases based on semantic versioning. With the conventional commits, the proper release version (MAJOR.MINOR.PATCH) will be resolved.
- This repository follows Conventional Commits
- Distroless container images contain only your application and its runtime dependencies. They do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution.