nacosrustclient 对 tonic 服务地址选择器的适配
toml
[dependencies]
nacos-tonic-discover = "0.1"
nacos_rust_client = "0.1"
tonic = "0.7"
运行下面的例子,需要先启动nacos服务,把例子中的host改成实际的地址。
例子完整依赖与代码可以参考 examples/下的代码。
```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"); }
pub struct MyGreeter {}
impl Greeter for MyGreeter {
async fn sayhello(
&self,
request: Request
let reply = hello_world::HelloReply {
message: format!("Hello {}!", request.into_inner().name),
};
Ok(Response::new(reply))
}
}
async fn main() -> Result<(), Box
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(())
} ```
```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"); }
async fn main() -> Result<(), Box
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(())
}
```