1 use tonic::{transport::Server, Request, Response, Status}; 2 3 use hello_world::greeter_server::{Greeter, GreeterServer}; 4 use hello_world::{HelloReply, HelloRequest}; 5 use tonic_web::GrpcWebLayer; 6 7 pub mod hello_world { 8 tonic::include_proto!("helloworld"); 9 } 10 11 #[derive(Default)] 12 pub struct MyGreeter {} 13 14 #[tonic::async_trait] 15 impl Greeter for MyGreeter { 16 async fn say_hello( 17 &self, 18 request: Request<HelloRequest>, 19 ) -> Result<Response<HelloReply>, Status> { 20 println!("Got a request from {:?}", request.remote_addr()); 21 22 let reply = hello_world::HelloReply { 23 message: format!("Hello {}!", request.into_inner().name), 24 }; 25 Ok(Response::new(reply)) 26 } 27 } 28 29 #[tokio::main] 30 async fn main() -> Result<(), Box<dyn std::error::Error>> { 31 tracing_subscriber::fmt::init(); 32 33 let addr = "127.0.0.1:3000".parse().unwrap(); 34 35 let greeter = MyGreeter::default(); 36 let greeter = GreeterServer::new(greeter); 37 38 println!("GreeterServer listening on {}", addr); 39 40 Server::builder() 41 .accept_http1(true) 42 .layer(GrpcWebLayer::new()) 43 .add_service(greeter) 44 .serve(addr) 45 .await?; 46 47 Ok(()) 48 } 49