From db4d8bf56a967e673be9d8c994b98b3c4caadfc9 Mon Sep 17 00:00:00 2001 From: nutcas3 Date: Sun, 26 Apr 2026 02:32:14 +0300 Subject: [PATCH] refactor: Re-enable rate limiter with environment variable configuration in charging-engine routes - Add tower_governor imports (GovernorConfigBuilder and GovernorLayer) - Remove commented-out rate_limit module import - Add environment variable parsing for RATE_LIMIT_RPS (default: 10) and RATE_LIMIT_BURST (default: 20) - Create GovernorConfigBuilder with per_second and burst_size configuration - Replace commented-out rate_limiter layer with GovernorLayer::new(governor_conf) --- apps/charging-engine/src/routes.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/charging-engine/src/routes.rs b/apps/charging-engine/src/routes.rs index fc9fc6c..0c13e64 100644 --- a/apps/charging-engine/src/routes.rs +++ b/apps/charging-engine/src/routes.rs @@ -3,9 +3,12 @@ use axum::{ Router, }; use tower_http::cors::{Any, CorsLayer}; +use tower_governor::{ + governor::GovernorConfigBuilder, + GovernorLayer, +}; use crate::auth::auth_middleware; -// use crate::rate_limit::create_rate_limiter; use crate::handlers::{ add_credit, add_rating_plan, block_user, check_credit, deduct_credit, detailed_health_check, engine_start, engine_stop, engine_uptime, get_balance, get_error_stats, get_performance_metrics, @@ -21,7 +24,20 @@ pub fn create_router(state: AppState) -> Router { .allow_methods(Any) .allow_headers(Any); - // let rate_limiter = create_rate_limiter(); + let requests_per_second: u32 = std::env::var("RATE_LIMIT_RPS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(10); + let burst_size: u32 = std::env::var("RATE_LIMIT_BURST") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(20); + + let governor_conf = GovernorConfigBuilder::default() + .per_second(requests_per_second as u64) + .burst_size(burst_size) + .finish() + .unwrap(); Router::new() // Public routes (no auth required - for packet-gateway integration) @@ -54,7 +70,7 @@ pub fn create_router(state: AppState) -> Router { .route("/v1/usage/process", post(process_usage)) .route("/v1/invoice/:imsi/:period", get(generate_invoice)) .layer(cors) - // .layer(rate_limiter) + .layer(GovernorLayer::new(governor_conf)) .route_layer(axum::middleware::from_fn_with_state(state.auth_config.clone(), auth_middleware)) .with_state(state) }