pkg/http/restyclient/client.go

102 lines
2.5 KiB
Go
Raw Permalink Normal View History

2024-12-28 12:26:36 +00:00
// Package restyclient for http client
package restyclient
import (
"context"
"crypto/tls"
"net"
"net/http"
"sync"
"time"
"github.com/go-resty/resty/v2"
"github.com/google/uuid"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)
const (
timeout = time.Second * 30
)
var (
clientOnce sync.Once
silentClientOnce sync.Once
globalClient *resty.Client
globalSilentClient *resty.Client
)
var dialer = &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}
// defaultTransport default transport
var defaultTransport http.RoundTripper = &http.Transport{
DialContext: dialer.DialContext,
ForceAttemptHTTP2: true,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
// NOCC:gas/tls(设计如此)
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // nolint
}
// New : 新建 Client, 设置公共参数tracing 等; 每次新建cookies不复用
func New() *resty.Client {
if globalClient == nil {
clientOnce.Do(func() {
globalClient = resty.New().
SetTransport(otelhttp.NewTransport(defaultTransport)).
SetTimeout(timeout).
SetCookieJar(nil).
SetDebugBodyLimit(1024).
OnAfterResponse(restyAfterResponseHook).
SetPreRequestHook(restyBeforeRequestHook).
OnError(restyErrHook).
2024-12-28 14:06:48 +00:00
SetHeader("User-Agent", "restyclient")
2024-12-28 12:26:36 +00:00
})
}
return globalClient
}
// silentNew 安静模式,只打印错误日志
func silentNew() *resty.Client {
if globalSilentClient == nil {
silentClientOnce.Do(func() {
globalSilentClient = resty.New().
SetTransport(otelhttp.NewTransport(defaultTransport)).
SetTimeout(timeout).
SetCookieJar(nil).
SetDebugBodyLimit(1024).
// OnAfterResponse(restyAfterResponseHook).
// SetPreRequestHook(restyBeforeRequestHook).
OnError(restyErrHook).
SetHeader("User-Agent", "envmgr-restyclient")
})
}
return globalSilentClient
}
// R : New().R() 快捷方式, 已设置公共参数tracing 等
func R() *resty.Request {
return New().R()
}
// SilentR : 安静模式,只打印错误日志 已设置公共参数tracing 等, 只打印错误日志
func SilentR() *resty.Request {
return silentNew().R()
}
// GenRequestID 生产 request_id
func GenRequestID() string {
id, _ := uuid.NewRandom()
return id.String()
}
// WithRequestID 设置 request_id
func WithRequestID(ctx context.Context, id string) context.Context {
newCtx := context.WithValue(ctx, requestIDCtxKey, id)
return newCtx
}