Spring 教程

Spring 笔记

spring cloud zookeeper 如何以 ip 形式注册服务

Spring 笔记 Spring 笔记


spring cloud zookeeper 默认以 host name 注册到注册中心,如果服务机器之间的 host 域名解析没有打通的话,就会在调用端出现 unknown host exception 异常,这时需要用 ip 来注册服务。

ip 注册方法

spring cloud zookeeper 注册 ip 大致有 2 种方式,分别如下:

第一种在配置文件里,设置 prefer-ip-addresstrue,具体如下:

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;
	}
    
    ...