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
- Variables
- type CircuitBreakerOptions
- type Client
- type Option
- func WithCircuitBreaker(cfg CircuitBreakerOptions) Option
- func WithClientOptions(fn func(*http.Client)) Option
- func WithLogger(l *slog.Logger) Option
- func WithPropagator(p propagation.TextMapPropagator) Option
- func WithRetry(maxAttempts int, opts ...RetryOption) Option
- func WithTimeout(d time.Duration) Option
- func WithTracerProvider(tp trace.TracerProvider) Option
- type Options
- type RetryOption
- type RetryOptions
Constants ¶
const DefaultTimeout = 30 * time.Second
DefaultTimeout 是整体超时的缺省值(30s)。
const RequestIDHeader = serverkit.RequestIDKey
RequestIDHeader 是 request_id 透传的 HTTP 请求头名:与 server 侧及 gRPC metadata 同源的共享 wire 键(internal/serverkit)。
const UserIDHeader = serverkit.UserIDKey
UserIDHeader 是 user_id 透传的 HTTP 请求头名(与 gRPC metadata 同源)。
Variables ¶
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 ¶
New 创建 HTTP 客户端,零配置可用:整体超时 30s、不重试; transport 为 http.DefaultTransport 的浅克隆 + otelhttp 插装 (不修改进程全局默认值)。
func (*Client) Do ¶
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 重建请求体。
本方法不读取、不关闭响应体:调用方负责读取并关闭(重试中途丢弃的 响应体由客户端内部关闭)。
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 ¶
WithClientOptions 透传配置底层 *http.Client 的逃生口:在内部默认 transport(otel 插装的 DefaultTransport 浅克隆)装配之后应用, 可整体替换 Transport 或覆盖其他字段。
func WithLogger ¶
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 ¶
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。