nacos-tonic-discover

介绍

nacosrustclient 对 tonic 服务地址选择器的适配

使用方式

toml [dependencies] nacos-tonic-discover = "0.1" nacos_rust_client = "0.1" tonic = "0.7"

例子

运行下面的例子,需要先启动nacos服务,把例子中的host改成实际的地址。

例子完整依赖与代码可以参考 examples/下的代码。

tonic service示例

```rust // file: examples/src/tonic-discover/service.rs

use nacosrustclient::client::namingclient::Instance; use nacosrustclient::client::namingclient::NamingClient; use tokio::sync::mpsc; use tonic::{transport::Server, Request, Response, Status};

use helloworld::greeterserver::{Greeter, GreeterServer}; use hello_world::{HelloReply, HelloRequest};

pub mod helloworld { tonic::includeproto!("helloworld"); }

[derive(Default)]

pub struct MyGreeter {}

[tonic::async_trait]

impl Greeter for MyGreeter { async fn sayhello( &self, request: Request, ) -> Result, Status> { println!("Got a request from {:?}", request.remoteaddr());

    let reply = hello_world::HelloReply {
        message: format!("Hello {}!", request.into_inner().name),
    };
    Ok(Response::new(reply))
}

}

[tokio::main]

async fn main() -> Result<(), Box> { //let ip="[::]" ; //only use at localhost let ip = localipaddress::get().unwrap(); let addrs = [(ip.clone(),10051),(ip.clone(),10052)]; let namespaceid = "public".toowned(); //default teant let authinfo = None; // Some(AuthInfo::new("nacos","nacos")) let client = NamingClient::newwithaddrs("127.0.0.1:8848,127.0.0.1:8848", namespaceid, authinfo);

let (tx, mut rx) = mpsc::unbounded_channel();

for (ip,port) in &addrs {
    let addr = format!("{}:{}","0.0.0.0",port).parse()?;
    let tx = tx.clone();
    let greeter = MyGreeter::default();
    let serve = Server::builder()
        .add_service(GreeterServer::new(greeter))
        .serve(addr);

    tokio::spawn(async move {
        if let Err(e) = serve.await {
            eprintln!("Error = {:?}", e);
        }

        tx.send(()).unwrap();
    });
}

for (ip,port) in &addrs {
    let instance = Instance::new_simple(&ip,port.to_owned(),"helloworld","AppName");
    client.register(instance);
}

rx.recv().await;

Ok(())

} ```

tonic client示例

```rust // file: examples/src/tonic-discover/client.rs

use std::time::Duration; use nacosrustclient::client::namingclient::{ServiceInstanceKey, QueryInstanceListParams}; use nacostonicdiscover::TonicDiscoverFactory; use nacosrustclient::client::namingclient::NamingClient; use helloworld::greeterclient::GreeterClient; use hello_world::HelloRequest;

pub mod helloworld { tonic::includeproto!("helloworld"); }

[tokio::main]

async fn main() -> Result<(), Box> { let namespaceid = "public".toowned(); //default teant let authinfo = None; // Some(AuthInfo::new("nacos","nacos")) let namingclient = NamingClient::newwithaddrs("127.0.0.1:8848,127.0.0.1:8848", namespaceid, authinfo);

let service_key = ServiceInstanceKey::new("helloworld","AppName");
//build client by discover factory
let discover_factory = TonicDiscoverFactory::new(naming_client.clone());
let channel = discover_factory.build_service_channel(service_key.clone()).await?;
let mut client = GreeterClient::new(channel);

for i in 0..5 {
    let request = tonic::Request::new(HelloRequest {
        name: format!("Tonic {} [client by discover factory]",i),
    });
    let response = client.say_hello(request).await?;
    println!("RESPONSE={:?}", response);
    tokio::time::sleep(Duration::from_millis(1000)).await;
}

//build client by naming client select
let param = QueryInstanceListParams::new_by_serivce_key(&service_key);

for i in 5..10 {
    let instance=naming_client.select_instance(param.clone()).await?;
    let mut client = GreeterClient::connect(format!("http://{}:{}",&instance.ip,&instance.port)).await?;
    let request = tonic::Request::new(HelloRequest {
        name: format!("Tonic {} [client by naming client select]",i),
    });
    let response = client.say_hello(request).await?;
    println!("RESPONSE={:?}", response);
    tokio::time::sleep(Duration::from_millis(1000)).await;
}
Ok(())

}

```