usc 1.20230730.1349

A common lib for unitedservices
Documentation
use std::convert::Infallible;
use std::error::Error;
use std::net::SocketAddr;
use std::{thread, time};
use tracing::span;
use crate::mylog;
use tonic::{transport::Server, Request, Response, Status};
use tonic::body::BoxBody;
use tonic::codegen::http::{request, response};
use tonic::codegen::{ Service};
use tonic::server::NamedService;
use tonic::transport::Body;
use tonic::transport::server::Router;
use std::env;
pub fn init_server() ->Router {

    let  mut serverconfig = Server::builder().timeout(time::Duration::from_secs(6 * 3600)).http2_keepalive_timeout(Some(time::Duration::from_secs(6 * 3600))).trace_fn(|x| {
            mylog!(x.uri(),x.method());
            span!(tracing::Level::TRACE, "GRPC","{} {} {:?}",x.method(), x.uri(),x.headers())
        }).accept_http1(true);
        let server=serverconfig.add_optional_service(Some(crate::grpcs::default_business::DefaultBusiness::server()));
        server
}

pub fn start(server :Router){
    let grpcport=env::var("GRPC_PORT").unwrap_or("8088".to_string());
    let grpcaddress=format!("0.0.0.0:{}",grpcport);

    let addr:SocketAddr =grpcaddress.parse().unwrap();
    actix_rt::spawn(async move {
        mylog!(format!("grpc server start at address:{grpcaddress}"));
        server.serve(addr).await.unwrap();
    });
}

 async fn start_server<S>(grpcservers: Vec<S>,is_thread:bool) -> std::io::Result<()> where
        S: Service<request::Request<Body>, Response = response::Response<BoxBody>, Error = Infallible>
            + NamedService
            + Clone
            + Send
            + 'static,
        S::Future: Send + 'static{

    if is_thread {
        actix_rt::spawn(async {
            start_server(grpcservers, false).await;
        });
        return Ok(());
    }
    let mut server = Server::builder().timeout(time::Duration::from_secs(6 * 3600)).http2_keepalive_timeout(Some(time::Duration::from_secs(6 * 3600))).trace_fn(|x| {
        mylog!(x.uri(),x.method());
        span!(tracing::Level::TRACE, "GRPC","{} {} {:?}",x.method(), x.uri(),x.headers())
    }).accept_http1(true).add_optional_service(Some(crate::grpcs::default_business::DefaultBusiness::server()));
    for grpcserver in grpcservers {
        server=server.add_service(grpcserver);
    }
    let addr:SocketAddr ="0.0.0.0:3000".parse().unwrap();
    Ok(server.serve(addr).await.unwrap())
}