域名 AXUM.RS 将于 2025 年 10 月到期。我们无意再对其进行续费,如果你有意接续这个域名,请与我们取得联系。
  • AXUM.RS 现仅需人民币 3000 元(大写:叁仟元整。接受适度议价
  • 按照行业规则,AXUM.RS 到期后,大概率会进入长时间的赎回期,该期间内,如果你想拥有该域名,将要付出高额的费用
  • 我们已启用 AXUM.EU.ORG 域名,并将持续运营
  • 仅接受微信或支付宝交易
如果你对 AXUM.RS 有兴趣,请和我们进行联系:

代码集成及服务自动注册与发现

本章将以 echo-srvecho-web 进行讨论,calc-srvcalc-web请自(fu)行(zhi)实(dai)现(ma)。

echo-srv 的自动服务注册

async fn register(addr: &str) {
    println!("正在注册服务");
    let addrs: Vec<&str> = addr.split(":").collect();
    let addr = addrs[0];
    let port: i32 = addrs[1].parse().unwrap();
    let opt = consul_api::ConsulOption::default();
    let cs = consul_api::Consul::new(opt).unwrap();
    let reg = consul_api::Registration::simple("echo-srv", addr, port);
    cs.register(&reg).await.unwrap();
    println!("服务注册成功");
}

服务的自动注册

#[tokio::main]
async fn main() {
   //...

    tokio::spawn(register(addr));

    println!("EchoServer 监听于 {}", addr);
    //...
}

echo-web 的自动服务注册与发现

服务的自动注册

服务的自动发现

除了将自己作为服务进行注册,echo-web还需要自动发现 echo-srvcalc-web也一样要自动发现 calc-srv)。

async fn discovery(service_id: &str) -> Result<String, String> {
    println!("正在发现服务 {}", service_id);
    let opt = consul_api::ConsulOption::default();
    let cs = consul_api::Consul::new(opt).unwrap();
    let filter = consul_api::Filter::ID(service_id.into());
    let srv = cs
        .get_service(&filter)
        .await
        .map_err(|err| err.to_string())?;
    if let Some(srv) = srv {
        return Ok(format!("http://{}:{}", srv.address, srv.port));
    }
    Err("没有发现指定的服务".to_string())
}
//...
async fn echo(Form(EchoInput { message }): Form<EchoInput>) -> Result<Html<String>, String> {
    let echo_srv_addr = discovery("echo-srv").await?;
    let mut client = pb::echo_serivce_client::EchoSerivceClient::connect(echo_srv_addr)
        .await
        .map_err(|err| err.to_string())?;
  //...
}

作业

  • 服务发现是否可以在 main() 中实现:
    • 通过 axum 共享 echo-web 服务的信息
  • 有能力的话,可以为服务发现开发一个连接池
  • 通过 axum 共享 echo-web 服务的信息
要查看完整内容,请先登录