Eureka 集群注册

集群注册

方式一:通过hostname注册,适用于多机或单机搭建

  1. 标识每个启动节点的hostname, 通过eureka.instance.hostname 设置

  2. 配置eureka.client.register-with-eureka 保持默认值true, eureka.client.fetch-registry 保持默认值true

  3. 配置eureka.instance.prefer-ip-address 保持默认值 false

  4. 保持统一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注册,适用于多节点,每个节点部署一个服务

  1. 配置eureka.client.transport.applicationsResolverUseIptrue
  2. 各节点配置 eureka.client.serviceUrl.defaultZone 配置使用ip方式,若存在多网卡,需在eureka.instance.ip-address 中指定一个,写到deufaltZone中使用
  3. 配置eureka.client.register-with-eureka 保持默认值true, eureka.client.fetch-registry 保持默认值true
  4. 配置eureka.instance.prefer-ip-address 保持默认值 false
  5. 保持统一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相同,若相同,则移除。

通过以上分析:有以下结论:

  1. 默认eureka.client.transport.applicationsResolverUseIp 为false的情况下,单机多几点注册机器,必须使用hostname
  2. eureka.client.transport.applicationsResolverUseIp 设置为true,必须使用ip来注册;这适用于ip不相同的情况;即若单机,则存在多网卡,每个网卡都有一个相应的IP地址;或多机的情况。
  3. peerEurekaNodes.getPeerEurekaNodes() 存储副本是非排除本机后的defaultZone 的配置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值