强迫症/性能控
在项目中使用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了。