spring cloud consul使用ip注册服务

测试spring cliud使用consul作为注册中心的时候,发现服务注册的时候,注册的都是hostname,比如:

注册了一个commonservice,在consul中是这样的:

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

这肯定是不对的。

加入我有一个服务payservice需要调用commonservice,payservice从consul中获取的commonservice的地址是testcommonserver,而payservice所在的服务器地址是121.57.68.98上,这台服务器无法解析hostname是testcommonserver的服务器的ip地址,无法调用commonservie,这时候就会报下面这个错误:

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版本可能稍有不同,如果想要确定自己的版本是什么样的,可以查看这个文件:

HostInfoEnvironmentPostProcessor

@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);
    }

这时候再启动项目测试,发现注册地址变了:

{
   "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。

原文 

https://segmentfault.com/a/1190000018515396

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » spring cloud consul使用ip注册服务

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址