# anurag171/springboot-apachepulsar-jwt architecture

> Architecture diagram of the GitHub repository anurag171/springboot-apachepulsar-jwt, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/anurag171/springboot-apachepulsar-jwt
- Repository: https://github.com/anurag171/springboot-apachepulsar-jwt

## Overview

This is a five-service IoT telemetry pipeline: simulated devices generate readings from stored device definitions, publish events to Pulsar, and a consumer validates and stores them in MongoDB. Users authenticate to the metrics API, then query aggregates by sensor or sensor group over a time interval. The README documents gateway routing and Eureka discovery. API handler, router, authentication, and client source excerpts support the internal links shown; the storage and infrastructure links follow the README, since their implementation was not sampled.

Main entry points: [`DataStore/src/main/java/com/anurag/iot/data/consumer/service/DataConsumer.java`](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/service/DataConsumer.java) (Event consumer), [`IotMetricsApi/src/main/java/com/anurag/iot/data/api/router/MetricsRouter.java`](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/router/MetricsRouter.java) (Metrics routes), [`IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationController.java`](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationController.java) (Login endpoint), [`MetricGateway/src/main/java/com/anurag/iot/data/gateway/MetricGateway/MetricGatewayApplication.java`](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/MetricGateway/src/main/java/com/anurag/iot/data/gateway/MetricGateway/MetricGatewayApplication.java) (Metric gateway)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_simulation["Device simulation"]
  node_client_app["Client service"]
  node_initializer["Data initializer"]
  node_device_master["Device definitions<br/>[IotDataMaster.java]"]
  node_producer["Event producer<br/>[Producer.java]"]
  node_client_repo["Device repository"]
end

subgraph group_ingestion["Event ingestion"]
  node_consumer_app["Consumer service"]
  node_consumer["Event consumer<br/>[DataConsumer.java]"]
  node_validation["Data validation<br/>[IotData.java]"]
  node_mongo_ops["Mongo operations"]
end

subgraph group_metrics["Metrics API"]
  node_api["Metrics API"]
  node_router["Metrics routes<br/>[MetricsRouter.java]"]
  node_filter["Request validation"]
  node_handler["Metric handlers"]
  node_dao["Metrics queries<br/>[MetricsDao.java]"]
end

subgraph group_security["API security"]
  node_auth_controller["Login endpoint"]
  node_user_service["User lookup<br/>[UserService.java]"]
  node_jwt["JWT utility<br/>[JWTUtil.java]"]
  node_security_context["Bearer context"]
  node_auth_manager["Token validation"]
end

subgraph group_routing["Service routing"]
  node_gateway["Metric gateway"]
  node_discovery["Eureka discovery"]
end

node_device_actor(("IoT devices"))
node_device_db[("Device MongoDB")]
node_pulsar["Pulsar topic"]
node_iot_db[("IOTDATA collection")]
node_api_user(("API user"))

node_device_actor -->|"simulates readings"| node_client_app
node_client_app -->|"initializes data"| node_initializer
node_initializer -->|"stores definitions"| node_client_repo
node_client_repo -->|"reads and writes"| node_device_db
node_producer -->|"uses bounds"| node_device_master
node_producer -->|"publishes events"| node_pulsar
node_pulsar -->|"delivers events"| node_consumer
node_consumer_app -->|"runs"| node_consumer
node_consumer -->|"validates fields"| node_validation
node_consumer -->|"persists data"| node_mongo_ops
node_mongo_ops -->|"writes records"| node_iot_db
node_api_user -->|"sends requests"| node_gateway
node_gateway -->|"finds instances"| node_discovery
node_gateway -->|"routes requests"| node_api
node_discovery -->|"registers service"| node_api
node_api_user -->|"submits credentials"| node_auth_controller
node_auth_controller -->|"looks up user"| node_user_service
node_auth_controller -->|"issues token"| node_jwt
node_api_user -->|"sends bearer token"| node_security_context
node_security_context -->|"authenticates token"| node_auth_manager
node_auth_manager -->|"validates token"| node_jwt
node_api -->|"serves routes"| node_router
node_router -->|"filters requests"| node_filter
node_router -->|"dispatches routes"| node_handler
node_handler -->|"queries metrics"| node_dao
node_dao -->|"reads records"| node_iot_db

