Start the rust and golang two versions of the web server (both have http and grpc services), the rust version of the cpu usage is so high (see figure), jumping around 28%, the rust version of the code is as follows:
use axum::{
routing::{get, post},
Router,
};
use logic::pb::{
logic_server::{Logic, LogicServer},
ConnReply, ConnRequest,
};
use tokio::{net::TcpListener, spawn};
use tonic::{transport::Server, Request, Response, Status};
#[tokio::main]
async fn main() {
let _ = spawn(async {
let _ = http_srv().await;
});
let _ = spawn(async {
let _ = grpc_srv().await;
});
loop {}
}
async fn http_srv() -> Result<(), axum::Error> {
println!("http server");
let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap();
let router = Router::new()
.route("/", get(root))
.route("/admin", post(admin_handler));
axum::serve(listener, router).await.unwrap();
Ok(())
}
async fn grpc_srv() -> Result<(), tonic::transport::Error> {
println!("grpc server");
let addr = "[::1]:50052".parse().unwrap();
let greeter = LogicSrv::default();
Server::builder()
.add_service(LogicServer::new(greeter))
.serve(addr)
.await?;
Ok(())
}
async fn root() -> &'static str {
"home page"
}
async fn admin_handler() -> &'static str {
"admin page"
}
#[derive(Debug, Default)]
pub struct LogicSrv;
#[tonic::async_trait]
impl Logic for LogicSrv {
async fn conn(&self, request: Request<ConnRequest>) -> Result<Response<ConnReply>, Status> {
println!("Got a request: {:#?}", request);
let reply = ConnReply {
message: format!("Hello {}", request.into_inner().name),
};
Ok(Response::new(reply))
}
}
The proto file code for grpc is as follows:
syntax = "proto3";
package logic;
service Logic { rpc Conn(ConnRequest) returns (ConnReply); }
message ConnRequest { string name = 1; }
message ConnReply { string message = 1; }
The startup binaries have been packaged using 'cargo build-r'
Why is that? Does it need to be optimized