#srv #dns #record #dns-records #resolve #dns-resolver #libresolv

srv-rs

Rust客户端,用于与SRV定位的服务通信

3个不稳定版本

0.2.0 2020年12月18日
0.1.1 2020年12月18日
0.1.0 2020年12月18日

3#srv

每月47次 下载

BSD-3-Clause

50KB
913

srv-rs

SRV记录定位的服务的Rust客户端。

简介

SRV记录,如RFC 2782中定义,是以下形式的DNS记录:

_Service._Proto.NameTTLClassSRV优先级 权重 端口 目标

例如,一个DNS服务器可能会为以下SRV记录响应 _http._tcp.example.com

_http._tcp.example.com. 60 IN SRV 1 100 443 test1.example.com.
_http._tcp.example.com. 60 IN SRV 2 50  443 test2.example.com.
_http._tcp.example.com. 60 IN SRV 2 50  443 test3.example.com.

想要与这个示例服务通信的客户端将首先尝试与 test1.example.com:443 (具有最低优先级的记录) 进行通信,然后是其他两个(由于它们具有相同的优先级,因此以随机顺序),如果第一个不可用。

srv-rs 处理SRV记录的查找和缓存以及按顺序选择用于与SRV定位的服务通信的目标。它通过以下接口提供此服务

use srv_rs::{SrvClient, Execution, resolver::libresolv::LibResolv};
let client = SrvClient::<LibResolv>::new("_http._tcp.example.com");
client.execute(Execution::Serial, |address: http::Uri| async move {
    // Communicate with the service at `address`
    // `hyper` is used here as an example, but it is in no way required
    hyper::Client::new().get(address).await
})
.await;

SrvClient::new 创建一个客户端(应该重复使用以利用缓存)以与 _http._tcp.example.com 定位的服务进行通信。 SrvClient::execute 接受一个产生未来的闭包(模拟当前不稳定的异步闭包)并在解析自发现的SRV记录的一系列目标上执行闭包,在获取第一个 Ok 或最后一个 Err 时停止并返回。

替代解析器和目标选择策略

srv-rs 提供了多个解析后端以支持 SRV 查找,默认使用一种目标选择策略,该策略对最后一次成功使用的目标保持亲和性。这两种行为都可以通过实现 SrvResolverPolicy 特性来改变。

提供的解析后端由以下功能启用

使用方法

将 srv-rs 添加到 Cargo.toml 的依赖中,启用至少一个 DNS 解析后端(见 替代解析器)。这里以 libresolv 为例启用,但并非必须。

[dependencies]
srv-rs = { version = "0.2.0", features = ["libresolv"] }

贡献

  1. 克隆仓库
  2. 进行一些更改
  3. 测试: cargo test --all-features
  4. 格式化: cargo fmt
  5. Clippy: cargo clippy --all-features --tests -- -Dclippy::all
  6. Bench: cargo bench --all-features
  7. 如果修改了 crate 级别的文档(src/lib.rs)或 README.tpl,请更新 README.md
    1. cargo安装 cargo-readme
    2. cargo readme > README.md

历史

该项目由 D. E. Shaw group 贡献给了社区。

D. E. Shaw Logo

依赖关系

~2–3.5MB
~69K SLoC