golang缓存DNS吗?
Is golang caching DNS?
我正在 运行 编写一段 golang 代码来解析 url。
这个 url 应该 returns 一个 ip 用于 50% 的请求,另一个 ip 用于其他 50%。
这在我执行 host
命令时有效,但在我使用 Go 解析 DNS 时无效。在我的研究中,我看到的每个答案都说 Golang 不缓存 DNS,但行为似乎有所不同。
谁能澄清一下?
这是我的代码,我正在使用 for 循环 运行 100 次:
for value in {1..100};do go run main.go;done
"fmt"
"net"
)
func main() {
iprecords, _ := net.LookupIP("google.com")
for _, ip := range iprecords {
fmt.Println(ip)
}
}
在 OS X
上使用 CGO_ENABLED=1(go build
默认值)时,根据 net package docs,Go
将使用:
... the cgo-based resolver ... on systems that do not
let programs make direct DNS requests (OS X)
因此,如果您在 MacOS
上观察 DNS 缓存 - 那么这是在 OS 级别发生的。
您可以尝试使用 Go
的本地 DNS 解析器,看看这是否是一个可行的替代方案。
您可以通过以下任一方式完成此操作:
CGO_ENABLED=0 go build # disabling CGO
或更巧妙地使用运行时环境变量:
export GODEBUG=netdns=go # force pure Go resolver
这有其局限性,例如在 VPN 拆分隧道 DNS 路由上使用 Go
的本地解析器将无法工作。 YMMV.
我正在 运行 编写一段 golang 代码来解析 url。
这个 url 应该 returns 一个 ip 用于 50% 的请求,另一个 ip 用于其他 50%。
这在我执行 host
命令时有效,但在我使用 Go 解析 DNS 时无效。在我的研究中,我看到的每个答案都说 Golang 不缓存 DNS,但行为似乎有所不同。
谁能澄清一下?
这是我的代码,我正在使用 for 循环 运行 100 次:
for value in {1..100};do go run main.go;done
"fmt"
"net"
)
func main() {
iprecords, _ := net.LookupIP("google.com")
for _, ip := range iprecords {
fmt.Println(ip)
}
}
在 OS X
上使用 CGO_ENABLED=1(go build
默认值)时,根据 net package docs,Go
将使用:
... the cgo-based resolver ... on systems that do not let programs make direct DNS requests (OS X)
因此,如果您在 MacOS
上观察 DNS 缓存 - 那么这是在 OS 级别发生的。
您可以尝试使用 Go
的本地 DNS 解析器,看看这是否是一个可行的替代方案。
您可以通过以下任一方式完成此操作:
CGO_ENABLED=0 go build # disabling CGO
或更巧妙地使用运行时环境变量:
export GODEBUG=netdns=go # force pure Go resolver
这有其局限性,例如在 VPN 拆分隧道 DNS 路由上使用 Go
的本地解析器将无法工作。 YMMV.