loadbalancer

package
v2.0.2 Latest Latest
Warning

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

Go to latest
Published: Sep 4, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package loadbalancer 提供 mgin v2 的客户端负载均衡能力。

v2 引入:在 client.CallCtx 内部用 registry.Registry.GetServices 拉取多实例后, 通过 LoadBalancer.Pick 选一个具体实例发起调用。框架默认使用 RoundRobin, 业务可通过 loadbalancer.SetDefault 切换到其它策略。

设计目标:

  • 零第三方依赖(与 v2 主体一致)
  • 线程安全:多 goroutine 并发 Pick 不会脏写
  • 一致性哈希的 key 用于把同一请求的多个调用路由到同一实例(如 session/缓存)

Index

Constants

This section is empty.

Variables

View Source
var ConsistentHashLB = &ConsistentHash{replicas: 160}

ConsistentHashLB 默认注册实例,160 副本(vnode),业界常用值。

View Source
var ErrEmptyInstances = errors.New("loadbalancer: 实例列表为空")

ErrEmptyInstances 在 Pick 收到空实例列表时返回,调用方应转 fallback。

View Source
var LeastConnectionsLB = &LeastConnections{}

LeastConnectionsLB 默认注册实例。

View Source
var RandomLB = &Random{}

RandomLB 默认注册实例。

View Source
var RoundRobinLB = &RoundRobin{}

RoundRobinLB 是默认注册实例,init 时由 Register 注册。

Functions

func Register

func Register(name string, lb LoadBalancer)

Register 把一个策略注册到全局表。重复注册会覆盖。 一般由各策略实现文件在 init() 中调用。

func SetDefault

func SetDefault(lb LoadBalancer)

SetDefault 设置全局默认策略。传入 nil 等同于 RoundRobin。

Types

type ConsistentHash

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

ConsistentHash 一致性哈希策略。线程安全。 key 相同的请求会路由到同一实例,适合"同一 session 走同一服务"的场景。

func (*ConsistentHash) Pick

func (c *ConsistentHash) Pick(instances []string, key string) (string, error)

Pick 对 key 做 FNV-1a 哈希后取模选实例。 若 key 为空字符串则退化为 RoundRobin 行为。

type LeastConnections

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

LeastConnections 最少连接策略。线程安全。 用 sync.Map 跟踪每个实例当前的活跃请求数。

func (*LeastConnections) Inc

func (l *LeastConnections) Inc(instance string) (func(), bool)

Inc 业务侧在请求开始时调用以让 LB 跟踪活跃连接数;返回的"减"函数应在请求结束时调用。

与 Pick 共享同一个 sync.Map;Inc 第一次调用会 LoadOrStore 创建条目(值 0), 随后 Add(1) 增加。典型用法:

dec, _ := lb.Inc(best)
defer dec()

func (*LeastConnections) Pick

func (l *LeastConnections) Pick(instances []string, _ string) (string, error)

Pick 选活跃连接最少的实例(并发安全)。 注意:v2.1 当前实现只读 conns(不调用 Inc),只用作"最少连接选实例"的快照判断; 真实的活跃连接跟踪由业务侧在请求开始/结束时显式调用 Inc 完成(返回的 dec 函数)。

type LoadBalancer

type LoadBalancer interface {
	Pick(instances []string, key string) (string, error)
}

LoadBalancer 是所有负载均衡策略的统一接口。

参数:

  • instances:可用实例 URL 列表(来自 registry.GetServices)
  • key:路由键(用于一致性哈希),空字符串时退化为非一致性策略

返回:被选中的实例 URL;调用方负责发起调用。

func Default

func Default() LoadBalancer

Default 取全局默认策略;若未设置则返回 RoundRobinLB。

func Get

func Get(name string) LoadBalancer

Get 按名称取策略;未找到返回 nil。

type Random

type Random struct{}

Random 随机策略。线程安全。

func (*Random) Pick

func (r *Random) Pick(instances []string, _ string) (string, error)

Pick 随机选一个实例。

type RoundRobin

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

RoundRobin 轮询策略。线程安全。

func (*RoundRobin) Pick

func (r *RoundRobin) Pick(instances []string, _ string) (string, error)

Pick 按内部计数器选一个实例。

Jump to

Keyboard shortcuts

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