背景:
剛入職新公司,某天IDEA啓動項目的時候,特別慢,某個服務居然要2分鐘,這太影響工作效率了,就找了很多解決辦法,比如
這篇文章也不能解決
修改IDEA VM options也不管用,就這樣忍了幾天,直到今天,我才靈光乍現,項目中用了Apollo配置中心,
這玩意兒之前好像也遇到過啓動慢的問題,我看了我本地c盤的server.properties文件是寫的LOCAL
我馬上把項目中的Apollo配置關閉,瞬間啓動飛起!!!!
跟蹤源碼:
同事跟我說他們啓動都用的本地配置,既server.properties文件是寫的LOCAL.
啓動的時候Apollo如果使用本地配置,會打印:
==== Apollo is in local mode! Won't pull configs from remote server for namespace
然後我就跟着找到Apollo的源碼在DefaultConfigFactory類中
我就發現我的項目啓動這個isInLocalMode()就總是返回false,
跟着點進去發現了有段代碼,其中s_manager爲volatile修飾
private static volatile ProviderManager s_manager;
很明顯是個雙重檢測的單例模式..
其中一行代碼
ServiceBootstrap.loadFirst(ProviderManager.class);
點進去能看到是用ServiceLoader來加載ProviderManager;
ServiceLoader在調用ServiceLoader.load的時候,會根據傳入的接口類,遍歷META-INF/services
目錄下的以該類命名的文件中的所有類,並實例化返回
下面的截圖可以看到Apollo源碼包下確實有ProviderManager
然後繼續看ProviderManager的實現類DefaultProviderManager,
DefaultProviderManager初始化的時候會去調用Provider接口的initialize()方法
繼續點進去看到,如果用本地配置的話,回去c盤這個目錄找server.properties文件:
等等!!
跟我電腦的目錄怎麼不太一樣呢?
修改文件夾的名稱後,啓動從2分鐘變爲12秒
瞬間明白了....
除非之前用這臺電腦的離職的兄弟就這麼忍受了一年??
要麼就是這個文件夾的名字是故意改過的,這個問題太難排查了...
我要是不發現,那豈不是以後的工作時間都要浪費在IDEA啓動上面?
真是一萬匹草泥馬