Spring Cloud Eureka 多網卡配置

若是沒有針對多網卡作特別的配置的話,上面看到的192.168.239.1:8080和其連接的URL地址多半不是一個字符串;spring

咱們在配置Eureka Client的時候想要實現的效果是:上面顯示192.168.239.1:8080的地方,顯示IP地址和端口號,其URL地址的host和port與這裏顯示的IP地址和端口號一致。同時在多網卡的狀況下,咱們能夠任意選擇Spring Cloud App想要使用的網卡。docker

Spring Cloud 網卡選擇一文中,給出了一個多網卡配置的解決方案:app

spring.cloud.inetutils.preferred-networks: 192.168.239.
eureka.instance.prefer-ip-address:true

經過設置這兩個屬性,URL地址的host的值就是咱們想要的IP地址了。 
經過查看spring-cloud-netflix-eureka-server包下面的status.ftl文件,發現顯示的文本是instance的id。ide

<#list instanceInfo.instances as instance>
  <#if instance.isHref>
    <a href="${instance.url}" target="_blank">${instance.id}</a>
  <#else>
    ${instance.id}
  </#if><#if instance_has_next>,</#if>
</#list>

因此咱們只要給instance-id賦值爲ip:port就好了:oop

eureka.instance.instance-id:${spring.cloud.client.ipAddress}:${server.port}
1
spring.cloud.client.ipAddress這個是怎麼來的呢?看下HostInfoEnvironmentPostProcessor這個類,這個類是EnvironmentPostProcessor接口的實現:post

@Override www.1b23.com
    public void postProcessEnvironment(ConfigurableEnvironment environment,
            SpringApplication application) {
        InetUtils.HostInfo hostInfo = getFirstNonLoopbackHostInfo(environment);
        LinkedHashMap<String, Object> map = new LinkedHashMap<>();
        map.put("spring.cloud.client.hostname", hostInfo.getHostname());
        map.put("spring.cloud.client.ipAddress", hostInfo.getIpAddress());
        MapPropertySource propertySource = new MapPropertySource(
                "springCloudClientHostInfo", map);
        environment.getPropertySources().addLast(propertySource);
    }

這時候問題來了,若是這麼設置,會發現顯示的內容和其連接地址不同,經過調成程序發現,顯示的時候的host和port和鏈接地址裏的host和port雖然都是經過InetUtils獲取的,可是執行的時間點不同,執行的時候的上下文信息不同。this

首先HostInfoEnvironmentPostProcessor的執行時間點能夠參看Spring Boot # EnvironmentPostProcessor,雖然咱們配置了spring.cloud.inetutils.preferred-networks: 192.168.239.,可是此時這個application.xml文件的內容還沒被加載,HostInfoEnvironmentPostProcessor在執行的時候,上下文裏就沒有這個配置,因此在執行:url

InetUtils.HostInfo hostInfo = getFirstNonLoopbackHostInfo(environment);
1
時候,environment中沒有spring.cloud.inetutils.preferred-networks: 192.168.239.這個配置。.net

EurekaClientAutoConfiguration中的eurekaInstanceConfigBean方法會構造並返回一個EurekaInstanceConfigBean,EurekaInstanceConfigBean的構造方法以下:server

public EurekaInstanceConfigBean(InetUtils inetUtils) {
        this.inetUtils = inetUtils;
        this.hostInfo = this.inetUtils.findFirstNonLoopbackHostInfo();
        this.ipAddress = this.hostInfo.getIpAddress();
        this.hostname = this.hostInfo.getHostname();
    }

在這個時間點,application.yml中的配置已經加載,spring boot的配置文件在容器建立以前就全加載完了,具體參看Spring Boot # EnvironmentPostProcessor,spring.cloud.inetutils.preferred-networks: 192.168.239.的信息已經有了,因此此配置就會生效,從而選擇出可能跟以前不同的IP地址。

結論 eureka設置 eureka.instance.prefer-ip-address: true eureka.instance.instance-id: ${spring.cloud.client.ipAddress}:${server.port} spring.cloud.inetutils.preferred-networks設置 將spring.cloud.inetutils.preferred-networks的配置從application.yml文件移到外部,jar命令-Dspring.cloud.inetutils.preferred-networks: 192.168.239.覆蓋或者設置在系統的環境變量裏。用dockerfile或者docker compose就更方便了。

相關文章
相關標籤/搜索