etcd-detector 0.1.3

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

示例用法

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

#[tokio::main]
async fn main() {
    // 创建一个构建者
    let builder = etcd_detector::Builder::connect(["localhost:2379"]).await.unwrap();
    
    // new一个服务detector
    let mut detect = {
        let s = detector::Service {
            key: detector::ServiceKey::new("mail".to_string(), None),
            ttl: 30,
            ip: "127.0.0.1".to_string(),
            port: 3001,
        };
        builder.new_detector(s)
    };

    // new一个服务元数据detector
    let mut meta_detector = {
        let meta = detector::Meta {
            key: detector::MetaKey::new("mail".to_string(), None),
            state: detector::ServiceState::Stateful,
            instances: 1,
            category: Some(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;
    }
}