SimpleResolver是否支持多参数?Java多DNS服务器查询方案
Great question! Let's walk through your options—whether you want a ready-made solution or want to roll your own extension to SimpleResolver, you’ve got solid paths forward.
ExtendedResolver (Recommended) You don’t need to look far—dnsjava already has a class designed explicitly for querying multiple DNS servers: ExtendedResolver. It handles failover between servers out of the box, so you can pass a list of server addresses directly and it will try them in order until it gets a valid response.
Here’s how to use it:
import org.xbill.DNS.ExtendedResolver; import org.xbill.DNS.Message; import org.xbill.DNS.Record; import org.xbill.DNS.Type; import org.xbill.DNS.Name; import org.xbill.DNS.DClass; public class MultiDnsExample { public static void main(String[] args) throws Exception { // List of your DNS servers String[] dnsServers = {"8.8.8.8", "1.1.1.1", "9.9.9.9"}; // Initialize the resolver with multiple servers ExtendedResolver resolver = new ExtendedResolver(dnsServers); // Create your DNS query (example: A record for google.com) Record queryRecord = Record.newRecord(Name.fromString("google.com."), Type.A, DClass.IN); Message query = Message.newQuery(queryRecord); // Send the query—ExtendedResolver handles failover automatically Message response = resolver.send(query); // Process the response as needed System.out.println("Received response from: " + resolver.getLastAddress()); // ... } }
This is the best approach for most cases because it’s maintained as part of dnsjava, includes error handling, and supports standard resolver configurations (like timeouts, ports, etc.).
SimpleResolver (For Custom Behavior) If you need full control over how servers are prioritized, retried, or rotated (e.g., custom load balancing logic), you can create a custom Resolver implementation that wraps multiple SimpleResolver instances.
Here’s a basic example of a multi-server resolver that tries each server in sequence until it succeeds:
import org.xbill.DNS.Resolver; import org.xbill.DNS.SimpleResolver; import org.xbill.DNS.Message; import org.xbill.DNS.DNSException; import java.io.IOException; import java.util.List; import java.util.ArrayList; public class MultiServerResolver implements Resolver { private final List<SimpleResolver> resolvers; // Constructor takes a list of DNS server addresses public MultiServerResolver(List<String> serverAddresses) throws DNSException { resolvers = new ArrayList<>(); for (String addr : serverAddresses) { SimpleResolver resolver = new SimpleResolver(addr); // Configure common settings here (timeout, port, etc.) resolver.setTimeout(5); // 5 second timeout per server resolvers.add(resolver); } } @Override public Message send(Message message) throws IOException { IOException lastError = null; for (SimpleResolver resolver : resolvers) { try { System.out.println("Querying server: " + resolver.getAddress()); return resolver.send(message); } catch (IOException e) { lastError = e; System.err.println("Failed to query " + resolver.getAddress() + ": " + e.getMessage()); } } // All servers failed—throw the last encountered error throw lastError != null ? lastError : new IOException("No DNS servers configured"); } // Delegate other Resolver interface methods to all underlying resolvers @Override public void setPort(int port) { resolvers.forEach(resolver -> resolver.setPort(port)); } @Override public void setTimeout(int secs) { resolvers.forEach(resolver -> resolver.setTimeout(secs)); } // Implement other required methods (like setTCP, setIgnoreTruncation) similarly @Override public void setTCP(boolean flag) { resolvers.forEach(resolver -> resolver.setTCP(flag)); } }
You can use this custom resolver just like any other:
import java.util.List; public class CustomMultiDnsExample { public static void main(String[] args) throws Exception { List<String> dnsServers = List.of("8.8.8.8", "1.1.1.1"); MultiServerResolver resolver = new MultiServerResolver(dnsServers); // Create and send your query... Message query = Message.newQuery(...); Message response = resolver.send(query); } }
This gives you full flexibility to tweak the logic—for example, you could add round-robin rotation, weighted selection, or custom retry limits.
内容的提问来源于stack exchange,提问作者user1942095

