OkHttp源码学习之DNS

683 阅读2分钟

作用

OkHttp 中,DNS(域名系统)用于将主机名解析为 IP 地址,以便发起网络请求时能找到目标服务器。DNS 是网络请求流程中的关键环节。在我们日常的需求开发中,默认的 SYSTEM DNS 已经能满足大部分需求,但对于需要特定 DNS 解析的场景,自定义 DNS 能提供更高的灵活性和适应性。

DNS 的作用

  1. 域名解析
    将请求的 URL 中的域名(如 www.example.com)解析为对应的 IP 地址(如 93.184.216.34)。

  2. 支持自定义解析逻辑
    OkHttp 允许开发者提供自定义的 DNS 解析器(通过实现 okhttp3.Dns 接口),以满足以下需求:

    -自定义域名解析策略。

    -使用本地 DNS 缓存或特定的 DNS 服务器。

    -规避默认系统 DNS 的限制或不可靠问题。

  3. 负载均衡支持
    DNS 解析通常返回多个 IP 地址,OkHttp 支持从这些 IP 中选择一个进行请求,这在负载均衡或冗余场景下很有用。

  4. 提高灵活性

    -在一些内网场景,可能需要解析私有域名。

    -在受限网络中,可以使用特定的 DNS 服务(如 DoH、私有 DNS)来绕过限制。

自定义 DNS 的使用

OkHttp 允许通过 OkHttpClient.Builder 设置自定义的 DNS 实现:

val customDns = object : Dns {
    override fun lookup(hostname: String): List<InetAddress> {
        // 自定义解析逻辑,比如使用指定的 DNS 服务器
        return InetAddress.getAllByName(hostname).toList()
    }
}

val client = OkHttpClient.Builder()
    .dns(customDns)
    .build()

常见场景

  1. 指定特定的 DNS 服务器 可以实现 Dns 接口,指定一个固定的 DNS 服务器地址(如 Google DNS 或 Cloudflare DNS)。
  2. 内部 DNS 解析 如果是在公司内网中,可以实现自定义 DNS 逻辑以解析私有域名。
  3. DNS 缓存 通过自定义实现,可以引入本地缓存逻辑以减少 DNS 查询次数,提高性能。