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