spring cloud consul使用ip註冊服務

我測試spring cliud使用consul做爲註冊中心的時候,發現服務註冊的時候,註冊的都是hostname,好比:
註冊了一個commonservice,在consul中是這樣的:spring

{
   "ID":"commonservice123",
   "address":"testcommonserver"
   ........
}

這確定是不對的。
加入我有一個服務payservice須要調用commonservice,payservice從consul中獲取的commonservice的地址是testcommonserver,而payservice所在的服務器地址是121.57.68.98上,這臺服務器沒法解析hostname是testcommonserver的服務器的ip地址,沒法調用commonservie,這時候就會報下面這個錯誤:bootstrap

unKnownHostException
.......

爲了解決這個問題,我須要在註冊服務的時候,讓服務以ip的方式註冊,個人測試環境是:服務器

  • spring cloud Finch1ey.SR2
  • consul v1.4.3

修改bootstrap.yml配置文件:網絡

spring:
  cloud:
    consul:
      host: xxx.xxx.xxx.xxxx
      port: 8500
      discovery:
        prefer-ip-address: true //這個必須配
        tags: version=1.0
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}
        healthCheckInterval: 15s
        health-check-url: http://${spring.cloud.client.ip-address}:${server.port}/actuator/health

${spring.cloud.client.ip-address}這個屬性是spring cloud內置,用來獲取ip,不一樣的spring cloud版本可能稍有不一樣,若是想要肯定本身的版本是什麼樣的,能夠查看這個文件:
HostInfoEnvironmentPostProcessorapp

@Override
    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.ip-address", hostInfo.getIpAddress());
        MapPropertySource propertySource = new MapPropertySource(
                "springCloudClientHostInfo", map);
        environment.getPropertySources().addLast(propertySource);
    }

這時候再啓動項目測試,發現註冊地址變了:ide

{
   "ID":"commonservice123",
   "address":"10.52.xx.xx"
   ........
}

註冊的address變成了服務的內網地址,若是其它服務和commonservice在同一個網絡中,能夠經過內網訪問,這樣也是能夠的,可是若是內網不能訪問,其它服務仍然不能訪問,這時候就須要註冊服務的時候以公網的ip註冊才行。
修改bootstrap.yml配置文件:工具

spring:
  cloud:
    consul:
      host: xxx.xxx.xxx.xxx
      port: 8500
      config:
        data-key: data
        format: yaml
      discovery:
        prefer-ip-address: true //這個必須配
        tags: version=1.0
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}
        healthCheckInterval: 15s
        health-check-url: http://${spring.cloud.client.ip-address}:${server.port}/actuator/health
    inetutils:
      preferred-networks:
        - 公網ip1
        - 公網ip2

能夠看到增長一個inetutils配置,這個配置是spring cloud的網絡工具類,這個配置的含義是若是獲取ip時獲取到多個ip(內網、外網),就優先選擇我配置的ip中存在的ip,這樣再測試就會發現,註冊service的時候就變成了公網ip。oop

相關文章
相關標籤/搜索