# in28minutes/spring-microservices-v2 architecture

> Architecture diagram of the GitHub repository in28minutes/spring-microservices-v2, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/in28minutes/spring-microservices-v2
- Repository: https://github.com/in28minutes/spring-microservices-v2

## Overview

This repository is a Spring Boot learning codebase: it pairs a REST API example with a progressively assembled microservices system and Docker/Kubernetes variants. The main service workflow is a client request to currency conversion, which obtains an exchange rate from the exchange service and returns a converted amount; the gateway, registry, configuration, and resilience features support that system. It also includes REST examples for users, filtering, versioning, and error handling. Some microservice capabilities are documented in the README but their wiring is unsampled, so those links are shown only where documented.

Main entry points: [`03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyConversionController.java`](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyConversionController.java) (Conversion service), [`03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeController.java`](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeController.java) (Exchange service), [`03.microservices/api-gateway/src/main/java/com/in28minutes/microservices/apigateway/ApiGatewayConfiguration.java`](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/api-gateway/src/main/java/com/in28minutes/microservices/apigateway/ApiGatewayConfiguration.java) (API gateway), [`03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/controller/LimitsController.java`](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/controller/LimitsController.java) (Limits service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_rest["REST API examples"]
  node_rest_entry["REST endpoints"]
  node_user_api["User resources<br/>[UserResource.java]"]
  node_user_jpa_api["JPA user API"]
  node_user_store[("User DAO")]
  node_user_entity["User model<br/>[User.java]"]
  node_error_handling["Error handling"]
  node_filtering["Response filtering"]
  node_filter_model["Filter model<br/>[SomeBean.java]"]
  node_versioning["API versioning"]
end

subgraph group_services["Microservices"]
  node_limits["Limits service"]
  node_config_values["Limits configuration<br/>[Configuration.java]"]
  node_conversion["Conversion service"]
  node_exchange_proxy["Exchange client"]
  node_exchange["Exchange service"]
  node_exchange_store[("Exchange repository")]
end

subgraph group_platform["Cloud platform"]
  node_config_server["Config server"]
  node_gateway["API gateway"]
  node_registry["Eureka registry"]
  node_resilience["Circuit breaker"]
  node_zipkin["Zipkin tracing"]
  node_rabbitmq["RabbitMQ messaging"]
end

subgraph group_deployment["Deployment variants"]
  node_docker_variant["Docker services<br/>[04.docker]"]
  node_kubernetes_variant["Kubernetes services<br/>[05.kubernetes]"]
end

node_api_client(("API client"))

node_api_client -->|"requests"| node_rest_entry
node_rest_entry -->|"returns response"| node_api_client
node_api_client -->|"requests"| node_user_api
node_user_api -->|"uses DAO"| node_user_store
node_user_store -->|"stores users"| node_user_entity
node_user_jpa_api -.->|"uses model"| node_user_entity
node_error_handling -->|"handles not-found"| node_user_entity
node_filtering -->|"filters fields"| node_filter_model
node_api_client -->|"selects version"| node_versioning
node_api_client -->|"requests limits"| node_limits
node_limits -->|"reads settings"| node_config_values
node_limits -.->|"loads config"| node_config_server
node_api_client -.->|"routes request"| node_gateway
node_gateway -.->|"routes to"| node_conversion
node_conversion -->|"invokes client"| node_exchange_proxy
node_exchange_proxy -->|"requests rate"| node_exchange
node_exchange -.->|"queries rates"| node_exchange_store
node_conversion -->|"returns conversion"| node_api_client
node_conversion -.->|"registers service"| node_registry
node_exchange -.->|"registers service"| node_registry
node_gateway -.->|"discovers routes"| node_registry
node_exchange -.->|"exposes fallback"| node_resilience
node_conversion -.->|"traces requests"| node_zipkin
node_gateway -.->|"traces requests"| node_zipkin
node_exchange -.->|"traces requests"| node_zipkin
node_conversion -.->|"uses messaging"| node_rabbitmq
node_docker_variant -.->|"packages service"| node_conversion
node_docker_variant -.->|"packages service"| node_exchange
node_kubernetes_variant -.->|"deploys service"| node_conversion
node_kubernetes_variant -.->|"deploys service"| node_exchange

click node_rest_entry "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java"
click node_user_api "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserResource.java"
click node_user_jpa_api "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserJpaResource.java"
click node_user_store "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java"
click node_user_entity "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java"
click node_error_handling "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java"
click node_filtering "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java"
click node_filter_model "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/SomeBean.java"
click node_versioning "https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java"
click node_limits "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/controller/LimitsController.java"
click node_config_values "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/configuration/Configuration.java"
click node_config_server "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/spring-cloud-config-server/src/main/java/com/in28minutes/microservices/springcloudconfigserver/SpringCloudConfigServerApplication.java"
click node_conversion "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyConversionController.java"
click node_exchange_proxy "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyExchangeProxy.java"
click node_exchange "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeController.java"
click node_exchange_store "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeRepository.java"
click node_gateway "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/api-gateway/src/main/java/com/in28minutes/microservices/apigateway/ApiGatewayConfiguration.java"
click node_registry "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/naming-server/src/main/java/com/in28minutes/microservices/namingserver/NamingServerApplication.java"
click node_resilience "https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CircuitBreakerController.java"
click node_docker_variant "https://github.com/in28minutes/spring-microservices-v2/tree/main/04.docker"
click node_kubernetes_variant "https://github.com/in28minutes/spring-microservices-v2/tree/main/05.kubernetes"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_rest_entry,node_user_api,node_user_jpa_api,node_user_store,node_user_entity,node_error_handling,node_filtering,node_filter_model,node_versioning,node_api_client toneBlue
class node_limits,node_config_values,node_conversion,node_exchange_proxy,node_exchange,node_exchange_store toneAmber
class node_config_server,node_gateway,node_registry,node_resilience,node_zipkin,node_rabbitmq toneMint
class node_docker_variant,node_kubernetes_variant toneRose
```

## Components

### REST API examples

- [REST endpoints](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java`
- [User resources](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserResource.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserResource.java`
- [JPA user API](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserJpaResource.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserJpaResource.java`
- [User DAO](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java`
- [User model](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/User.java`
- [Error handling](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java`
- [Response filtering](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java`
- [Filter model](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/SomeBean.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/SomeBean.java`
- [API versioning](https://github.com/in28minutes/spring-microservices-v2/blob/main/02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java): `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java`

### Microservices

- [Limits service](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/controller/LimitsController.java): `03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/controller/LimitsController.java`
- [Limits configuration](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/configuration/Configuration.java): `03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/configuration/Configuration.java`
- [Conversion service](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyConversionController.java): `03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyConversionController.java`
- [Exchange client](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyExchangeProxy.java): `03.microservices/currency-conversion-service/src/main/java/com/in28minutes/microservices/currencyconversionservice/CurrencyExchangeProxy.java`
- [Exchange service](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeController.java): `03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeController.java`
- [Exchange repository](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeRepository.java): `03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CurrencyExchangeRepository.java`

### Cloud platform

- [Config server](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/spring-cloud-config-server/src/main/java/com/in28minutes/microservices/springcloudconfigserver/SpringCloudConfigServerApplication.java): `03.microservices/spring-cloud-config-server/src/main/java/com/in28minutes/microservices/springcloudconfigserver/SpringCloudConfigServerApplication.java`
- [API gateway](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/api-gateway/src/main/java/com/in28minutes/microservices/apigateway/ApiGatewayConfiguration.java): `03.microservices/api-gateway/src/main/java/com/in28minutes/microservices/apigateway/ApiGatewayConfiguration.java`
- [Eureka registry](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/naming-server/src/main/java/com/in28minutes/microservices/namingserver/NamingServerApplication.java): `03.microservices/naming-server/src/main/java/com/in28minutes/microservices/namingserver/NamingServerApplication.java`
- [Circuit breaker](https://github.com/in28minutes/spring-microservices-v2/blob/main/03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CircuitBreakerController.java): `03.microservices/currency-exchange-service/src/main/java/com/in28minutes/microservices/currencyexchangeservice/CircuitBreakerController.java`
- **Zipkin tracing**
- **RabbitMQ messaging**

### Deployment variants

- [Docker services](https://github.com/in28minutes/spring-microservices-v2/tree/main/04.docker): `04.docker`
- [Kubernetes services](https://github.com/in28minutes/spring-microservices-v2/tree/main/05.kubernetes): `05.kubernetes`

### Other components

- **API client**

## Connections

- API client → REST endpoints: requests
- REST endpoints → API client: returns response (evidence: `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/helloworld/HelloWorldController.java`)
- API client → User resources: requests
- User resources → User DAO: uses DAO
- User DAO → User model: stores users (evidence: `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/user/UserDaoService.java`)
- JPA user API → User model: uses model
- Error handling → User model: handles not-found (evidence: `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/exception/CustomizedResponseEntityExceptionHandler.java`)
- Response filtering → Filter model: filters fields (evidence: `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/filtering/FilteringController.java`)
- API client → API versioning: selects version (evidence: `02.restful-web-services/src/main/java/com/in28minutes/rest/webservices/restfulwebservices/versioning/VersioningPersonController.java`)
- API client → Limits service: requests limits
- Limits service → Limits configuration: reads settings (evidence: `03.microservices/limits-service/src/main/java/com/in28minutes/microservices/limitsservice/controller/LimitsController.java`)
- Limits service → Config server: loads config
- API client → API gateway: routes request
- API gateway → Conversion service: routes to
- Conversion service → Exchange client: invokes client
- Exchange client → Exchange service: requests rate
- Exchange service → Exchange repository: queries rates
- Conversion service → API client: returns conversion
- Conversion service → Eureka registry: registers service
- Exchange service → Eureka registry: registers service
- API gateway → Eureka registry: discovers routes
- Exchange service → Circuit breaker: exposes fallback
- Conversion service → Zipkin tracing: traces requests
- API gateway → Zipkin tracing: traces requests
- Exchange service → Zipkin tracing: traces requests
- Conversion service → RabbitMQ messaging: uses messaging
- Docker services → Conversion service: packages service
- Docker services → Exchange service: packages service
- Kubernetes services → Conversion service: deploys service
- Kubernetes services → Exchange service: deploys service
