2018-05-27 开发环境下加快项目启动速度-点评CAT使用经验

强迫症/性能控

在项目中使用CAT和Apollo后大约半年的时间内,开发项目的时候,在本机启动Spring-cloud项目,发现每次都卡20秒,忍了半年,把CAT相关的配置文件都注释掉,还是能启动。

最简单方法

禁用虚拟机网卡,VMNet1 和VMNet8。CAT启动飞快。但这方案太没有挑战性了。

第一次尝试优化

经过研究发现,是因为CAT的 Inets类 调用 getHostName和getHostAddress
这两个JDK的方法,会发生反向DNS解析,当你有多块网卡的时候,尤其是装有VMware的时候,他会非常慢。

参考SpringCloud中的 InetUtils 的写法,可以将CAT-Client的 client.xml model增加一个属性,ignoreInterfaces,仿照Spring写一个,可以配置正则表达式,排除网卡列表。

当优化完成之后,启动速度提升了10秒


额外发现

这过程中学习到了SpringCloud中的Eureka怎么把自己的IP 注册给注册中心的。
还有另外收获:
SpringCloud -Brixton版本 的INetUtils有bug,不能忽略网卡,第一次就没有注入正确的配置。
换成Camden.SR7,观察INetUtils的源码发现,他们已经修复了这个注入配置的问题,第一次就能注入正确的网卡忽略配置:

spring:
  cloud:
    inetutils:
      ignoredInterfaces: ['VMware.*']
      preferredNetworks: ['172.16']
      use-only-site-local-interfaces: true

但是依旧不完美,第一次发给注册中心的HOST IP还是错的。
具体可以看下一篇文章给出的修复方案。

第二次优化

不知道自己是不是走错的方向,
现在找到一个更简单的方法:
在Cat的checkAndInitialize 方法打个断点,结果发现时携程的Apollo调用的。

一看就明白了:
这里加上一段:

System.getProperty("disableCat") == null

携程的Apollo的启动CAT方式可以算是非常厉害的写法,值得学习,利用反射,避免依赖过多的jar。

public class DefaultMessageProducerManager implements MessageProducerManager {
  private static MessageProducer producer;

  public DefaultMessageProducerManager() {
    if (ClassLoaderUtil.isClassPresent(CatNames.CAT_CLASS) && System.getProperty("disableCat") == null) {
      producer = new CatMessageProducer();
    } else {
      producer = new NullMessageProducerManager().getProducer();
    }
  }

  @Override
  public MessageProducer getProducer() {
    return producer;
  }
}

这样在启动项目的时候,VM arguments 加上-DdisableCat
CAT就不会启动了。
除非有地方显式调用Cat的相关方法。

优化完毕之后,发现那启动速度10秒完事,再也不用等那20s了

你可能感兴趣的:(2018-05-27 开发环境下加快项目启动速度-点评CAT使用经验)