集群注册
方式一:通过hostname注册,适用于多机或单机搭建
-
标识每个启动节点的hostname, 通过
eureka.instance.hostname
设置 -
配置
eureka.client.register-with-eureka
保持默认值true
,eureka.client.fetch-registry
保持默认值true
-
配置
eureka.instance.prefer-ip-address
保持默认值false
-
保持统一
eureka.instance.appname
配置示例
spring:
application:
name: cloud-eureka
eureka:
client:
transport:
applicationsResolverUseIp: true
serviceUrl:
defaultZone: http://192.168.31.223:10001/eureka/,http://192.168.31.223:10002/eureka/,http://192.168.31.223:10003/eureka/
instance:
appname: cloud-eureka
---
spring:
profiles: eureka-1
eureka:
instance:
hostname: eureka-1
server:
port: 10001
---
spring:
profiles: eureka-2
eureka:
instance:
hostname: eureka-2
server:
port: 10002
---
spring:
profiles: eureka-3
eureka:
instance:
hostname: eureka-3
server:
port: 10003
方式二:通过ip注册,适用于多节点,每个节点部署一个服务
- 配置
eureka.client.transport.applicationsResolverUseIp
为true
- 各节点配置
eureka.client.serviceUrl.defaultZone
配置使用ip方式,若存在多网卡,需在eureka.instance.ip-address
中指定一个,写到deufaltZone
中使用 - 配置
eureka.client.register-with-eureka
保持默认值true
,eureka.client.fetch-registry
保持默认值true
- 配置
eureka.instance.prefer-ip-address
保持默认值false
- 保持统一
eureka.instance.appname
原理
在搭建集群启动后,可在http://eureka-1:10001/ 中查看到对应的总副本、可用副本、不可用副本,这个页面对应请求的控制层为org.springframework.cloud.netflix.eureka.server.EurekaController#status
通过追踪源码,可用看到这个页面显示的内容主要通过com.netflix.eureka.util.StatusUtil#getStatusInfo
来赋值
public StatusInfo getStatusInfo() {
......
for (PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
if (replicaHostNames.length() > 0) {
replicaHostNames.append(", ");
}
replicaHostNames.append(node.getServiceUrl());
// 判断是否是可用节点的依据是,分两种情况,
// 一种是eureka.client.transport.applicationsResolverUseIp为false的情况,这是根据hostname判断,即节点注册实例的hostname, 必须与对应节点中配置在defaultZone(使用hostname配置)中的hostname一致
// 另一种情况是eureka.client.transport.applicationsResolverUseIp为true的情况,这时根据ipAddr判断,即节点注册的ipAddr,必须与对应节点中配置的defaultZone(使用ip配置)中的ip一致
if (isReplicaAvailable(node.getServiceUrl())) {
upReplicas.append(node.getServiceUrl()).append(',');
upReplicasCount++;
} else {
downReplicas.append(node.getServiceUrl()).append(',');
}
}
builder.add("registered-replicas", replicaHostNames.toString());
builder.add("available-replicas", upReplicas.toString());
builder.add("unavailable-replicas", downReplicas.toString());
......
}
这里的peerEurekaNodes.getPeerEurekaNodes()
存储副本的节点,从defaultZone
中获取;比如当前节点有node1/node2/node3,这三个节点,当前node1启动后,node1中的peerEurekaNodes.getPeerEurekaNodes()
对应的内容就是node2和node3。
关于peerEurekaNodes.getPeerEurekaNodes()
的获取,通过com.netflix.eureka.cluster.PeerEurekaNodes#resolvePeerUrls
设置相关节点
protected List<String> resolvePeerUrls() {
......
while (idx < replicaUrls.size()) {
if (isThisMyUrl(replicaUrls.get(idx))) {
replicaUrls.remove(idx);
} else {
idx++;
}
}
return replicaUrls;
}
其中isThisMyUrl
方法用于判断当前节点的Url是否与当前运行的节点的url相同,若相同,则移除。
通过以上分析:有以下结论:
- 默认
eureka.client.transport.applicationsResolverUseIp
为false的情况下,单机多几点注册机器,必须使用hostname eureka.client.transport.applicationsResolverUseIp
设置为true,必须使用ip来注册;这适用于ip不相同的情况;即若单机,则存在多网卡,每个网卡都有一个相应的IP地址;或多机的情况。peerEurekaNodes.getPeerEurekaNodes()
存储副本是非排除本机后的defaultZone
的配置