我测试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的方式注册,个人测试环境是:服务器
修改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