Here is some code:
#[path="handlers/my_handlers.rs"]
mod my_handlers;
#[path="load_balancers/loadbalancer.rs"]
mod loadbalancer;
use std::fs::File;
use std::io::Read;
use axum::{Router, routing::get};
use my_handlers::weatherforecast_handler;
use serde_derive::Deserialize;
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
let mut config_file = File::open("config.toml").expect("Unable to open config file");
let mut config_toml = String::new();
config_file.read_to_string(&mut config_toml).expect("Unable to read config file");
let config:AppConfig = toml::from_str(&config_toml).expect("Failed to parse TOML");
let iterator = config.addresses.iter();
for address in config.addresses.iter() {
println!("Service Address: {}", address);
}
let app = Router::new().route("/", get(|| weatherforecast_handler("http://localhost:7071/weatherforecast")));
let addr = SocketAddr::from(([127, 0, 0, 1], 8080));
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
}
#[derive(Debug, Deserialize)]
struct AppConfig {
addresses: Vec<String>,
}
use axum::http::StatusCode;
use reqwest;
pub async fn weatherforecast_handler(url:&str) -> (StatusCode,String) {
match reqwest::get(url).await {
Ok(res) => (
StatusCode::OK,
res.text().await.unwrap(),
),
Err(err) => (
StatusCode::INTERNAL_SERVER_ERROR,
format!("Server failed with {}", err),
)
}
}
use std::{pin::Pin, future::Future};
use reqwest::StatusCode;
pub fn balance<'a, F>(handler: F) -> impl Fn(&'a str) -> Pin<Box<dyn Future<Output = (StatusCode,String)>>>
where
F: Fn(&'a str) -> Box<dyn std::future::Future<Output = (StatusCode, String)>>,
{
move |url:&'a str| Box::pin(handler(url))
}