apache / dubbo-rust

Apache Dubbo Rust implementation
https://dubbo.apache.org/
Apache License 2.0
279 stars 63 forks source link

Supports Interface Exposure Mode #182

Open kwsc98 opened 8 months ago

kwsc98 commented 8 months ago

Supports Interface Exposure Mode, make a webServer ? httpClient like fegin ?

For Example

Interface Definition

#[fusen_trait(package = "org.apache.dubbo.springboot.demo",version = "1.0.0")]
#[resource(method = POST)]
pub trait DemoService {
    #[resource(path="/sayHello11",method = POST)]
    async fn sayHello(&self, name: String) -> String;

    #[resource(path="/sayHelloV22",method = POST)]
    async fn sayHelloV2(&self, name: ReqDto) -> ResDto;
}

Server

#[derive(Clone)]
struct TestServerImpl {
    _db: String,
}

#[fusen_server(version="1.0.0")]
#[resource(path="/TestServer",method = POST)]
impl TestServer for TestServerImpl {

    #[resource(path="/doRun1",method = POST)]
    async fn do_run1(&self, req1: ReqDto, req2: ReqDto) -> FusenResult<ResDto> {
        info!("req1 : {:?} , req1 : {:?}", req1, req2);
        return Ok(ResDto {
            str: "Hello ".to_owned() + &req1.str + " " + &req2.str + " V1",
        });
    }

    #[resource(path="/doRun2",method = POST)]
    async fn doRun2(&self, req: ReqDto) -> FusenResult<ResDto> {
        info!("res : {:?}", req);
        return Ok(ResDto {
            str: "Hello ".to_owned() + &req.str + " V2",
        });
    }
}

#[tokio::main(worker_threads = 512)]
async fn main() {
    fusen_common::init_log();
    let server: TestServerImpl = TestServerImpl {
        _db: "我是一个DB数据库".to_string(),
    };
    FusenServer::build()
        .add_register_builder(RegisterBuilder::new(
            &format!("127.0.0.1:{}", "2181"),
            "default",
            RegisterType::ZooKeeper,
        ))
        .add_protocol(Protocol::HTTP("8082".to_owned()))
        .add_protocol(Protocol::HTTP2("8081".to_owned()))
        .add_fusen_server(Box::new(server))
        .run()
        .await;
}

Client

#[tokio::main(worker_threads = 512)]
async fn main() {
    let de = TestServerClient::new(&CLI);
    println!("{:?}",de.get_info());
    fusen_common::init_log();
    let client = de;
    let res = client
        .do_run1(
            ReqDto {
                str: "client say hello 1".to_string(),
            },
            ReqDto {
                str: "client say hello 2".to_string(),
            },
        )
        .await;
    info!("{:?}", res);
    let res = client
        .doRun2(ReqDto {
            str: "client say hello 2".to_string(),
        })
        .await;
    info!("{:?}", res);
}