spring cloud config (Cannot determine local hostname)



a. 問題描述:Cannot determine local hostname

b. 產生原因:
        spring cloud中,通過InetUtils工具類和InetUtilsProperties配合使用來獲取ip地址、解析主機名的操作。
        在InetUtils中解析主機名超時,想着將 InetUtilsPropertiestimeoutSeconds設置更大,按理說,可以通過application.properties中配置以spring.cloud.inetutils為前綴屬性進行屬性注入,但在我實際操作過程,發現根本無效,HostInfoEnvironmentPostProcessor類中,並未使用配置文件的參數,而是直接創建了一個新的InetUtilsProperties對象,並從環境中獲取相應屬性進行綁定,致使所有配置失效!

c. 解決方法:

class MyHostInfoEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
    // 直接對着 HostInfoEnvironmentPostProcessor 類源碼ctrl+cv
    // 注意:將此處修改比原有HostInfoEnvironmentPostProcessor的order的數值更低,
    // 數值越低具有越高優先級,保證比源碼的HostInfoEnvironmentPostProcessor具有更高的優先級,
    // 這樣可以先一步往spring環境中添加屬性。
    private int order = ConfigFileApplicationListener.DEFAULT_ORDER - 2;
    public void postProcessEnvironment(ConfigurableEnvironment environment,
                                       SpringApplication application) {
        LinkedHashMap<String, Object> map = new LinkedHashMap<>();
        // 注意:此處需要修改,往spring環境中添加 InetUtilsProperties 相應前綴屬性
        map.put("spring.cloud.inetutils.timeout-seconds", 10);
        // 創建一個自定義的  CustomizedSystemEnvironment  屬性源並把它掛到spirng環境中。
        SystemEnvironmentPropertySource systemEnvironmentPropertySource = new SystemEnvironmentPropertySource("CustomizedSystemEnvironment", map);
        environment.getPropertySources().addLast(systemEnvironmentPropertySource);
        // 下面直接對着源碼 ctrl+cv,無需改動
        InetUtils.HostInfo hostInfo = getFirstNonLoopbackHostInfo(environment);
        map = new LinkedHashMap<>();
        map.put("spring.cloud.client.hostname", hostInfo.getHostname());
        map.put("spring.cloud.client.ip-address", hostInfo.getIpAddress());
        MapPropertySource propertySource = new MapPropertySource(
                "springCloudClientHostInfo", map);
        environment.getPropertySources().addLast(propertySource);
    }
    ...      
}

resouces類路徑下新建文件META-INF/spring.factories文件中寫入對應的自定義實現類即可

org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.config.MyHostInfoEnvironmentPostProcessor

d. 遺留問題:
        我使用consul作為注冊中心,consul好像默認的健康檢查超時是1s,這里就給我帶來了新的問題,就是我設置的解析主機名超時大於1sCannot determine local hostname日志是沒有了,但是,consul的健康檢查又不通過了,完全搞不懂,這是什么飛機!我覺得consul參數應該可以在哪個角落調整,此處存疑,來日方長!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM