pub enum DiscoverySource {
Static(Vec<String>),
EnvPrefix(String),
File(String),
Dns {
hostname: String,
port: u16,
},
DnsSrv {
record: String,
},
Consul {
addr: String,
service: String,
},
Docker {
label: String,
socket_path: String,
},
EtcdWatch {
endpoints: Vec<String>,
prefix: String,
},
}Expand description
Controls how BackendPool discovers backend addresses.
Variants§
Static(Vec<String>)
Fixed list of "host:port" addresses — never refreshed.
EnvPrefix(String)
Scan environment variables PREFIX_0, PREFIX_1, … until one is absent.
File(String)
Read one host:port per line from a file. Blank lines and lines starting
with # are ignored.
Dns
Resolve hostname via A-record DNS lookup; format each IP as ip:port.
DnsSrv
Resolve record (e.g. _http._tcp.example.com) via SRV lookup. Only the
lowest-priority tier of records is used; within that tier each target:port
is repeated weight.clamp(1, 20) times in the returned list so a plain
round-robin consumer still sees proportional selection frequency — see
[dns_srv] module docs for the exact algorithm and its bound.
Consul
Query a Consul agent’s /v1/health/service/:name endpoint. addr is
host:port of the agent (e.g. 127.0.0.1:8500); only instances passing
all health checks are returned.
Docker
Query the Docker Engine API (over a Unix domain socket) for running
containers carrying label, using each container’s value for that
label as the backend address directly (e.g. rws.backend=10.0.0.5:8080)
— see [docker] module docs for why the label value, not a published
port guess, is the address. Unix-only; a no-op elsewhere.
EtcdWatch
Watch an etcd v3 key prefix via its gRPC-gateway JSON/HTTP /v3/watch
endpoint. Unlike every other source, this is not driven by the
generic poll loop — BackendPool::start spawns a dedicated
long-lived connection instead, applying PUT/DELETE events
incrementally as they arrive rather than re-listing on each one.
resolve() (and therefore plain refresh()) still performs a one-shot
/v3/kv/range listing, so a pool built with this source is usable
without ever calling start(), just without live updates. Plain HTTP
only — no TLS support yet.