* Dubbo version: 2.7.8

先说结论吧，目前的实现问题非常大，对于一个默认配置的consumer，只要运行一段时间，consumer应用就会有n个线程数为200的FixedThreadPool，n是应用依赖的所有provider的不同端口的数量Set(provider.getPort()).size()，并且每一个provider下线都会导致关闭和重建一个FixedThreadPool。

详细解释一下，我们假设consumer端所有配置为默认，那么会有以下问题：

1. 对不同的provider，consumer会通过一个map共用线程池，其中key是provider的端口。所以如果provider有多个端口，还是会使用多个线程池，当然仅仅是这个问题的话影响还不算大。
但是考虑有100个provider，他们的端口全部相同，那么每个provider下线的时候，AbstractClient.close()方法会被调用，线程池会被关闭... 而dubbo有默认端口，在实际场景下大部分provider端口都一致，其中只要有一个下线，整个线程池就会关闭。
所以在实际场景中，consumer使用的线程池一直在不断的关闭，不断的新建...

2. 前面这个问题已经很大了，但这没有结束，它还会导致另外一个大问题... 
AbstractClient.initExecutor()方法会设置线程池的名字和类型，默认名字为DubboClientHandler，类型为cache，看起来都是CachedThreadPool。但实际上initExecutor方法调用在wrapChannelHandler方法之后，Dispatcher.dispatch()方法的url参数并没有设置为cache，所以对于同一个端口，最开始会是一个名字为DubboClientHandler的CachedThreadPool，但是因为上一个问题的存在，一台provider下线就会导致这个线程池被关闭。
然后consumer继续调用provider，这时候会调用WrappedChannelHandler.getExecutorService()方法，因为原线程池被关闭，会直接新建一个线程池，但是因为WrappedChannelHandler里的url没有被设置过，重建的线程池会是一个名叫Dubbo的200个线程的FixedThreadPool... 并且这个FixedThreadPool还在一直随着provider下线被关闭和重建...

所以最终结果就是一堆200个线程的FixedThreadPool在不断关闭与重建......
metadataReportConfig.setTimeout(registryConfig.getTimeout());
        return metadataReportConfig;
    }
    private String getRegistryCompatibleAddress(RegistryConfig registryConfig) {
        String registryAddress = registryConfig.getAddress();
        String[] addresses = REGISTRY_SPLIT_PATTERN.split(registryAddress);
        if (ArrayUtils.isEmpty(addresses)) {
            throw new IllegalStateException("Invalid registry address found.");
        }
        String address = addresses[0];
        
        
        StringBuilder metadataAddressBuilder = new StringBuilder();
        URL url = URL.valueOf(address);
        String protocolFromAddress = url.getProtocol();
        if (isEmpty(protocolFromAddress)) {
            
            
            String protocolFromConfig = registryConfig.getProtocol();
            metadataAddressBuilder.append(protocolFromConfig).append("://");
        }
        metadataAddressBuilder.append(address);
        return metadataAddressBuilder.toString();
    }
    private void loadRemoteConfigs() {
        
        List<RegistryConfig> tmpRegistries = new ArrayList<>();
        Set<String> registryIds = configManager.getRegistryIds();
        registryIds.forEach(id -> {
            if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) {