mod character_db_client; mod character_service; pub mod database { tonic::include_proto!("character_db_api"); } use crate::character_db_client::CharacterDbClient; use crate::character_service::character::character_service_server::CharacterServiceServer; use crate::character_service::MyCharacterService; use dotenv::dotenv; use std::env; use std::str::FromStr; use std::sync::Arc; use tracing::Level; use utils::service_discovery::{get_kube_service_endpoints_by_dns}; #[tokio::main] async fn main() -> Result<(), Box> { dotenv().ok(); tracing_subscriber::fmt() .with_max_level( Level::from_str(&env::var("LOG_LEVEL").unwrap_or_else(|_| "info".to_string())) .unwrap_or_else(|_| Level::INFO), ) .init(); // Set the gRPC server address let addr = env::var("LISTEN_ADDR").unwrap_or_else(|_| "0.0.0.0".to_string()); let port = env::var("SERVICE_PORT").unwrap_or_else(|_| "50053".to_string()); let db_url = format!("http://{}",get_kube_service_endpoints_by_dns("database-service","tcp","database-service").await?.get(0).unwrap()); let full_addr = format!("{}:{}", &addr, port); let address = full_addr.parse().expect("Invalid address"); let character_db_client = Arc::new(CharacterDbClient::connect(&db_url).await?); let character_service = MyCharacterService { character_db_client, }; let (mut health_reporter, health_service) = tonic_health::server::health_reporter(); health_reporter.set_serving::>().await; tonic::transport::Server::builder() .add_service(health_service) .add_service(CharacterServiceServer::new(character_service)) .serve(address) .await?; utils::signal_handler::wait_for_signal().await; Ok(()) }