diff --git a/go.mod b/go.mod index 6211db0..b48f271 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,10 @@ require ( golang.org/x/sys v0.25.0 ) -require golang.org/x/net v0.0.0-20190620200207-3b0461eec859 +require ( + github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529 + golang.org/x/net v0.0.0-20190620200207-3b0461eec859 +) require ( github.com/GeertJohan/go.rice v1.0.2 // indirect @@ -38,5 +41,6 @@ require ( github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/go.sum b/go.sum index f71f436..59d7320 100644 --- a/go.sum +++ b/go.sum @@ -163,6 +163,8 @@ github.com/qjfoidnh/Baidu-Login v1.4.1/go.mod h1:oRFCmVYQka0KYwvbf2zS6UeMupgv0w1 github.com/qjfoidnh/BaiduPCS-Go v0.0.0-20201218134534-d55d9918bd1b/go.mod h1:00iH1dQEStMeT3t+oeVrIucWcu3fFEaFYyygNxfOEv4= github.com/qjfoidnh/baidu-tools v1.2.0 h1:VoXJCN16xzL0xh1BOI2l2p80X5HwKB0PE4SgtX8wn30= github.com/qjfoidnh/baidu-tools v1.2.0/go.mod h1:TzIKHinLPcQbWxAROpqoSvYxM/kDeswfXJaQ2E1p4zs= +github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529 h1:18kd+8ZUlt/ARXhljq+14TwAoKa61q6dX8jtwOf6DH8= +github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -216,6 +218,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/requester/http_client.go b/requester/http_client.go index 4a2f20e..f4a8908 100644 --- a/requester/http_client.go +++ b/requester/http_client.go @@ -8,6 +8,8 @@ import ( "net/http" "net/http/cookiejar" "time" + + "github.com/rs/dnscache" ) // HTTPClient http client @@ -40,22 +42,46 @@ func dialTrace(ctx context.Context, network, addr string) (net.Conn, error) { return traceConn{Conn: raw, id: id}, nil } +func cacheDNS() *http.Transport { + resolver := &dnscache.Resolver{} + + // 2. 自定义 DialContext:先查缓存,再拨号 + dialer := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + } + tr := &http.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + host, port, _ := net.SplitHostPort(addr) + // 缓存解析 + ips, err := resolver.LookupHost(ctx, host) + if err != nil { + return nil, err + } + // 简单轮询 IP + ip := ips[0] + conn, err := dialer.DialContext(ctx, network, net.JoinHostPort(ip, port)) + if err == nil { + return conn, nil + } + + return nil, err + }, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + } + return tr +} + // NewHTTPClient 返回 HTTPClient 的指针, // 预设了一些配置 func NewHTTPClient() *HTTPClient { fmt.Println("new one") h := &HTTPClient{ Client: http.Client{ - Timeout: 50 * time.Second, - Transport: &http.Transport{ - DialContext: dialTrace, - MaxIdleConns: 20, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - // 关键:打开状态回调 - DisableKeepAlives: false, - }, + Timeout: 50 * time.Second, + Transport: cacheDNS(), }, UserAgent: UserAgent, }