64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
|
|
package client
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"net/http"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// HTTPClientConfig HTTP客户端配置
|
|||
|
|
type HTTPClientConfig struct {
|
|||
|
|
Timeout time.Duration
|
|||
|
|
MaxIdleConns int
|
|||
|
|
MaxIdleConnsPerHost int
|
|||
|
|
MaxConnsPerHost int
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DefaultHTTPClientConfig 默认HTTP客户端配置
|
|||
|
|
var DefaultHTTPClientConfig = HTTPClientConfig{
|
|||
|
|
Timeout: 30 * time.Second,
|
|||
|
|
MaxIdleConns: 100,
|
|||
|
|
MaxIdleConnsPerHost: 50,
|
|||
|
|
MaxConnsPerHost: 0, // 0表示不限制
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewHTTPClient 创建优化的HTTP客户端
|
|||
|
|
func NewHTTPClient(config HTTPClientConfig) *http.Client {
|
|||
|
|
transport := &http.Transport{
|
|||
|
|
// 连接池配置
|
|||
|
|
MaxIdleConns: config.MaxIdleConns,
|
|||
|
|
MaxIdleConnsPerHost: config.MaxIdleConnsPerHost,
|
|||
|
|
MaxConnsPerHost: config.MaxConnsPerHost,
|
|||
|
|
IdleConnTimeout: 90 * time.Second,
|
|||
|
|
|
|||
|
|
// 性能优化
|
|||
|
|
DisableCompression: false,
|
|||
|
|
DisableKeepAlives: false,
|
|||
|
|
ForceAttemptHTTP2: true, // 启用HTTP/2
|
|||
|
|
|
|||
|
|
// 超时配置
|
|||
|
|
TLSHandshakeTimeout: 10 * time.Second,
|
|||
|
|
ResponseHeaderTimeout: 30 * time.Second,
|
|||
|
|
ExpectContinueTimeout: 1 * time.Second,
|
|||
|
|
|
|||
|
|
// 缓冲大小
|
|||
|
|
WriteBufferSize: 32 * 1024, // 32KB写缓冲
|
|||
|
|
ReadBufferSize: 32 * 1024, // 32KB读缓冲
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &http.Client{
|
|||
|
|
Timeout: config.Timeout,
|
|||
|
|
Transport: transport,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewLLMHTTPClient 创建用于LLM的HTTP客户端(连接池更大)
|
|||
|
|
func NewLLMHTTPClient(timeout time.Duration) *http.Client {
|
|||
|
|
config := HTTPClientConfig{
|
|||
|
|
Timeout: timeout,
|
|||
|
|
MaxIdleConns: 200,
|
|||
|
|
MaxIdleConnsPerHost: 100,
|
|||
|
|
MaxConnsPerHost: 0,
|
|||
|
|
}
|
|||
|
|
return NewHTTPClient(config)
|
|||
|
|
}
|