当前位置: 首页 > 编程笔记 >

golang http连接复用方法

鲜于光辉
2023-03-14
本文向大家介绍golang http连接复用方法,包括了golang http连接复用方法的使用技巧和注意事项,需要的朋友参考一下

server端

golang httpserver 默认开启keepalive连接复用选项

handler函数需要完整读body数据,构造返回消息,否则当数据不能一次发送完成时,连接复用就会失效。

示例如下

package main
 
import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"
)
 
func connHandler(w http.ResponseWriter, r *http.Request) {
	// parse
	r.ParseForm()
	response_time := r.Header.Get("sleep-time")
	// <= NOTE
	if _, err := ioutil.ReadAll(r.Body); err != nil {
		http.Error(w, err.Error(), 500)
		return
	}
	defer r.Body.Close()
	// sleep for some time
	resp_time := 1
	if response_time != "" {
		ms, _ := strconv.ParseFloat(response_time, 64)
		resp_time = (int)(ms * 1000)
	}
	time.Sleep(time.Duration(resp_time) * time.Millisecond)
	// parepare response
	status := 200
	body := ""
	w.Header().Set("Content-Type", "text/plain")
	w.Header().Set("Content-Length", strconv.Itoa(len(body)))
	w.WriteHeader(status)
	w.Write([]byte(body))
}
 
func main() {
	http.HandleFunc("/", connHandler)
	if err := http.ListenAndServe(":server_port", nil); err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

client 端

客户端需要构建全局client,完整读 response body,并关闭body

package main

import (
  "bytes"
  "fmt"
  "io"
  "io/ioutil"
  "log"
  "net/http"
  "time"
)

var (
  httpClient *http.Client
)

const (
  MaxIdleConnections int = 20
  RequestTimeout   int = 30
)

// init HTTPClient
func init() {
  httpClient = createHTTPClient()
}

// createHTTPClient for connection re-use
func createHTTPClient() *http.Client {
  client := &http.Client{
   Transport: &http.Transport{
      MaxIdle  ConnsPerHost: MaxIdleConnections,
 },
 Timeout: time.Duration(RequestTimeout) * time.Second,
  }
  return client
}

func conn_reuse_post(conn_reuse_times int) {
  var endPoint string = "http://server_ip:server_port/"
  data := []byte{}
  // fill data 
  for i := 0; i < conn_reuse_times; i++ {
 // use global httpClient to send request
 resp, err := httpClient.Post(endPoint, "application/x-www-form-urlencoded", bytes.NewBuffer([]byte(data)))
 fmt.Println(resp)
 if err != nil {
   log.Println("err", err)
   return
 }
 io.Copy(ioutil.Discard, resp.Body) // <= NOTE
 resp.Body.Close()  // <= NOTE
  }
}

func main() {
  conn_reuse_post(5)
}

以上这篇golang http连接复用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 尝试使用Docker容器将Kibana连接到ES时出错: kibana-product-624|{"type":"log","@time戳":"2018-05-25T14:56:36Z","tags":["警告","elasticsearch","admin"],"pid": 1,"消息":"无法恢复连接:超文本传输协议://elasticsearch: 9200/"}kibana-product

  • 我读过一些关于如何将Mongo与Node一起使用的指南,它们似乎都以不同的方式连接到数据库。对我来说很有效的一种特殊方式是: 然而,这对我来说似乎是低效/奇怪的,每次有时,我都必须重新连接到数据库,例如创建新用户或检索信息。 另一种似乎更适合我的方式是 我见过几个网站按照这些思路做了一些事情,但我个人无法让上面的工作。我一直收到错误服务器端。所以,我的问题是为什么上面的代码不起作用,如果第一个代码

  • 有人知道我的配置代码有什么问题吗?我只是一个PHP初学者,所以这里是我的错误 致命错误:未捕获错误:调用C:\XAMPP\htdocs\gas\u php\config.php:10中未定义的函数mysql\u connect() 堆栈跟踪: 0-C:\XAMPP\htdocs\gas_php\checkbanned.php(7):包括() 1-{main}在C:\XAMPP\htdocs\gas

  • 我目前正在尝试制作一个登录系统,它都在xampp中工作,但当我上传它并将其连接到我托管的数据库时,它只是给了我一个错误。 错误是:

  • 本文向大家介绍PHP连接SQLServer2005的方法,包括了PHP连接SQLServer2005的方法的使用技巧和注意事项,需要的朋友参考一下 1.修改php.ini将extension=php_mssql.dll的注释删除保存。 修改php.in将mssql.secure_connection = Off改为mssql.secure_connection = On。 2.下载连接2005的n