Skip to content
Snippets Groups Projects
Commit 27e155ab authored by Ian Luo's avatar Ian Luo
Browse files

enhance client's connectivity

parent 5872676e
No related branches found
No related tags found
No related merge requests found
......@@ -48,6 +48,10 @@ type DefaultHealthChecker struct {
// IsHealthy evaluates the healthy state on the given Invoker based on the number of successive bad request
// and the current active request
func (c *DefaultHealthChecker) IsHealthy(invoker protocol.Invoker) bool {
if !invoker.IsAvailable() {
return false
}
urlStatus := protocol.GetURLStatus(invoker.GetUrl())
if c.isCircuitBreakerTripped(urlStatus) || urlStatus.GetActive() > c.GetOutStandingRequestCountLimit() {
logger.Debugf("Invoker [%s] is currently in circuitbreaker tripped state", invoker.GetUrl().Key())
......
......@@ -161,6 +161,10 @@ func (di *DubboInvoker) getTimeout(invocation *invocation_impl.RPCInvocation) ti
return di.timeout
}
func (di *DubboInvoker) IsAvailable() bool {
return di.client.IsAvailable()
}
// Destroy destroy dubbo client invoker.
func (di *DubboInvoker) Destroy() {
di.quitOnce.Do(func() {
......
......@@ -47,6 +47,8 @@ type Client interface {
Close()
// send request to server.
Request(request *Request, timeout time.Duration, response *PendingResponse) error
// check if the client is still available
IsAvailable() bool
}
// This is abstraction level. it is like facade.
......@@ -182,6 +184,11 @@ func (client *ExchangeClient) Close() {
client.client.Close()
}
// IsAvailable to check if the underlying network client is available yet.
func (client *ExchangeClient) IsAvailable() bool {
return client.client.IsAvailable()
}
// handle the response from server
func (client *ExchangeClient) Handler(response *Response) {
......
......@@ -204,6 +204,14 @@ func (c *Client) Request(request *remoting.Request, timeout time.Duration, respo
return perrors.WithStack(err)
}
func (c *Client) IsAvailable() bool {
client, err := c.pool.get()
if client == nil || !client.isAvailable() || err != nil {
return false
}
return true
}
func (c *Client) selectSession(addr string) (*gettyRPCClient, getty.Session, error) {
rpcClient, err := c.pool.getGettyRpcClient(addr)
if err != nil {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment