Go网络请求中配置代理

如何配置代理


不配置代理,本地请求google等会超时

package main

import (
 "fmt"
 "net/http"
 "time"
)

func main() {
 // 创建一个自定义的 Transport 实例
 //transport := &http.Transport{
 // Proxy: func(req *http.Request) (*url.URL, error) {
 //  // return url.Parse("http://127.0.0.1:1081")
 //  return url.Parse("socks5://127.0.0.1:1080")
 // },
 //}

 // 创建一个自定义的 Client 实例
 client := &http.Client{
  //Transport: transport, // 设置代理
  Timeout: time.Second * 3// 设置超时
 }

 urlStr := "https://www.google.com/"
 // 发送 GET 请求
 resp, err := client.Get(urlStr)
 if err != nil {
  // 处理错误
  fmt.Println("发生了错误:err", err)
  return
 }
 defer resp.Body.Close()

 // 处理响应

 fmt.Println(resp.StatusCode)
}

输出: 发生了错误:err Get "https://www.google.com/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)


取消注释,则会输出 200


go http Client的Transport字段有什么作用


在 Go 的 http 包中,Client 类型代表了 HTTP 客户端。在 Client 中有一个名为 Transport 的字段,它是一个 http.RoundTripper 接口类型的值,用于处理 HTTP 请求和响应的传输细节。

通过设置 Transport 字段,可以对 HTTP 请求进行一些自定义设置,比如设置代理、设置超时、设置 TLS 客户端证书等。Transport 字段提供了一些默认实现,也可以通过实现 http.RoundTripper 接口来自定义实现。

例如,可以通过自定义 Transport 来设置 HTTP 代理:

transport := &http.Transport{
    Proxy: func(req *http.Request) (*url.URL, error) {
        return url.Parse("http://127.0.0.1:8888")
    },
}
client := &http.Client{
    Transport: transport,
}

在上面的代码中,通过自定义 Transport 并设置代理来实现将所有 HTTP 请求通过本地的代理服务器进行转发。这样就可以在代理服务器上进行一些中间人攻击的操作,如抓包、篡改请求等。


设置超时不是这个字段吧


确实... 在 Go 的 http.Client 中,超时是通过 Timeout 字段来设置的,而 Transport 字段用于控制 HTTP 客户端的网络传输设置,例如代理、TLS 配置、连接池等。超时时间是通过 Timeout 字段指定的,而不是 Transport 字段。


我在用go写一段请求很多个url然后返回响应内容的程序,通过设置http Client的Transport设置了代理,但发现大量的EOF,这是什么原因?


在使用 HTTP 客户端请求多个 URL 时,如果设置了代理,可能会导致连接出现大量的 EOF 错误。这通常是由于代理服务器在连接到远程服务器时关闭了连接,而客户端仍在尝试使用已关闭的连接进行通信,从而导致错误。

一种可能的解决方案是,针对每个请求创建一个新的 HTTP 客户端,并在使用完毕后立即关闭它。这样可以确保每个请求都使用一个新的连接,避免出现连接复用的问题。示例代码如下:

func fetchURL(url string) (string, error) {
    // 创建一个自定义的 Transport 实例
    transport := &http.Transport{
        Proxy: func(req *http.Request) (*url.URL, error) {
            return url.Parse("http://127.0.0.1:1080"// 设置代理
        },
    }

    // 创建一个自定义的 Client 实例
    client := &http.Client{
        Transport: transport, // 设置 Transport
        Timeout:   time.Second * 3// 设置超时
    }

    // 发送 GET 请求
    resp, err := client.Get(url)
    if err != nil {
        // 处理错误
        return "", err
    }
    defer resp.Body.Close()

    // 读取响应内容
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // 处理错误
        return "", err
    }

    // 返回响应内容
    return string(body), nil
}

func main() {
    urls := []string{
        "http://example.com",
        "http://example.org",
        "http://example.net",
    }

    // 遍历 URL 列表,并发送请求
    for _, url := range urls {
        resp, err := fetchURL(url)
        if err != nil {
            fmt.Printf("fetch %s error: %s\n", url, err)
        } else {
            fmt.Printf("fetch %s success: %s\n", url, resp)
        }
    }
}

此外,还可以尝试对 Transport 的 MaxIdleConnsPerHost 和 MaxIdleConns 进行调整,以确保连接复用时不会出现连接超时或连接关闭的问题。


Transport 的 MaxIdleConnsPerHost 和 MaxIdleConns 是什么意思


Transport的MaxIdleConnsPerHost和MaxIdleConns字段都是用来控制http client连接池的大小和行为的。

  • MaxIdleConnsPerHost:指定连接池中每个主机允许的最大空闲连接数。 默认值是2
  • MaxIdleConns:指定整个连接池允许的最大空闲连接数。默认值是无限制。

当http client创建一个连接时,它将尝试重用现有的空闲连接。如果连接池中没有空闲连接,则http client将创建一个新的连接。如果连接池中的空闲连接已达到MaxIdleConns或MaxIdleConnsPerHost,则http client将关闭连接。

因此,如果将MaxIdleConns和MaxIdleConnsPerHost设置得太小,那么http client将会频繁地关闭和创建连接,这会导致一些EOF错误。可以适当地增加这些字段的值,以减少这些错误的发生。


如何设置?


可以通过在创建 Transport 实例时进行设置,例如:

transport := &http.Transport{
    MaxIdleConnsPerHost: 10,  // 每个主机最大空闲连接数
    MaxIdleConns:        100// 最大空闲连接数
}

其中,MaxIdleConnsPerHost 表示每个主机最大的空闲连接数,MaxIdleConns 表示所有主机的最大空闲连接数。您可以根据实际情况进行调整。需要注意的是,如果 MaxIdleConnsPerHost 设置的太小,可能会导致无法复用连接,从而增加了连接的建立和关闭成本;如果设置的太大,可能会占用过多的系统资源。

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx是一个高性能的开源Web服务器,作为一个反向代理服务器,它可以接收客户端请求并将其转发给后端的服务器进行处理。而Golang是一种快速、高效且易于使用的编程语言,也被广泛用于开发网络应用。 使用Nginx和Golang进行反向代理可以带来许多好处。首先,Nginx作为反向代理服务器,具有负载均衡的能力,可以将客户端请求分发给多个后端服务器,从而提高系统的可靠性和可扩展性。同时,Nginx还能够缓存静态文件,减轻后端服务器的负担,提高系统的性能。 而Golang作为后端服务器的开发语言,具有并发执行的能力,可以处理大量的请求。它的编译速度非常快,且可以将应用程序编译成独立的二进制文件,无需依赖其他库。这意味着,我们可以方便地在多个服务器之间部署Golang应用程序,而不需要为每个服务器都安装Golang环境。 在实际使用,我们可以将Nginx作为反向代理服务器,通过配置Nginx的代理规则,将客户端的请求转发给后端的Golang服务器。同时,可以通过Nginx的负载均衡策略,将请求分发给多个Golang服务器,以提高系统的可用性和性能。 总结来说,使用Nginx和Golang进行反向代理可以实现负载均衡、高可用性和高性能的网络应用。Nginx作为反向代理服务器能够高效地处理客户端请求,并将其转发给后端的Golang服务器进行处理。而Golang作为后端服务器的开发语言,具有并发执行和快速编译的优势,适合用于处理大量的请求。通过结合使用Nginx和Golang,我们可以构建出稳定、可靠且高性能的网络应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值