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
参数应该可以在哪个角落调整,此处存疑,来日方长!