
go 使用http长连接读写influxdb
发布日期:2021-05-10 23:13:02
浏览次数:22
分类:精选文章
本文共 3606 字,大约阅读时间需要 12 分钟。
由于服务持续向InfluxDB写入数据,使用短连接会导致频繁的连接创建与关闭。为了优化性能,建议改用长连接方式。
以下是优化后的代码说明:
import ( "context" "crypto/tls" "fmt" "github.com/influxdata/influxdb1-client" "io/ioutil" "net" "net/http" "net/url" "path" "strings" "time")type Client struct { url url.URL unixSocket string username string password string httpClient *http.Client userAgent string precision string}func (c *Client) WriteLineProtocol(data, database, retentionPolicy, precision, writeConsistency string) (*client.Response, error) { u := c.url u.Path = path.Join(u.Path, "write") r := strings.NewReader(data) req, err := http.NewRequest("POST", u.String(), r) if err != nil { return nil, err } req.Header.Set("Content-Type", "") req.Header.Set("User-Agent", c.userAgent) if c.username != "" { req.SetBasicAuth(c.username, c.password) } params := req.URL.Query() params.Set("db", database) params.Set("rp", retentionPolicy) params.Set("precision", precision) params.Set("consistency", writeConsistency) req.URL.RawQuery = params.Encode() resp, err := c.httpClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() var response client.Response body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { err = fmt.Errorf(string(body)) response.Err = err return &response, err } return nil, nil}func longConnectionInfluxClient(c client.Config) (*Client, error) { tlsConfig := new(tls.Config) if c.TLS != nil { tlsConfig = c.TLS.Clone() } tlsConfig.InsecureSkipVerify = c.UnsafeSsl tr := &http.Transport{ Proxy: c.Proxy, TLSClientConfig: tlsConfig, DialContext: (&net.Dialer{ Timeout: 5 * time.Second, KeepAlive: 120 * time.Second, DualStack: true, }).DialContext, ForceAttemptHTTP2: true, MaxConnsPerHost: 100, MaxIdleConns: 1000, MaxIdleConnsPerHost: 100, IdleConnTimeout: 300 * time.Second, } if c.UnixSocket != "" { tr.DisableCompression = true tr.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) { return net.Dial("unix", c.UnixSocket) } } cl := Client{ url: c.URL, unixSocket: c.UnixSocket, username: c.Username, password: c.Password, httpClient: &http.Client{ Timeout: c.Timeout, Transport: tr, }, userAgent: c.UserAgent, precision: c.Precision, } if cl.userAgent == "" { cl.userAgent = "InfluxDBClient" } return &cl, nil}func initClient(hostIp, userName, password string, timeout int) *Client { host, err := url.Parse(fmt.Sprintf("http://%s", hostIp)) conf := client.Config{ URL: *host, Username: userName, Password: password, Timeout: time.Duration(timeout) * time.Second, } cl, err := longConnectionInfluxClient(conf) if err != nil { panic(err) } return cl}func main() { cl := initClient("10.10.25.50:8086", "", "", 5) str := "cpu,host=localhost value=10 1564387285" cl.WriteLineProtocol(str, "test", "autogen", "s", "")}
这段代码对现有InfluxDB客户端进行了优化,改用长连接方式以减少连接频繁创建与关闭的问题,同时保持了功能的完整性和性能。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月21日 09时53分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Redis概述和基础
2019-03-21
《可伸缩服务架构:框架与中间件》- 免费直接下载
2019-03-21
SSH整合的404错误
2019-03-21
wpf 使用Font Awesome
2019-03-21
阿里云Windows服务器+PHPStudy+apache 如何部署SSL证书
2019-03-21
宝塔如何配置一个IP多个端口访问不同项目
2019-03-21
c++11:std::declval、decltype
2019-03-21
Windows10:远程桌面连接报错“出现身份验证错误。要求的函数不受支持”
2019-03-21
Golang: ,ok模式
2019-03-21
C++ 错误:“xxx” does not name a type
2019-03-21
找不到自己Win10的Linux子系统的根目录?在这里哟!
2019-03-21
redis的发布和订阅
2019-03-21
lettcode 221. 最大正方形
2019-03-21
112. 路径总和(Javascript)
2019-03-21
G1 如何做到可预测的停顿和G1 垃圾收集器入门
2019-03-21
Tomcat启动报404(eclipse)
2019-03-21
0X3协议与数据包
2019-03-21
flutter 错误The method '/' was called on null.
2019-03-21
云区块链在各行业的应用场景
2019-03-21
重复执行 cp -r 得到的结果有什么区别
2019-03-21