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

loadbalance

package
v0.8.8 Latest Latest
Warning

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

Go to latest
Published: Nov 2, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package loadbalance 提供与具体服务发现实现解耦的节点选择抽象(Selector, 参照 go-kratos selector)。

v0.4.0 起 Selector 全面替代 v0.3.x 的 Balancer:

  • Node 携带完整实例信息(地址/权重/服务名/Metadata);
  • Select 支持 WithFilter 按 Metadata 过滤候选、WithKey 一致性选点键;
  • 调用结束经 DoneFunc 回写结果(DoneInfo),配合 WithDoneHook 采集, 为 P2C/EWMA 等自适应算法预留数据入口。

支持的策略(NewSelector 按名创建,别名自动归一):

  • roundrobin(轮询)
  • random(随机)
  • weighted(加权随机)

本包不 import 任何实例类型或框架——registry.Instance 等由调用方经 NodesFrom 泛型适配器(字段闭包映射)构造 Node。nns-endpoint 等上层包 与 httpx 根包复用本实现。

Package loadbalance 提供节点选择抽象(Selector,参照 go-kratos selector)。

相比 v0.3.x 的 Balancer(仅地址+权重的索引选择),Selector 携带完整节点 元数据(Version 经 Metadata)、支持按 Metadata 过滤候选、并在调用结束后 经 DoneFunc 回写结果(P2C/EWMA 等自适应算法的数据入口)。

与具体注册中心解耦:Node 经 NodesFrom 泛型适配器从任意实例类型构造, 本包不 import 任何 provider 或框架。

Index

Constants

View Source
const (
	StrategyRoundRobin = "roundrobin"
	StrategyRandom     = "random"
	StrategyWeighted   = "weighted"
	// StrategyP2C 是自适应选择策略(Power of Two Choices,#6):
	// 依据 DoneFunc 回写的调用时长 EWMA,把流量从慢/故障节点撬走。
	StrategyP2C = "p2c"
)

负载均衡策略名称常量(与 nns/metadata 中配置字符串保持一致)。

Variables

View Source
var ErrNoAvailable = errors.New("loadbalance: no available node")

ErrNoAvailable 表示无可选节点(候选为空或全部被过滤)。

Functions

func FilterOf added in v0.4.0

func FilterOf(opts []SelectOption) func(Node) bool

FilterOf 提取过滤函数(未设置返回 nil)。

func Key added in v0.4.0

func Key(opts []SelectOption) string

Key 提取 SelectOption 列表中的选点键(未设置返回空串)。 供自定义 Selector 实现(如一致性哈希)读取。

func NormalizeSelectorName added in v0.4.0

func NormalizeSelectorName(name string) string

NormalizeSelectorName 将历史别名归一为规范策略名:

"round_robin"          → "roundrobin"
"weighted_round_robin" → "weighted"
其他名称原样返回

Types

type DoneFunc added in v0.4.0

type DoneFunc func(ctx context.Context, di DoneInfo)

DoneFunc 在本次调用的最终结果确定后回调(含重试、熔断等出口包装); 未回写等价于 DoneInfo 零值。

type DoneInfo added in v0.4.0

type DoneInfo struct {
	// Err 是本次调用的最终错误(nil = 成功)。
	Err error
	// BytesSent/BytesReceived 标记是否发生了发送/接收(保留字段)。
	BytesSent     bool
	BytesReceived bool
}

DoneInfo 是调用结束时的回写信息。

type Node added in v0.4.0

type Node interface {
	// Address 是节点地址(host:port 或 scheme://host:port)。
	Address() string
	// Weight 是调度权重(<=0 视为 1)。
	Weight() float64
	// ServiceName 是节点所属服务名。
	ServiceName() string
	// Metadata 是节点元数据(版本、区域、集群等)。
	Metadata() map[string]string
}

Node 是参与选择的节点,携带完整实例信息。

func Filtered added in v0.4.0

func Filtered(nodes []Node, opts []SelectOption) []Node

Filtered 返回经选项过滤后的候选节点。

func NodesFrom added in v0.4.0

func NodesFrom[T any](items []T, addr func(T) string, weight func(T) float64,
	meta func(T) map[string]string, svc func(T) string) []Node

NodesFrom 从任意实例类型切片构造 Node 切片(字段经闭包映射)。 任一闭包为 nil 时使用对应零值。本包不 import 任何实例类型—— registry.Instance 等由调用方(如 httpx)传闭包适配。

type SelectOption added in v0.4.0

type SelectOption func(*selectOptions)

SelectOption 配置单次 Select。

func WithFilter added in v0.4.0

func WithFilter(fn func(Node) bool) SelectOption

WithFilter 过滤候选节点(如同 Group/Cluster 优先);全部被过滤时返回 ErrNoAvailable。

func WithKey added in v0.4.0

func WithKey(key string) SelectOption

WithKey 提供一致性选点键(一致性哈希类 Selector 使用;roundrobin 等忽略)。

type Selector added in v0.4.0

type Selector interface {
	// Select 从候选节点中选择一个。候选为空或全被过滤返回 ErrNoAvailable;
	// 成功时 selected 与 done 均非 nil。
	Select(ctx context.Context, nodes []Node, opts ...SelectOption) (selected Node, done DoneFunc, err error)
}

Selector 是可回写调用结果的节点选择器。

func NewSelector added in v0.4.0

func NewSelector(name string, opts ...SelectorOption) (Selector, error)

NewSelector 按策略名创建 Selector。接受规范名或别名(自动归一); 空名称回退为 roundrobin;未知名称报错。

type SelectorOption added in v0.4.0

type SelectorOption func(*selectorConfig)

SelectorOption 配置 Selector 实例级行为。

func WithDoneHook added in v0.4.0

func WithDoneHook(fn func(ctx context.Context, n Node, di DoneInfo)) SelectorOption

WithDoneHook 订阅每次调用的结果回写(采集入口;本期只采集不参与决策, 为 P2C/EWMA 预留)。

Jump to

Keyboard shortcuts

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