Help us shape the future of Go! Take the 2026 Go Developer Survey

http

package
v1.20.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 16, 2026 License: Apache-2.0 Imports: 14 Imported by: 0

Documentation

Overview

出站熔断(ROADMAP G2):经典三态(closed/open/half-open)熔断器, 基于 sony/gobreaker/v2 封装——本包公共 API 零 gobreaker 类型 (实现可替换,kratos v3 的同款教训),配置经 CircuitBreakerOptions 映射,集成于 Client.Do 的最外层(重试之外:一次调用整体成败只计 一次,熔断打开时不再进入重试循环)。

Package http 提供框架的 HTTP 客户端:OpenTelemetry 插装、trace 与 日志属性(request_id/user_id)传播、整体超时与可配置重试。 与 server/http 相对,面向服务间调用场景。

Index

Constants

View Source
const DefaultTimeout = 30 * time.Second

DefaultTimeout 是整体超时的缺省值(30s)。

View Source
const RequestIDHeader = serverkit.RequestIDKey

RequestIDHeader 是 request_id 透传的 HTTP 请求头名:与 server 侧及 gRPC metadata 同源的共享 wire 键(internal/serverkit)。

View Source
const UserIDHeader = serverkit.UserIDKey

UserIDHeader 是 user_id 透传的 HTTP 请求头名(与 gRPC metadata 同源)。

Variables

View Source
var ErrCircuitOpen = errors.New("http client: circuit breaker open")

ErrCircuitOpen 表示熔断器处于 open 态(或 half-open 探测超限), 请求被本地拒绝——未发出任何网络请求。业务可用 errors.Is 判定并 走降级路径。

Functions

This section is empty.

Types

type CircuitBreakerOptions added in v1.13.0

type CircuitBreakerOptions struct {
	// Name 标识熔断器(状态回调与日志中的 breaker 名),缺省
	// "http-client"。
	Name string
	// MaxRequests 是 half-open 态放行的探测请求数;0 表示只放行 1 个
	//(gobreaker 语义)。
	MaxRequests uint32
	// Interval 是 closed 态计数的周期清零间隔(固定窗口);0 表示不
	// 周期清零。
	Interval time.Duration
	// Timeout 是 open 态时长,到期转 half-open 放行探测;<=0 默认 60s。
	Timeout time.Duration
	// MinConsecutiveFailures 是连续失败多少次后打开熔断;0 默认 5。
	// 客户端主动取消(ctx 取消/超时)不计入失败(见 newCircuitBreaker
	// 的排除规则)。
	MinConsecutiveFailures uint32
	// FailureStatusCodes 额外计入失败的响应状态码。缺省仅传输层错误
	//(err != nil)算失败——HTTP 4xx/5xx 是对端的正常响应语义;运维
	// 认定"对端 503 = 下游不可用"时按需加入。
	FailureStatusCodes []int
	// OnStateChange 在状态迁移时回调(from/to 取 "closed"/"open"/
	// "half-open")。框架侧同时记录 Info 日志;需要桥接 eventbus 的
	// 应用在此回调里自行 Publish。
	OnStateChange func(name, from, to string)
}

CircuitBreakerOptions 是出站熔断的配置项(零 gobreaker 类型, 字段语义见各注释;缺省值见 newCircuitBreaker)。

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client 是框架的 HTTP 客户端,实现 lynx 的传播与超时/重试约定。

func New

func New(opts ...Option) *Client

New 创建 HTTP 客户端,零配置可用:整体超时 30s、不重试; transport 为 http.DefaultTransport 的浅克隆 + otelhttp 插装 (不修改进程全局默认值)。

func (*Client) Do

func (c *Client) Do(req *http.Request) (*http.Response, error)

Do 发送请求并返回响应,行为约定如下:

  • 传播:将 req.Context() 中的日志属性写入请求头(request_id → X-Request-Id、user_id → X-User-Id),已存在的同名请求头不覆盖; otelhttp 插装同时注入 traceparent 等传播上下文。对端配合 server/http.WithRequestID 即可还原 request_id,形成传播闭环。
  • 超时:整体超时(见 WithTimeout)覆盖全部重试;调用方 ctx 已带 deadline 时以调用方为准。超时到 Do 返回时尚未结束:返回的响应体 读取持续受该超时约束——读到 EOF 或 Close 之前定时器保持存活, 到期后读取返回 context deadline exceeded(仿标准库 cancelTimerBody 模式,SC-01)。
  • 重试:仅当 WithRetry 启用时生效。重试条件为传输层错误(调用方 ctx 取消/超时除外)或状态码 429/502/503/504;429/503 响应携带 Retry-After 头时,等待至少其指示的时长(秒数或 HTTP-date)。 带请求体(req.Body 非 nil)且不可重放(req.GetBody 为 nil)的 请求只发送一次、不重试,并记 debug 日志。每次重试前会自动关闭 上一次尝试的响应体;可重放请求在重试前经 GetBody 重建请求体。

