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  }