dubbo provider在暴露服务时,会执行 DubboServiceMetadataRepository.exportURL ,在这里会调用 inetUtils.findFirstNonLoopbackHostInfo() ,本人开发环境下(win10+jdk8)执行这句代码需要3秒,每暴露一个服务都会调用一次,导致整个启动过程很久。
public void exportURL(URL url) {
URL actualURL = url;
InetUtils.HostInfo hostInfo = inetUtils.findFirstNonLoopbackHostInfo();
String ipAddress = hostInfo.getIpAddress();
// To use InetUtils to set IP if they are different
// issue :
// https://github.com/spring-cloud-incubator/spring-cloud-alibaba/issues/589
if (!Objects.equals(url.getHost(), ipAddress)) {
actualURL = url.setHost(ipAddress);
}
this.allExportedURLs.add(actualURL.getServiceKey(), actualURL);
}
这里的 inetUtils 是从Spring容器获取的,因此我们可以实现自己的Bean将其替代掉。
- 先创建个自己的 InetUtils:
public class MyInetUtils extends InetUtils {
private InetAddress inetAddress = null;
public MyInetUtils(final InetUtilsProperties properties){
super(properties);
}
@Override
public InetAddress findFirstNonLoopbackAddress() {
//就是这里,把address缓存起来,避免重复执行导致速度慢
if (inetAddress == null) {
inetAddress = super.findFirstNonLoopbackAddress();
}
return inetAddress;
}
}
- 替代Bean:
@Configuration
public class MyConf {
@Bean
@Primary
public InetUtils inetUtils(@Autowired InetUtilsProperties properties){
return new MyInetUtils(properties);
}
}
- 重新运行即可,会发现spring-cloud-commons自带的findFirstNonLoopbackAddress只会执行一次