Architecture
Table of Contents
Why it exists
Every track needs something to test. Public demo sites are slow, rate-limited and change without notice. A client's system cannot be used for a public guide. So the playground is ours: a realistic shape (auth, a catalogue, a checkout, a payment callback, an admin back office) with none of the operational baggage.
How: the four pieces
| Piece | Technology | Purpose |
|---|---|---|
| Shop and admin UI | Next.js 15 | What Playwright clicks on |
| API | Spring Boot 3 (Java 21) | What JMeter and k6 hit; Swagger UI included |
| Database | Postgres 16 | Real transactions, real contention |
| Mock payment gateway | SoapUI open source | Hosted pay page, signed callback, adjustable delay |
How: one order through the system
One order touches every piece, in this order:
- Load the shop. The browser gets the pages from
webon port 3000. - Menu and order. The shop's JavaScript calls
apion port 8080 directly, not throughweb. The api prices the order on the server and saves it in Postgres. - Create a bill. The api asks
mock-gatewayfor a bill and gets back apayUrl. This call stays inside the Docker network. - Pay. The browser opens the
payUrlon port 8090, and the customer clicks Pay. - Callback. The mock sends a signed callback to the api (
http://api:8080, again inside Docker), and the api marks the order PAID. The mock then sends the browser back to the confirmation page onweb.
Tips
- Playwright goes through the browser, so a UI test covers all five steps the way a customer sees them.
- k6 and JMeter skip the browser and
webentirely. They send the same API calls a browser would, so load lands on the api and Postgres, which is where a real shop hurts first. - Load scripts choose whether to include the payment hop. They can pay on the
payUrlthemselves (steps 3 to 5), or sendautoPay: trueto skip the gateway and measure order throughput alone. See For load testers.