click node_client_app "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/IopClientApplication.java"
click node_initializer "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/initialize/IotDataInitializer.java"
click node_device_master "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/data/IotDataMaster.java"
click node_producer "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/service/Producer.java"
click node_client_repo "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/repository/IotDataReactiveRepository.java"
click node_consumer_app "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/DataStoreApplication.java"
click node_consumer "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/service/DataConsumer.java"
click node_validation "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/data/IotData.java"
click node_mongo_ops "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/dao/MongoDbOperations.java"
click node_gateway "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/MetricGateway/src/main/java/com/anurag/iot/data/gateway/MetricGateway/MetricGatewayApplication.java"
click node_discovery "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/MetricDiscovery/src/main/java/com/anurag/iop/data/discovery/MetricDiscovery/MetricDiscoveryApplication.java"
click node_auth_controller "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationController.java"
click node_user_service "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/UserService.java"
click node_jwt "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/JWTUtil.java"
click node_security_context "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/SecurityContextRepository.java"
click node_auth_manager "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationManager.java"
click node_api "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/IotMetricsApiApplication.java"
click node_router "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/router/MetricsRouter.java"
click node_filter "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/filter/MetricHandlerFilterFunction.java"
click node_handler "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/handler/MetricsHandler.java"
click node_dao "https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/repository/MetricsDao.java"

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_client_app,node_initializer,node_device_master,node_producer,node_client_repo,node_api_user toneBlue
class node_consumer_app,node_consumer,node_validation,node_mongo_ops,node_device_db,node_iot_db toneAmber
class node_api,node_router,node_filter,node_handler,node_dao toneMint
class node_auth_controller,node_user_service,node_jwt,node_security_context,node_auth_manager toneRose
class node_gateway,node_discovery,node_device_actor,node_pulsar toneIndigo
```

## Components

### Device simulation

- [Client service](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/IopClientApplication.java): `IotClient/src/main/java/com/anurag/iot/client/IopClientApplication.java`
- [Data initializer](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/initialize/IotDataInitializer.java): `IotClient/src/main/java/com/anurag/iot/client/initialize/IotDataInitializer.java`
- [Device definitions](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/data/IotDataMaster.java): `IotClient/src/main/java/com/anurag/iot/client/data/IotDataMaster.java`
- [Event producer](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/service/Producer.java): `IotClient/src/main/java/com/anurag/iot/client/service/Producer.java`
- [Device repository](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotClient/src/main/java/com/anurag/iot/client/repository/IotDataReactiveRepository.java): `IotClient/src/main/java/com/anurag/iot/client/repository/IotDataReactiveRepository.java`

### Event ingestion

- [Consumer service](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/DataStoreApplication.java): `DataStore/src/main/java/com/anurag/iot/data/consumer/DataStoreApplication.java`
- [Event consumer](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/service/DataConsumer.java): `DataStore/src/main/java/com/anurag/iot/data/consumer/service/DataConsumer.java`
- [Data validation](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/data/IotData.java): `DataStore/src/main/java/com/anurag/iot/data/consumer/data/IotData.java`
- [Mongo operations](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/DataStore/src/main/java/com/anurag/iot/data/consumer/dao/MongoDbOperations.java): `DataStore/src/main/java/com/anurag/iot/data/consumer/dao/MongoDbOperations.java`

### Metrics API

- [Metrics API](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/IotMetricsApiApplication.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/IotMetricsApiApplication.java`
- [Metrics routes](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/router/MetricsRouter.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/router/MetricsRouter.java`
- [Request validation](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/filter/MetricHandlerFilterFunction.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/filter/MetricHandlerFilterFunction.java`
- [Metric handlers](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/handler/MetricsHandler.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/handler/MetricsHandler.java`
- [Metrics queries](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/repository/MetricsDao.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/repository/MetricsDao.java`

### API security

- [Login endpoint](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationController.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationController.java`
- [User lookup](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/UserService.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/UserService.java`
- [JWT utility](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/JWTUtil.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/JWTUtil.java`
- [Bearer context](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/SecurityContextRepository.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/SecurityContextRepository.java`
- [Token validation](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationManager.java): `IotMetricsApi/src/main/java/com/anurag/iot/data/api/security/AuthenticationManager.java`

### Service routing

- [Metric gateway](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/MetricGateway/src/main/java/com/anurag/iot/data/gateway/MetricGateway/MetricGatewayApplication.java): `MetricGateway/src/main/java/com/anurag/iot/data/gateway/MetricGateway/MetricGatewayApplication.java`
- [Eureka discovery](https://github.com/anurag171/springboot-apachepulsar-jwt/blob/master/MetricDiscovery/src/main/java/com/anurag/iop/data/discovery/MetricDiscovery/MetricDiscoveryApplication.java): `MetricDiscovery/src/main/java/com/anurag/iop/data/discovery/MetricDiscovery/MetricDiscoveryApplication.java`

### Other components

- **IoT devices**
- **Device MongoDB**
- **Pulsar topic**
- **IOTDATA collection**
- **API user**

## Connections

- IoT devices → Client service: simulates readings
- Client service → Data initializer: initializes data
- Data initializer → Device repository: stores definitions
- Device repository → Device MongoDB: reads and writes
- Event producer → Device definitions: uses bounds
- Event producer → Pulsar topic: publishes events
- Pulsar topic → Event consumer: delivers events
- Consumer service → Event consumer: runs
- Event consumer → Data validation: validates fields
- Event consumer → Mongo operations: persists data
- Mongo operations → IOTDATA collection: writes records
- API user → Metric gateway: sends requests
- Metric gateway → Eureka discovery: finds instances
- Metric gateway → Metrics API: routes requests
- Eureka discovery → Metrics API: registers service
- API user → Login endpoint: submits credentials
- Login endpoint → User lookup: looks up user
- Login endpoint → JWT utility: issues token
- API user → Bearer context: sends bearer token
- Bearer context → Token validation: authenticates token
- Token validation → JWT utility: validates token
- Metrics API → Metrics routes: serves routes
- Metrics routes → Request validation: filters requests
- Metrics routes → Metric handlers: dispatches routes
- Metric handlers → Metrics queries: queries metrics
- Metrics queries → IOTDATA collection: reads records
