etcd-detector 0.4.0

An etcd-based implementation of service registration and discovery.
Documentation

日志

tracing feature可以控制调试日志的输出

示例用法

use detector::{DetectMeta, Detector};
use std::time::Duration;

#[tokio::main]
async fn main() {
    let builder = etcd_detector::Builder::connect(["localhost:2379"])
        .await
        .unwrap();

    let mut detect = {
        let mut s =
            detector::Service::from_key(detector::ServiceKey::new("mail".to_string(), None));
        s.ttl = Some(30);
        s.ip = Some("127.0.0.1".to_string());
        s.port = Some(3001);
        builder.new_detector(s)
    };

    let mut meta_detector = {
        let meta = detector::Meta::new(detector::MetaKey::new("mail".to_string(), None), 1);
        builder.new_meta_detector(meta)
    };

    // 注册元数据
    meta_detector.register().await.unwrap();

    // 获取元数据
    println!("{:?}", meta_detector.fetch().await);

    println!("{:?}", detect.oneself());
    println!("{:?}", detect.status());
    println!("{:?}", detect.service());
    println!("{:?}", detect.register().await);
    println!("{:?}", detect.status());
    println!("{:?}", detect.service());

    if let Some(mut rx) = detect.oneself() {
        tokio::spawn(async move {
            loop {
                match rx.changed().await {
                    Err(_) => break,
                    Ok(status) => println!("status: {:?}", status),
                }
            }
        });

        // 监听所有
        let mut watch_all = detect.watch_all().await.unwrap();
        tokio::spawn(async move {
            while let Some(e) = watch_all.recv().await {
                println!("watch all, recv event:{:?}", e);
            }
            println!("watch all over");
        });

        // 监听本类型服
        let mut watch = detect.watch().await.unwrap();
        tokio::spawn(async move {
            while let Some(e) = watch.recv().await {
                println!("watch self, recv event:{:?}", e);
            }
            println!("watch self over");
        });

        tokio::time::sleep(Duration::from_secs(100)).await;
        drop(detect);
        tokio::time::sleep(Duration::from_secs(10)).await;
    }
}