Java · Spring · Thymeleaf
I build backends with Java and Spring.
I’m a software engineer working on backends with Java and Spring. This blog is where I write down what I learn along the way — the patterns that hold up, the places I trip, and the reasoning behind a technical choice.
Type to search — try java, spring boot, microservices
ReleaseFlow
Turn merged pull requests into human-reviewed release notes: rules before AI, one note per audience, and immutable once published.
Recent posts
showing 10 of 14-
E-commerce microservices #7: inventory-service and order-service
Two services the book does not have: inventory-service keeps stock levels, order-service accepts orders. The product page shows how many items are left, the server computes order totals, and three databases share one MySQL server while staying separate.
-
E-commerce microservices #6: MongoDB, MySQL and database per service
Replacing the simulated data with real databases: MongoDB for product and recommendation, MySQL for review, one database per service. With reactive Spring Data, JPA on its own scheduler, MapStruct, Testcontainers tests, and create and delete APIs through the composite.
-
E-commerce microservices #5: API documentation with OpenAPI and Swagger UI
Adding springdoc-openapi to product-composite: documenting the API right in the interfaces of the api module, moving the documentation text into configuration, and trying the API from Swagger UI. This wraps up the foundations part of the series.
-
E-commerce microservices #4: packaging with Docker, running everything with Docker Compose
Packaging four microservices as layered Docker images, understanding how the JVM sees a container's CPU and memory, running the whole system with Docker Compose, and testing it end to end with a bash script.
-
E-commerce microservices #3: review, recommendation and the product page aggregator
Adding review-service, recommendation-service and product-composite-service: calling three services in parallel with WebClient and Mono.zip, turning HTTP errors back into exceptions, and keeping the product page alive when a secondary service is down.
-
E-commerce microservices #2: the first service with Spring WebFlux
Building product-service: a controller written from a shared interface, Project Reactor's Mono, global error handling, trying it with curl and testing it with WebTestClient.
-
E-commerce microservices #1: what we are building, and the Gradle project skeleton
The start of a series on building an e-commerce platform as microservices with Spring Boot 3 and Spring Cloud: why microservices, what the system looks like, and a Gradle multi-project skeleton with two shared modules.
-
Securing and operating a tool that holds the keys to every database
Part 3 of the Database Backup Utility series: AES-256-GCM credentials opened in exactly one place, secrets that never travel through argv, one operator account with its costs written down, a CLI that is a client of the HTTP API, and CI that proves each release was built from the right source.
-
Seven database engines and one question: will this backup restore?
Part 2 of the Database Backup Utility series: routing backups by engine without pretending the engines are alike, a SHA-256 for every artifact, streamed restores, storage profiles, and test-restoring each backup into a disposable Docker database.
-
Building Database Backup Utility: hexagonal architecture and vertical slices
Part 1 of the Database Backup Utility series: why the scope stays narrow, five Maven modules whose boundaries are compile errors, driving native database clients instead of JDBC, and running background jobs without ever lying to the operator.