- [x] I have searched the [issues](https://github.com/apache/incubator-dubbo/issues) of this repository and believe that this is not a duplicate.
- [x] I have checked the [FAQ](https://github.com/apache/incubator-dubbo/blob/master/FAQ.md) of this repository and believe that this is not a duplicate.

### Environment

* Dubbo version: 2.7.0
* Operating System version: macOS Sierra 10.12
* Java version: 1.8.0_111

### Steps to reproduce this issue

1. start provider and specific async as true, <dubbo:service interface="" async="true">
2. start consumer without async specific.
3. send a request

Pls. provide [GitHub address] to reproduce this issue.

### Expected Result

What do you expected from the above steps？
We are able to get the value from the CompletableFuture. 
    service.sayHello(input);
    CompletableFuture<String> future = RpcContext.getContext().getCompletableFuture();
    future.whenComplete((retValue, error) -> {
      System.out.println(retValue);
    });

### Actual Result

What actually happens?
It throws NPE exception as following, as we are not able to get the future.
Exception in thread "main" java.lang.NullPointerException

With investigation, it's an issue in RegistryDirectory.
Also, we are able to get async=true from providerUrl, but the querymap's async is false from consumer side. It changed the async from true to false, and caused the issue.

private URL mergeUrl(URL providerUrl) {
        providerUrl = ClusterUtils.mergeUrl(providerUrl, queryMap);
}

If there is an exception, please attach the exception trace:

```
Just put your stack trace here!
```

reserveRemoteValue(METHODS_KEY, map, remoteMap);
            reserveRemoteValue(TIMESTAMP_KEY, map, remoteMap);
            reserveRemoteValue(TAG_KEY, map, remoteMap);
            
            
            map.put(REMOTE_APPLICATION_KEY, remoteMap.get(APPLICATION_KEY));
            
            String remoteFilter = remoteMap.get(REFERENCE_FILTER_KEY);
            String localFilter = localMap.get(REFERENCE_FILTER_KEY);
            if (remoteFilter != null && remoteFilter.length() > 0
                    && localFilter != null && localFilter.length() > 0) {
                localMap.put(REFERENCE_FILTER_KEY, remoteFilter + "," + localFilter);
            }
            String remoteListener = remoteMap.get(INVOKER_LISTENER_KEY);
            String localListener = localMap.get(INVOKER_LISTENER_KEY);
            if (remoteListener != null && remoteListener.length() > 0
                    && localListener != null && localListener.length() > 0) {
                localMap.put(INVOKER_LISTENER_KEY, remoteListener + "," + localListener);
            }
        }
        return remoteUrl.clearParameters().addParameters(map);
    }
    private static void reserveRemoteValue(String key, Map<String, String> map, Map<String, String> remoteMap) {
        String remoteValue = remoteMap.get(key);
        if (StringUtils.isNotEmpty(remoteValue)) {
            map.put(key, remoteValue);
        }
    }
}