3个不稳定版本
0.2.0 | 2020年12月18日 |
---|---|
0.1.1 | 2020年12月18日 |
0.1.0 | 2020年12月18日 |
3 在 #srv 中
每月47次 下载
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 查找,默认使用一种目标选择策略,该策略对最后一次成功使用的目标保持亲和性。这两种行为都可以通过实现 SrvResolver
和 Policy
特性来改变。
提供的解析后端由以下功能启用
libresolv
(通过LibResolv
)trust-dns
(通过trust_dns_resolver::AsyncResolver
)
使用方法
将 srv-rs 添加到 Cargo.toml
的依赖中,启用至少一个 DNS 解析后端(见 替代解析器)。这里以 libresolv
为例启用,但并非必须。
[dependencies]
srv-rs = { version = "0.2.0", features = ["libresolv"] }
贡献
- 克隆仓库
- 进行一些更改
- 测试:
cargo test --all-features
- 格式化:
cargo fmt
- Clippy:
cargo clippy --all-features --tests -- -Dclippy::all
- Bench:
cargo bench --all-features
- 如果修改了 crate 级别的文档(
src/lib.rs
)或README.tpl
,请更新README.md
cargo安装 cargo-readme
cargo readme > README.md
历史
该项目由 D. E. Shaw group 贡献给了社区。
依赖关系
~2–3.5MB
~69K SLoC