github.com/renbou/grpcbridge@v0.0.2-0.20240416012907-bcbd8b12648a/examples/rstestapi/src/main.rs (about) 1 mod rstestapiv1 { 2 tonic::include_proto!("rstestapi.v1"); 3 4 pub const FILE_DESCRIPTOR_SET: &[u8] = 5 tonic::include_file_descriptor_set!("rstestapi.v1_descriptor"); 6 } 7 8 use anyhow::{Context, Result}; 9 use rstestapiv1::clock_service_server::{ClockService, ClockServiceServer}; 10 use std::env; 11 use std::net::SocketAddr; 12 use std::time::SystemTime; 13 use tonic::{transport::Server, Request, Response, Status}; 14 use tower::ServiceBuilder; 15 use tower_http::trace::{DefaultMakeSpan, DefaultOnRequest, DefaultOnResponse, TraceLayer}; 16 use tracing::{info, Level}; 17 18 #[derive(Debug, Default)] 19 pub struct ClockServiceImpl {} 20 21 #[tonic::async_trait] 22 impl ClockService for ClockServiceImpl { 23 async fn get_time(&self, _: Request<()>) -> Result<Response<prost_types::Timestamp>, Status> { 24 Ok(Response::new(SystemTime::now().into())) 25 } 26 } 27 28 #[tokio::main] 29 async fn main() -> Result<()> { 30 let json_subscriber = tracing_subscriber::fmt() 31 .json() 32 .with_max_level(Level::INFO) 33 .flatten_event(true) 34 .finish(); 35 tracing::subscriber::set_global_default(json_subscriber) 36 .context("failed to set default tracing subscriber")?; 37 38 let listen_addr: SocketAddr = env::var("LISTEN_ADDR") 39 .unwrap_or("0.0.0.0:50053".to_owned()) 40 .parse() 41 .map_err(anyhow::Error::new) 42 .context("failed to read LISTEN_ADDR from env")?; 43 44 let clock_service = ClockServiceImpl::default(); 45 46 // Currently tonic-reflection supports only v1alpha, which is great for testing grpcbridge! 47 // In the future, if v1 gets added, make sure to manually disable it to avoid losing test coverage. 48 let reflection_server = tonic_reflection::server::Builder::configure() 49 .register_encoded_file_descriptor_set(rstestapiv1::FILE_DESCRIPTOR_SET) 50 .build()?; 51 52 info!( 53 app = "rstestapi", 54 listen_addr = listen_addr.to_string(), 55 "serving test gRPC" 56 ); 57 58 Server::builder() 59 .layer( 60 ServiceBuilder::new().layer( 61 TraceLayer::new_for_grpc() 62 .make_span_with(DefaultMakeSpan::new().level(Level::INFO)) 63 .on_request(DefaultOnRequest::new().level(Level::INFO)) 64 .on_response(DefaultOnResponse::new().level(Level::INFO)), 65 ), 66 ) 67 .add_service(ClockServiceServer::new(clock_service)) 68 .add_service(reflection_server) 69 .serve_with_shutdown(listen_addr, shutdown_signal()) 70 .await?; 71 72 Ok(()) 73 } 74 75 #[cfg(target_family = "unix")] 76 async fn shutdown_signal() { 77 let mut sigterm = 78 tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()).unwrap(); 79 let sigint = tokio::signal::ctrl_c(); 80 81 tokio::select! { 82 _ = sigterm.recv() => {} 83 _ = sigint => {} 84 } 85 } 86 87 #[cfg(target_family = "windows")] 88 async fn shutdown_signal() { 89 let _ = tokio::signal::ctrl_c().await; 90 }