-
Notifications
You must be signed in to change notification settings - Fork 0
/
conn_group.go
73 lines (62 loc) · 1.66 KB
/
conn_group.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright(C) 2021 github.com/fsgo All Rights Reserved.
// Author: fsgo
// Date: 2021/3/29
package fspool
import (
"context"
"io"
"net"
)
// GroupNewConnFunc 给 Group 创建新的 pool
type GroupNewConnFunc func(addr net.Addr) NewConnFunc
func (gn GroupNewConnFunc) trans() GroupNewElementFunc {
return func(key any) NewElementFunc {
return func(ctx context.Context, pool PoolPutter) (Element, error) {
conn, err := gn(key.(net.Addr))(ctx)
if err != nil {
return nil, err
}
return newPConn(conn, pool), nil
}
}
}
// NewConnPoolGroup 创建新的 ConnPool Group
func NewConnPoolGroup(opt *Option, gn GroupNewConnFunc) *ConnPoolGroup {
return &ConnPoolGroup{
raw: NewSimplePoolGroup(opt, gn.trans()),
}
}
// ConnPoolGroup 按照 key 分组的 连接池
//
// 如有一批 IP:
// 1. 192.168.0.1:80
// 2. 192.168.0.2:80
// 3. 192.168.0.3:81
//
// 每个IP 都有独立的连接池。
// 配置的 Option 是针对每个IP的。
// 如 MaxOpen=1,则允许每个 IP 都最多创建1个连接,上面共有3个 IP,则一一共最多创建3个连接。
type ConnPoolGroup struct {
raw *SimplePoolGroup
}
func (cg *ConnPoolGroup) Range(fn func(el net.Conn) error) error {
return cg.raw.Range(func(el io.Closer) error {
return fn(el.(net.Conn))
})
}
func (cg *ConnPoolGroup) Option() Option {
return cg.raw.Option()
}
func (cg *ConnPoolGroup) Get(ctx context.Context, addr net.Addr) (net.Conn, error) {
el, err := cg.raw.Get(ctx, addr)
if err != nil {
return nil, err
}
return el.(net.Conn), err
}
func (cg *ConnPoolGroup) GroupStats() GroupStats {
return cg.raw.GroupStats()
}
func (cg *ConnPoolGroup) Close() error {
return cg.raw.Close()
}