a. 問題描述:Cannot determine local hostname
b. 產生原因:
spring cloud
中,通過InetUtils
工具類和InetUtilsProperties
配合使用來獲取ip地址、解析主機名的操作。
在InetUtils
中解析主機名超時,想着將 InetUtilsProperties
的 timeoutSeconds
設置更大,按理說,可以通過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
,這里就給我帶來了新的問題,就是我設置的解析主機名超時大於1s
,Cannot determine local hostname
日志是沒有了,但是,consul
的健康檢查又不通過了,完全搞不懂,這是什么飛機!我覺得consul
參數應該可以在哪個角落調整,此處存疑,來日方長!