@Override
    public void initWithNiwsConfig(IClientConfig clientConfig, Factory factory) {
        try {
            super.initWithNiwsConfig(clientConfig, factory);
            String niwsServerListClassName = clientConfig.getOrDefault(CommonClientConfigKey.NIWSServerListClassName);

            ServerList<T> niwsServerListImpl = (ServerList<T>) factory.create(niwsServerListClassName, clientConfig);
            this.serverListImpl = niwsServerListImpl;

            if (niwsServerListImpl instanceof AbstractServerList) {
                AbstractServerListFilter<T> niwsFilter = ((AbstractServerList) niwsServerListImpl)
                        .getFilterImpl(clientConfig);
                niwsFilter.setLoadBalancerStats(getLoadBalancerStats());
                this.filter = niwsFilter;
            }

            String serverListUpdaterClassName = clientConfig.getOrDefault(
                    CommonClientConfigKey.ServerListUpdaterClassName);

            this.serverListUpdater = (ServerListUpdater) factory.create(serverListUpdaterClassName, clientConfig);

            restOfInit(clientConfig);
        } catch (Exception e) {
            throw new RuntimeException(
                    "Exception while initializing NIWSDiscoveryLoadBalancer:"
                            + clientConfig.getClientName()
                            + ", niwsClientConfig:" + clientConfig, e);
        }
    }
A LoadBalancer that has the capabilities to obtain the candidate list of
servers using a dynamic source. i.e. The list of servers can potentially be
changed at Runtime. It also contains facilities wherein the list of servers
can be passed through a Filter criteria to filter out servers that do not
meet the desired criteria.

@author stonse
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/DynamicServerListLoadBalancer.java