本方法不读取、不关闭响应体:调用方负责读取并关闭(重试中途丢弃的 响应体由客户端内部关闭)。

func (*Client) Get

func (c *Client) Get(ctx context.Context, url string) (*http.Response, error)

Get 以 ctx 发起 GET 请求,响应体由调用方负责读取与关闭。

func (*Client) Post

func (c *Client) Post(ctx context.Context, url string, body io.Reader) (*http.Response, error)

Post 以 ctx 发起 POST 请求,body 为请求体。body 为 *bytes.Buffer、 *bytes.Reader 或 *strings.Reader 时自动可重放(可安全重试)。 响应体由调用方负责读取与关闭。

type Option

type Option func(*Options)

Option 用于配置 HTTP 客户端 Options 的选项函数。

func WithCircuitBreaker added in v1.13.0

func WithCircuitBreaker(cfg CircuitBreakerOptions) Option

WithCircuitBreaker 启用出站熔断:连续失败达到阈值后打开熔断, 后续请求本地快速拒绝(ErrCircuitOpen,不发网络请求);open 态到期 转 half-open 放行探测请求,探测成功回到 closed。与 WithRetry 并存时 熔断在重试之外层——重试的全部尝试构成一次调用的整体成败。

func WithClientOptions

func WithClientOptions(fn func(*http.Client)) Option

WithClientOptions 透传配置底层 *http.Client 的逃生口:在内部默认 transport(otel 插装的 DefaultTransport 浅克隆)装配之后应用, 可整体替换 Transport 或覆盖其他字段。

func WithLogger

func WithLogger(l *slog.Logger) Option

WithLogger 设置客户端内部日志(如不可重试原因)使用的日志实例; nil 时使用 slog.Default()。

func WithPropagator

func WithPropagator(p propagation.TextMapPropagator) Option

WithPropagator 设置向请求注入传播上下文(traceparent 等)使用的 TextMapPropagator;nil 时使用全局 propagator。

func WithRetry

func WithRetry(maxAttempts int, opts ...RetryOption) Option

WithRetry 启用重试:maxAttempts 为总尝试次数(含首次), maxAttempts < 1 时 panic。重试条件与 Retry-After 语义见 Client.Do。 退避使用指数退避(cenkalti/backoff),opts 可调整退避参数。 警示:传输层错误重试对非幂等请求不安全(可能重复副作用,见 retriable 注释),非幂等请求建议不启用重试。

func WithTimeout

func WithTimeout(d time.Duration) Option

WithTimeout 设置整体超时:自 Do 发起起覆盖全部尝试(含重试), Do 返回后仍约束响应体读取(ctx 到期后读取返回错误)。缺省 30s; 调用方 ctx 已带 deadline 时不叠加,以调用方为准。传 0 表示无超时。

func WithTracerProvider

func WithTracerProvider(tp trace.TracerProvider) Option

WithTracerProvider 设置客户端插装使用的 TracerProvider;nil 时使用 全局(缺省 noop)provider。provider 生命周期由调用方负责, 显式注入、不修改进程全局。

type Options

type Options struct {
	// Timeout 为整体超时,0 表示无超时。
	Timeout time.Duration
	// TracerProvider 为插装使用的 TracerProvider,nil 时用全局(缺省 noop)。
	TracerProvider trace.TracerProvider
	// Propagator 为传播上下文注入使用的 TextMapPropagator,nil 时用全局。
	Propagator propagation.TextMapPropagator
	// Logger 为重试等内部日志使用的实例,nil 时用 slog.Default()。
	Logger *slog.Logger
	// Retry 非 nil 时启用重试(WithRetry 装配)。
	Retry *RetryOptions
	// CircuitBreaker 非 nil 时启用出站熔断(WithCircuitBreaker 装配,
	// 集成于重试之外层,见 circuitbreaker.go)。
	CircuitBreaker *CircuitBreakerOptions
	// ClientOptions 透传配置底层 *http.Client 的逃生口。
	ClientOptions func(*http.Client)
}

Options 是 HTTP 客户端的配置项。

type RetryOption

type RetryOption func(*RetryOptions)

RetryOption 用于配置重试策略的选项函数。

func WithRetryInitialInterval

func WithRetryInitialInterval(d time.Duration) RetryOption

WithRetryInitialInterval 设置退避起点,缺省 500ms。

func WithRetryMaxInterval

func WithRetryMaxInterval(d time.Duration) RetryOption

WithRetryMaxInterval 设置退避等待时长上限,缺省 60s。

type RetryOptions

type RetryOptions struct {
	// MaxAttempts 为总尝试次数(含首次)。
	MaxAttempts int
	// InitialInterval 为首次重试等待的基准时长(指数退避起点)。
	InitialInterval time.Duration
	// MaxInterval 为退避等待时长的上限。
	MaxInterval time.Duration
}

RetryOptions 是重试策略的配置项。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL