Architecture Overview - Lumina-Enterprise-Solutions/prism-auth-service GitHub Wiki
prism-auth-service
dirancang menggunakan arsitektur berlapis (layered architecture) yang bersih untuk memisahkan tanggung jawab (separation of concerns), meningkatkan kemudahan pengujian, dan skalabilitas.
graph TD
%% Styling definitions
classDef external fill:#e1f5fe,stroke:#0277bd,stroke-width:2px,color:#000
classDef handler fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,color:#000
classDef service fill:#e8f5e8,stroke:#388e3c,stroke-width:2px,color:#000
classDef repository fill:#fff3e0,stroke:#f57c00,stroke-width:2px,color:#000
classDef client fill:#fce4ec,stroke:#c2185b,stroke-width:2px,color:#000
classDef database fill:#f1f8e9,stroke:#689f38,stroke-width:2px,color:#000
classDef cache fill:#ffebee,stroke:#d32f2f,stroke-width:2px,color:#000
classDef vault fill:#f9fbe7,stroke:#827717,stroke-width:2px,color:#000
classDef main fill:#e3f2fd,stroke:#1976d2,stroke-width:3px,color:#000
classDef microservice fill:#f8bbd9,stroke:#e91e63,stroke-width:2px,color:#000
%% External Layer
subgraph EXT ["🌐 External World"]
direction TB
Frontend["📱 Frontend/Mobile App<br/>• Login/logout interface<br/>• Token management<br/>• Session handling"]
OtherServices["🔗 Other Microservices<br/>• Service-to-service auth<br/>• Token validation<br/>• User impersonation"]
end
%% Main Application Entry Point
subgraph MAIN ["🔐 prism-auth-service"]
direction TB
MainGo["📋 main.go<br/>• Server initialization<br/>• Configuration loading<br/>• Dependency injection<br/>• Graceful shutdown"]
%% Handler Layer
subgraph HANDLER ["🎯 Handler Layer"]
direction LR
HTTPHandlers["🌐 HTTP Handlers<br/>internal/handler<br/>• REST endpoints<br/>• Login/logout/refresh<br/>• Request validation<br/>• Response formatting"]
GRPCServer["⚡ gRPC Server<br/>internal/grpc_server<br/>• Service authentication<br/>• Token validation<br/>• User verification<br/>• Interceptors"]
end
%% Service Layer
subgraph SERVICE ["🧠 Service Layer (Business Logic)"]
direction TB
AuthService["🔑 Auth Service<br/>internal/service<br/>• JWT token generation<br/>• Password validation<br/>• Session management<br/>• Authentication logic<br/>• Token refresh<br/>• User authorization"]
end
%% Repository Layer
subgraph REPO ["💾 Repository Layer (Data Access)"]
direction TB
Repositories["📊 Repositories<br/>internal/repository<br/>• User credential storage<br/>• Session persistence<br/>• Token blacklisting<br/>• Audit logging<br/>• Database transactions"]
end
%% Client Layer
subgraph CLIENT ["🔌 Client Layer (External Communication)"]
direction TB
ServiceClients["📡 Service Clients<br/>internal/client<br/>• HTTP client wrapper<br/>• gRPC client connections<br/>• Circuit breaker pattern<br/>• Retry mechanisms<br/>• Request/response logging"]
end
end
%% Dependencies & External Services
subgraph DEPS ["🔧 Dependencies"]
direction TB
PostgresDB["🐘 PostgreSQL DB<br/>• User credentials<br/>• Session storage<br/>• Audit trails<br/>• ACID compliance"]
RedisCache["🔴 Redis Cache<br/>• Session storage<br/>• Token blacklist<br/>• Rate limiting<br/>• Temporary data"]
UserServiceExt["👤 prism-user-service<br/>• User profile data<br/>• User validation<br/>• Account management"]
NotificationServiceExt["📢 prism-notification-service<br/>• Login notifications<br/>• Security alerts<br/>• Authentication events"]
VaultService["🔐 HashiCorp Vault<br/>• JWT signing keys<br/>• Database credentials<br/>• API secrets<br/>• Encryption keys"]
end
%% Connections with labels
Frontend -- "🌐 REST API<br/>Login/Logout<br/>Token Management" --> HTTPHandlers
OtherServices -- "⚡ gRPC Calls<br/>Token Validation<br/>User Authentication" --> GRPCServer
MainGo --> HTTPHandlers
MainGo --> GRPCServer
MainGo -- "🔑 Load Secrets<br/>JWT Keys<br/>DB Credentials" --> VaultService
HTTPHandlers --> AuthService
GRPCServer --> AuthService
AuthService --> Repositories
AuthService --> ServiceClients
Repositories --> PostgresDB
Repositories --> RedisCache
ServiceClients -- "👤 HTTP/gRPC Out<br/>User Validation<br/>Profile Data" --> UserServiceExt
ServiceClients -- "📢 HTTP/gRPC Out<br/>Security Notifications<br/>Login Alerts" --> NotificationServiceExt
%% Apply styles
class Frontend,OtherServices external
class HTTPHandlers,GRPCServer handler
class AuthService service
class Repositories repository
class ServiceClients client
class PostgresDB database
class RedisCache cache
class VaultService vault
class MainGo main
class UserServiceExt,NotificationServiceExt microservice
main.go
adalah titik awal aplikasi. Tanggung jawab utamanya adalah:
- Inisialisasi: Memuat konfigurasi, menginisialisasi logger, dan menyiapkan OpenTelemetry untuk tracing.
-
Dependency Injection:
- Membuat koneksi ke database (PostgreSQL) dan Redis.
- Membuat klien untuk layanan eksternal (Vault,
user-service
,notification-service
). - Menginstansiasi semua lapisan (repository, service, handler) dan menyuntikkan dependensi yang diperlukan.
- Server Setup: Menjalankan server HTTP (Gin) dan server gRPC di goroutine terpisah.
- Graceful Shutdown: Menangani sinyal OS (SIGINT, SIGTERM) untuk mematikan semua koneksi dan server dengan aman.
Lapisan ini adalah gerbang masuk untuk permintaan dari dunia luar.
-
internal/handler
: BerisiAuthHandler
danAPIKeyHandler
. Mereka bertanggung jawab untuk:- Mendefinisikan rute HTTP.
- Menerima permintaan HTTP, mem-binding, dan memvalidasi payload JSON.
- Memanggil metode yang sesuai di lapisan Service.
- Mengonversi hasil dari lapisan Service menjadi respons JSON.
-
internal/grpc_server
: BerisiAuthServer
. Ini adalah implementasi dari service gRPC yang didefinisikan di file.proto
. Fungsinya mirip dengan handler HTTP tetapi untuk komunikasi antar-layanan yang lebih cepat.
Ini adalah inti dari aplikasi yang berisi semua logika bisnis.
-
AuthService
: Mengorkestrasi semua proses bisnis seperti registrasi, login, pembuatan token, validasi 2FA, dan manajemen API key. - Lapisan ini tidak tahu-menahu tentang HTTP atau gRPC. Ia menerima data dalam bentuk struct Go dan mengembalikan struct atau error.
- Lapisan ini berinteraksi dengan lapisan Repository untuk operasi data dan lapisan Client untuk berkomunikasi dengan layanan lain.
Lapisan ini bertanggung jawab untuk semua interaksi dengan penyimpanan data (database dan cache).
-
Tanggung Jawab: Abstraksi query SQL dan perintah Redis. Setiap repository (misalnya,
TokenRepository
,APIKeyRepository
) mendefinisikan sebuah interface dan implementasi spesifik (misalnya,postgresTokenRepository
). - Ini memastikan bahwa lapisan Service tidak perlu tahu tentang detail implementasi database.
Lapisan ini bertanggung jawab untuk berkomunikasi dengan microservices lain atau layanan pihak ketiga.
-
UserServiceClient
: Wrapper untuk klien gRPC yang berkomunikasi denganprism-user-service
untuk mengambil atau membuat data pengguna. -
NotificationClient
: Klien HTTP sederhana yang mengirim permintaan keprism-notification-service
untuk mengirim email (misalnya, email selamat datang atau reset password).