spring cloud zookeeper 默认以 host name 注册到注册中心,如果服务机器之间的 host 域名解析没有打通的话,就会在调用端出现 unknown host exception 异常,这时需要用 ip 来注册服务。
ip 注册方法
spring cloud zookeeper 注册 ip 大致有 2 种方式,分别如下:
第一种在配置文件里,设置 prefer-ip-address
为 true
,具体如下:
spring:
cloud:
zookeeper:
discovery:
prefer-ip-address: true
另外一种在配置文件里,直接设置 instance-host
为 spring cloud 动态获取的本地 ip,如下:
spring:
cloud:
zookeeper:
discovery:
instance-host: ${spring.cloud.client.ip-address}
需要注意的是,spring cloud 2 里动态 ip 获取要用 ${spring.cloud.client.ip-address},而在 spirng cloud 1 里是 ${spring.cloud.client.ipAddress}。
注册相关源码
spring cloud 的 zookeeper 组件是 spring-cloud-zookeeper-discovery,注册配置属性主要看 ZookeeperDiscoveryProperties 类,相关源码如下:
...
public ZookeeperDiscoveryProperties(InetUtils inetUtils) {
// 这里面设置 host 相关信息
this.hostInfo = inetUtils.findFirstNonLoopbackHostInfo();
this.instanceHost = this.hostInfo.getHostname();
this.instanceIpAddress = this.hostInfo.getIpAddress();
}
...
public String getInstanceHost() {
// 如果设置优先 ip 注册,且存在 ip 地址时,用 ip
if (this.preferIpAddress && StringUtils.hasText(this.instanceIpAddress)) {
return this.instanceIpAddress;
}
// 否则,用 instanceHost 变量值
return this.instanceHost;
}
...