protected  Pair<String, Integer> deriveHostAndPortFromVipAddress(String vipAddress) 
            throws URISyntaxException, ClientException {
        Pair<String, Integer> hostAndPort = new Pair<String, Integer>(null, -1);
        URI uri = new URI(vipAddress);
        String scheme = uri.getScheme();
        if (scheme == null) {
            uri = new URI("http://" + vipAddress);
        }
        String host = uri.getHost();
        if (host == null) {
            throw new ClientException("Unable to derive host/port from vip address " + vipAddress);
        }
        int port = uri.getPort();
        if (port < 0) {
            port = getDefaultPortFromScheme(scheme);
        }
        if (port < 0) {
            throw new ClientException("Unable to derive host/port from vip address " + vipAddress);
        }
        hostAndPort.setFirst(host);
        hostAndPort.setSecond(port);
        return hostAndPort;
    }
Derive the host and port from virtual address if virtual address is indeed contains the actual host 
and port of the server. This is the final resort to compute the final URI in {@link #getServerFromLoadBalancer(java.net.URI, Object)}
if there is no load balancer available and the request URI is incomplete. Sub classes can override this method
to be more accurate or throws ClientException if it does not want to support virtual address to be the
same as physical server address.
<p>
 The virtual address is used by certain load balancers to filter the servers of the same function 
 to form the server pool.
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerContext.java