@@ -19,6 +19,11 @@ import (
1919 "go.uber.org/zap"
2020)
2121
22+ type BackendNetwork interface {
23+ HTTPClient (clusterName string ) * http.Client
24+ DialContext (ctx context.Context , network , addr , clusterName string ) (net.Conn , error )
25+ }
26+
2227// HealthCheck is used to check the backends of one backend. One can pass a customized health check function to the observer.
2328type HealthCheck interface {
2429 Check (ctx context.Context , backendID string , info * BackendInfo , lastHealth * BackendHealth ) * BackendHealth
@@ -48,20 +53,44 @@ type security struct {
4853type DefaultHealthCheck struct {
4954 cfg * config.HealthCheck
5055 logger * zap.Logger
51- httpCli * http. Client
56+ network BackendNetwork
5257}
5358
5459func NewDefaultHealthCheck (httpCli * http.Client , cfg * config.HealthCheck , logger * zap.Logger ) * DefaultHealthCheck {
55- if httpCli == nil {
56- httpCli = http .NewHTTPClient (func () * tls.Config { return nil })
60+ return NewDefaultHealthCheckWithNetwork (newDefaultBackendNetwork (httpCli ), cfg , logger )
61+ }
62+
63+ func NewDefaultHealthCheckWithNetwork (network BackendNetwork , cfg * config.HealthCheck , logger * zap.Logger ) * DefaultHealthCheck {
64+ if network == nil {
65+ network = newDefaultBackendNetwork (nil )
5766 }
5867 return & DefaultHealthCheck {
59- httpCli : httpCli ,
68+ network : network ,
6069 cfg : cfg ,
6170 logger : logger ,
6271 }
6372}
6473
74+ type defaultBackendNetwork struct {
75+ httpCli * http.Client
76+ }
77+
78+ func newDefaultBackendNetwork (httpCli * http.Client ) * defaultBackendNetwork {
79+ if httpCli == nil {
80+ httpCli = http .NewHTTPClient (func () * tls.Config { return nil })
81+ }
82+ return & defaultBackendNetwork {httpCli : httpCli }
83+ }
84+
85+ func (n * defaultBackendNetwork ) HTTPClient (string ) * http.Client {
86+ return n .httpCli
87+ }
88+
89+ func (n * defaultBackendNetwork ) DialContext (ctx context.Context , network , addr , _ string ) (net.Conn , error ) {
90+ var dialer net.Dialer
91+ return dialer .DialContext (ctx , network , addr )
92+ }
93+
6594func (dhc * DefaultHealthCheck ) Check (ctx context.Context , _ string , info * BackendInfo , lastBh * BackendHealth ) * BackendHealth {
6695 bh := & BackendHealth {
6796 BackendInfo : * info ,
@@ -96,10 +125,13 @@ func (dhc *DefaultHealthCheck) checkSqlPort(ctx context.Context, info *BackendIn
96125 return
97126 }
98127 addr := info .Addr
128+ clusterName := info .ClusterName
99129 b := backoff .WithContext (backoff .WithMaxRetries (backoff .NewConstantBackOff (dhc .cfg .RetryInterval ), uint64 (dhc .cfg .MaxRetries )), ctx )
100130 err := http .ConnectWithRetry (func () error {
101131 startTime := time .Now ()
102- conn , err := net .DialTimeout ("tcp" , addr , dhc .cfg .DialTimeout )
132+ dialCtx , cancel := context .WithTimeout (ctx , dhc .cfg .DialTimeout )
133+ conn , err := dhc .network .DialContext (dialCtx , "tcp" , addr , clusterName )
134+ cancel ()
103135 setPingBackendMetrics (addr , startTime )
104136 if err != nil {
105137 return err
@@ -134,7 +166,8 @@ func (dhc *DefaultHealthCheck) checkStatusPort(ctx context.Context, info *Backen
134166
135167 addr := net .JoinHostPort (info .IP , strconv .Itoa (int (info .StatusPort )))
136168 b := backoff .WithContext (backoff .WithMaxRetries (backoff .NewConstantBackOff (dhc .cfg .RetryInterval ), uint64 (dhc .cfg .MaxRetries )), ctx )
137- resp , err := dhc .httpCli .Get (addr , statusPathSuffix , b , dhc .cfg .DialTimeout )
169+ clusterName := info .ClusterName
170+ resp , err := dhc .network .HTTPClient (clusterName ).Get (addr , statusPathSuffix , b , dhc .cfg .DialTimeout )
138171 if err == nil {
139172 var respBody backendHttpStatusRespBody
140173 err = json .Unmarshal (resp , & respBody )
@@ -176,7 +209,8 @@ func (dhc *DefaultHealthCheck) queryConfig(ctx context.Context, info *BackendInf
176209
177210 b := backoff .WithContext (backoff .WithMaxRetries (backoff .NewConstantBackOff (dhc .cfg .RetryInterval ), uint64 (dhc .cfg .MaxRetries )), ctx )
178211 var resp []byte
179- if resp , err = dhc .httpCli .Get (addr , configPathSuffix , b , dhc .cfg .DialTimeout ); err != nil {
212+ clusterName := info .ClusterName
213+ if resp , err = dhc .network .HTTPClient (clusterName ).Get (addr , configPathSuffix , b , dhc .cfg .DialTimeout ); err != nil {
180214 return
181215 }
182216 var respBody backendHttpConfigRespBody
0 commit comments