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只会执行一次
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)