MCPcopy Index your code
hub / github.com/cppla/moto / HandleRoundrobin

Function HandleRoundrobin

controller/roundrobin.go:17–57  ·  view source on GitHub ↗

HandleRoundrobin 顺序轮转目标,失败时回退到 boost 模式。

(conn net.Conn, rule *config.Rule)

Source from the content-addressed store, hash-verified

15
16// HandleRoundrobin 顺序轮转目标,失败时回退到 boost 模式。
17func HandleRoundrobin(conn net.Conn, rule *config.Rule) {
18 defer conn.Close()
19
20 index := atomic.AddUint64(&tcpCounter, 1) % uint64(len(rule.Targets))
21 if tcpCounter >= 100*uint64(len(rule.Targets)) {
22 atomic.StoreUint64(&tcpCounter, 1)
23 }
24
25 v := rule.Targets[index]
26
27 roundrobinBegin := time.Now()
28 target, err := outboundDial(v.Address)
29 if err != nil {
30 utils.Logger.Error("无法建立连接,切换到 boost 模式",
31 zap.String("ruleName", rule.Name),
32 zap.String("remoteAddr", conn.RemoteAddr().String()),
33 zap.String("targetAddr", v.Address),
34 zap.Int64("failedTime(ms)", time.Since(roundrobinBegin).Milliseconds()))
35 HandleBoost(conn, rule)
36 return
37 }
38 if tc, ok := target.(*net.TCPConn); ok {
39 _ = tc.SetNoDelay(true)
40 _ = tc.SetKeepAlive(true)
41 _ = tc.SetKeepAlivePeriod(30 * time.Second)
42 }
43 utils.Logger.Debug("建立连接",
44 zap.String("ruleName", rule.Name),
45 zap.String("remoteAddr", conn.RemoteAddr().String()),
46 zap.String("targetAddr", target.RemoteAddr().String()),
47 zap.Int64("roundrobinTime(ms)", time.Since(roundrobinBegin).Milliseconds()))
48
49 defer target.Close()
50
51 go func() {
52 io.Copy(conn, target)
53 conn.Close()
54 target.Close()
55 }()
56 io.Copy(target, conn)
57}

Callers 1

ListenFunction · 0.85

Calls 2

outboundDialFunction · 0.85
HandleBoostFunction · 0.85

Tested by

no test coverage detected