From 51e2fef9df61e587a972f201ac5accb7e86eaca91f4c30879e546b770ff27ab7 Mon Sep 17 00:00:00 2001 From: raven <7156279+RavenX8@users.noreply.github.com> Date: Fri, 13 Dec 2024 04:46:18 -0500 Subject: [PATCH] - add: character and world service stubs --- Cargo.toml | 2 ++ character-service/Cargo.toml | 18 +++++++++++ character-service/src/main.rs | 59 +++++++++++++++++++++++++++++++++++ world-service/Cargo.toml | 18 +++++++++++ world-service/src/main.rs | 59 +++++++++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+) create mode 100644 character-service/Cargo.toml create mode 100644 character-service/src/main.rs create mode 100644 world-service/Cargo.toml create mode 100644 world-service/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 3fd53b5..fa38619 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,10 @@ [workspace] members = [ "auth-service", + "character-service", "database-service", "packet-service", + "world-service", "utils", ] resolver = "2" diff --git a/character-service/Cargo.toml b/character-service/Cargo.toml new file mode 100644 index 0000000..6caf840 --- /dev/null +++ b/character-service/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "character-service" +version = "0.1.0" +edition = "2021" + +[dependencies] +utils = { path = "../utils" } +dotenv = "0.15" +tokio = { version = "1.41.1", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +tracing = "0.1" +tracing-subscriber = "0.3.18" +tonic = "0.12.3" +prost = "0.13.4" +warp = "0.3.7" + +[build-dependencies] +tonic-build = "0.12.3" \ No newline at end of file diff --git a/character-service/src/main.rs b/character-service/src/main.rs new file mode 100644 index 0000000..e30b52a --- /dev/null +++ b/character-service/src/main.rs @@ -0,0 +1,59 @@ +use dotenv::dotenv; +use std::collections::HashMap; +use std::env; +use std::str::FromStr; +use tokio::{select, signal}; +use tracing::Level; +use utils::consul_registration; +use utils::service_discovery::get_service_address; + +#[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("CHARACTER_SERVICE_ADDR").unwrap_or_else(|_| "127.0.0.1".to_string()); + let port = env::var("CHARACTER_SERVICE_PORT").unwrap_or_else(|_| "50053".to_string()); + let health_port = env::var("HEALTH_CHECK_PORT").unwrap_or_else(|_| "8083".to_string()); + + let consul_url = env::var("CONSUL_URL").unwrap_or_else(|_| "http://127.0.0.1:8500".to_string()); + let service_name = env::var("SERVICE_NAME").unwrap_or_else(|_| "character-service".to_string()); + let service_address = addr.as_str(); + let service_port = port.clone(); + let health_check_url = format!("http://{}:{}/health", service_address, health_port); + let health_check_endpoint_addr = format!("{}:{}", service_address, health_port); + let db_nodes = get_service_address(&consul_url, "database-service").await?; + + // Register service with Consul + let service_id = consul_registration::generate_service_id(); + let tags = vec!["version-1.0".to_string()]; + let mut meta = HashMap::new(); + meta.insert("name".to_string(), "Rose".to_string()); + consul_registration::register_service( + &consul_url, + service_id.as_str(), + service_name.as_str(), + service_address, + service_port.parse().unwrap_or(50052), + tags, + meta, + &health_check_url, + ) + .await?; + + // Start health-check endpoint + consul_registration::start_health_check(addr.as_str()).await?; + + let db_address = db_nodes.get(0).unwrap(); + let db_url = format!("http://{}:{}", db_address.ServiceAddress, db_address.ServicePort); + + select! { + _ = signal::ctrl_c() => {}, + } + + consul_registration::deregister_service(&consul_url, service_id.as_str()).await.expect(""); + Ok(()) +} diff --git a/world-service/Cargo.toml b/world-service/Cargo.toml new file mode 100644 index 0000000..2a6a176 --- /dev/null +++ b/world-service/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "world-service" +version = "0.1.0" +edition = "2021" + +[dependencies] +utils = { path = "../utils" } +dotenv = "0.15" +tokio = { version = "1.41.1", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +tracing = "0.1" +tracing-subscriber = "0.3.18" +tonic = "0.12.3" +prost = "0.13.4" +warp = "0.3.7" + +[build-dependencies] +tonic-build = "0.12.3" \ No newline at end of file diff --git a/world-service/src/main.rs b/world-service/src/main.rs new file mode 100644 index 0000000..f066b7f --- /dev/null +++ b/world-service/src/main.rs @@ -0,0 +1,59 @@ +use dotenv::dotenv; +use std::collections::HashMap; +use std::env; +use std::str::FromStr; +use tokio::{select, signal}; +use tracing::Level; +use utils::consul_registration; +use utils::service_discovery::get_service_address; + +#[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("WORLD_SERVICE_ADDR").unwrap_or_else(|_| "127.0.0.1".to_string()); + let port = env::var("WORLD_SERVICE_PORT").unwrap_or_else(|_| "50054".to_string()); + let health_port = env::var("HEALTH_CHECK_PORT").unwrap_or_else(|_| "8084".to_string()); + + let consul_url = env::var("CONSUL_URL").unwrap_or_else(|_| "http://127.0.0.1:8500".to_string()); + let service_name = env::var("SERVICE_NAME").unwrap_or_else(|_| "world-service".to_string()); + let service_address = addr.as_str(); + let service_port = port.clone(); + let health_check_url = format!("http://{}:{}/health", service_address, health_port); + let health_check_endpoint_addr = format!("{}:{}", service_address, health_port); + let db_nodes = get_service_address(&consul_url, "database-service").await?; + + // Register service with Consul + let service_id = consul_registration::generate_service_id(); + let tags = vec!["version-1.0".to_string()]; + let mut meta = HashMap::new(); + meta.insert("name".to_string(), "Athena".to_string()); + consul_registration::register_service( + &consul_url, + service_id.as_str(), + service_name.as_str(), + service_address, + service_port.parse().unwrap_or(50054), + tags, + meta, + &health_check_url, + ) + .await?; + + // Start health-check endpoint + consul_registration::start_health_check(addr.as_str()).await?; + + let db_address = db_nodes.get(0).unwrap(); + let db_url = format!("http://{}:{}", db_address.ServiceAddress, db_address.ServicePort); + + select! { + _ = signal::ctrl_c() => {}, + } + + consul_registration::deregister_service(&consul_url, service_id.as_str()).await.expect(""); + Ok(()) +}