#微服务 #consul # #客户端 #plus #函数 #文件夹

consul-rs-plus

Rust的plus consul客户端包,为微服务提供更多功能

8个版本

0.1.7 2021年11月14日
0.1.6 2021年8月31日
0.1.4 2021年7月5日
0.1.3 2021年6月30日

#927 in HTTP服务器

每月 39 次下载
用于 cakerabbit-core

MIT/Apache

30KB
534

consul-rs-plus

Rust的plus consul客户端包,为微服务提供更多功能。

  • 键/值操作
  • 会话操作
  • 键/值 & 会话组合操作
  • 键/值文件夹值(用于微服务节点信息)
  • 监视键树更改功能(通常用于微服务)

安装

在Cargo依赖中设置

[dependencies]
consul-rs-plus = "0.1.7"

用法

extern crate consul_rs_plus;
use consul_rs_plus::Client;

fn main() {
    let mut c = Client::new("localhost", 8500);
    // debug enable
    c.debug = true;

    let ok = c.kv_set("test-key", "test_value").unwrap();
    assert_eq!(ok, true);

    let kvpairs = c.kv_get("test-key").unwrap();
    let kvpair = &kvpairs[0];
    let v = kvpair.get_value().unwrap();
    assert_eq!(b"test_value"[..].to_vec(), v);
  
    let ok = c.kv_delete("test-key").unwrap();
    assert_eq!(ok, true);
}

测试

函数代码文件或测试文件夹中编写的测试用例,所有正常操作测试都在lib.rs中。

#[cfg(test)]
mod tests {
  use crate::Client;
  use base64::Config;
  use crate::config;

  #[test]
  fn test_kv_get() {
    let host = config::CONFIG["consul_addr"];
    let client = Client::new(host, 8500);
    let my_keys = client.kv_get("my-key").unwrap();
    for k in my_keys {
      println!("k: {:?}", k);
    }
  }
  
}

微服务节点监视

如果您编写了微服务框架,服务注册如下 rpcx-plus,文件夹树样式,例如,文件夹(键,值)中的Echo服务是 /mytest/Echo/[email protected]:999,您可以在代码仓库中找到监视服务更改的示例代码,它们在代码仓库中。您可以在服务更改(文件夹树更改)时缓存服务信息。


#[tokio::test]
  async fn test_watch_folder_tree_tmpsc() {
  env_logger::init();
  let folder = "mytest".to_string();
  let mut nodes_service: Vec<String> = Vec::new();     // service cache
  let (sx, mut rx) = tmpsc::channel(1);
  let kv = KVPair::new();
  let client = Client::new("consul_test", 8500);
  let mut index = kv.get_folder_index(&client, &folder);
  log::info!("index orgin ------- {}", index);
  tokio::task::spawn(async move {
    loop {
      thread::sleep(time::Duration::from_secs(5));
      let mut index_ck = kv.get_folder_index(&client, &folder);
      log::info!("index_ck ------- {}", index_ck);
      if !index_ck.eq(index.as_str()) {
        log::info!("=== get newest nodes service, send coroutine ===");
        let nodes_v = kv.get_folder_allkeys(&client, &folder);
        let nodes_v_cl = nodes_v.clone();
        log::info!("[send] === in spawn nodes_v_cl: {:?}", nodes_v_cl);
        sx.send(nodes_v_cl).await.unwrap();    // todo: just make the channel full!
        index = index_ck;
      } else {
        log::info!("=== nodes_service no change ===");
      }
    }
  });
}

您可以在代码仓库中运行此测试用例。

依赖项

~21–33MB
~564K SLoC