Http Go中每个处理程序方法的并发连接数

Http Go中每个处理程序方法的并发连接数,http,go,proxy,connection,Http,Go,Proxy,Connection,我有一个类似上面的代码。 我想知道是否有办法找出handler“handleForServe2”有多少并发连接 该代码的目标是生成一个反向代理函数。但是,我还想添加基于每个连接到的服务器的并发连接的平衡加载 非常感谢你 一种方法是通过显式计算并发调用的数量来近似这个数字。这可能不够,因为它只能告诉您调用了多少次handleForServe2。举例说明: func handleForServer1(res http.ResponseWriter, req *http.Request) {

我有一个类似上面的代码。 我想知道是否有办法找出handler“handleForServe2”有多少并发连接

该代码的目标是生成一个反向代理函数。但是,我还想添加基于每个连接到的服务器的并发连接的平衡加载


非常感谢你

一种方法是通过显式计算并发调用的数量来近似这个数字。这可能不够,因为它只能告诉您调用了多少次
handleForServe2
。举例说明:

func handleForServer1(res http.ResponseWriter, req *http.Request) {
    rPayload := parseRequestBody(req)
    serve("http://server1:8080", res, req)
}

func handleForServer2(res http.ResponseWriter, req *http.Request) {
    rPayload := parseRequestBody(req)
    serve("http://server2:8080", res, req)
}

func serve(dest string, res http.ResponseWriter, req *http.Request) {
    url, _ := url.Parse(dest)
    p := httputil.NewSingleHostReverseProxy(url)

    req.URL.Host = url.Host
    req.URL.Scheme = url.Scheme
    req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
    req.Host = url.Host

    p.ServeHTTP(res, req)
}
ticker:=time.NewTicker(5*time.Second)
为了{
挑选{

案例见。1.感谢您的评论dm30514,我有一个问题。在您的示例中,您使用了RWMutex。我们是否必须使用一些互斥?2.第二个示例,您有RLock,然后打印数字并解锁。即使读取计数,您也必须锁定它吗?也许:p.严格来说,不适用于您的确切示例。您是否正在执行
handleForServer2
在go HTTP服务器的上下文中(我假设您是)?如果是,则需要某种类型的同步。这是因为go的HTTP服务器将在单独的go例程中(并发)调用每个处理程序.对于第二个示例,我只是想说明使用变量也需要同步。正如您指出的,如果这是唯一的读取器,我认为
RLock
很愚蠢,因为它永远不会有并发读取:)非常感谢!
mu sync.RWMutex
concurrentInvocations := 0

func handleForServer2(res http.ResponseWriter, req *http.Request) {
    mu.Lock()
    concurrentInvocations++
    mu.Unlock()

    defer func() {
       mu.Lock()
       concurrentInvocations--
       mu.Unlock()
    }()

    rPayload := parseRequestBody(req)
    serve("http://server2:8080", res, req)
}
ticker := time.NewTicker(5 * time.Second)
for {
   select {
     case <- ticker.C:
       mu.RLock()
       fmt.Printf("Current %d concurrent requests\n", concurrentInvocations)
       mu.RUnlock()
   }
}