当前位置:   article > 正文

Spring Cloud搭建Eureka服务注册中心高可用集群

注册中心高可用

Spring Cloud搭建Eureka服务注册中心高可用集群

一、Eureka服务注册中心简介
  • 简介【Spring Cloud集成Eureka构建微服务项目_玉言心的博客-CSDN博客_springboot集成微服务

    Eureka 是 Netflix 的一个子模块,也是核心模块之一,它是一个基于 Rest 的服务,用于定位服务,服务注册和发现,以实现云端中间层服务发现和故障转移。

    Eureka的服务注册和发现只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于 Zookeeper、Consul等服务,服务提供者【也可以是消费者】和服务消费者同时在Eureka-Server注册服务信息,当服务消费者需要远程调用服务提供者的服务时,可以直接通过在Eureka-Server注册是服务名完成服务调用,避免了url的依赖更新操作。

    核心组件

    • Eureka Server:提供服务注册服务,EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息
    • Eureka Client:是一个 Java 客户端,同时也具备一个内置的、集成轮询 (round-robin) 负载算法的负载均衡器

    Eureka Client服务构成:

    • Service Provider 服务提供方将自身服务注册到 Eureka,从而使服务消费方能够找到
    • Service Consumer 服务消费方从 Eureka 获取注册服务列表,从而能够消费服务

    图示:

    83fe231ee7d76a92b7576bf2308b72d694b.png

二、集群部署原理
  • 集群部署原理
    • 图示:

      在这里插入图片描述

  • 原理

    • Eureka Client内置一个 使用轮询负载算法的负载均衡器。服务启动后,Eureka Client将会向Eureka Server发送心跳更新服务,如果Eureka Server在多个心跳周期内没有接收到某个服务的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
    • Eureka Server是基于netflix设计出来的,其服务注册表中将会存储所有可用服务节点的信息,支持region和availabilityZone的概念,采用peer to peer的架构模式,也可以通过配置remoteRegionUrlsWithName来支持拉取远程的region实例,如果当前的region挂了,会自动fallback到远程的region获取数据,同时服务端采用renew租约和定时心跳的方式保护注册信息(self preservation机制)。
三、集群部署demo实现案例
  • 1.参考Spring Cloud集成Eureka构建微服务项目_玉言心的博客-CSDN博客_springboot集成微服务新建两个eureka-server服务,命名为:eureka-server-node01、eureka-server-node02

  • 更新配置文件(application.yml)

    • eureka-server-node01

      #自定义微服务名称
      spring:
        application:
          name: eureka-server-node01
        cloud:
          inetutils:
            ignored-interfaces:
              - VMware.*  # 忽略虚拟机网卡
            use-only-site-local-interfaces: true
            preferred-networks: 192.168.0.* # 优先使用 192.168.0.*
      
      
      server:
        port: 8001
      
      cluster:
        port01: ${server.port}
        port02: 8002
      
      management:
        endpoints:
          web:
            exposure:
              include: "*" # 暴露所有端点
      
      eureka:
        hostname: eureka-server-node02
        instance:
          prefer-ip-address: true
        #暴露eureka服务的地址
        client:
          serviceUrl:
            defaultZone: http://${eureka.hostname}:${cluster.port02}/eureka/
          #是否注册到eureka
          registerWithEureka: false
          #是否从eureka中拉取注册信息
          fetchRegistry: false
          # 关闭自我保护
        server:
          enable-self-preservation: true
          #清除无效节点,时间间隔为10秒
          eviction-interval-timer-in-ms: 1000
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
    • eureka-server-node02

      #自定义微服务名称
      spring:
        application:
          name: eureka-server-node02
        cloud:
          inetutils:
            ignored-interfaces:
              - VMware.*  # 忽略虚拟机网卡
            use-only-site-local-interfaces: true
            preferred-networks: 192.168.0.* # 优先使用 192.168.0.*
      
      
      server:
        port: 8002
      
      cluster:
        port01: ${server.port}
        port02: 8001
      
      management:
        endpoints:
          web:
            exposure:
              include: "*" # 暴露所有端点
      
      eureka:
        hostname: eureka-server-node01
        instance:
          prefer-ip-address: true
        #暴露eureka服务的地址
        client:
          serviceUrl:
            defaultZone: http://${eureka.hostname}:${cluster.port02}/eureka/
          #是否注册到eureka
          registerWithEureka: false
          #是否从eureka中拉取注册信息
          fetchRegistry: false
          # 关闭自我保护
        server:
          enable-self-preservation: true
          #清除无效节点,时间间隔为10秒
          eviction-interval-timer-in-ms: 1000
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
  • 更新hosts

    127.0.0.1 eureka-server-node01
    127.0.0.1 eureka-server-node02
    
    • 1
    • 2
  • 更新eureka-client配置例如manager-server、consumer-service

    • manager-server

      #自定义微服务名称
      spring:
        application:
          name: manager-server
        #端口
      server:
        port: 8090
      
      management:
        endpoints:
          web:
            exposure:
              include: "*" # 暴露所有端点
      
      #根据刚才定义的注册中心的对外暴露的地址填写。
      eureka:
        client:
          serviceUrl:
            defaultZone: http://eureka-server-node01:8001/eureka/,http://eureka-server-node02:8002/eureka/
          #每隔3秒拉取最新的注册列表(默认30秒)
          registry-fetch-interval-seconds: 3
        #心跳间隔时间为3秒(默认30秒)
        instance:
          lease-renewal-interval-in-seconds: 3
          #6秒没有接收到心跳则剔除微服务(默认90秒)
          lease-expiration-duration-in-seconds: 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
    • consumer-service

      #自定义微服务名称
      spring:
        application:
          name: consumer-service
      #端口
      server:
        port: 8082
        #根据刚才定义的注册中心的对外暴露的地址填写。
      eureka:
        client:
          serviceUrl:
            defaultZone: http://eureka-server-node01:8001/eureka/,http://eureka-server-node02:8002/eureka/
            fetch-registry: true
            #每隔3秒拉取最新的注册列表(默认30秒)
            registry-fetch-interval-seconds: 3
        #心跳间隔时间为3秒(默认30秒)
        instance:
          lease-renewal-interval-in-seconds: 3
          #6秒没有接收到心跳则剔除微服务(默认90秒)
          lease-expiration-duration-in-seconds: 6
      
      ribbon:
        eureka:
          enabled: true
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
  • 启动eureka-client服务轮询注册到,例如manager-server、consumer-service

    在这里插入图片描述

四、测试效果
  • 访问eureka-server-node01

    在这里插入图片描述

  • 访问eureka-server-node02

    在这里插入图片描述

  • 停止eureka-server-node01访问eureka-server-node02【反过来一样】

    在这里插入图片描述

    在这里插入图片描述

五、修复集群识别为unavailable-replicas
  • 原因解释

    由于本案例是基于本地搭建,使用的自定义域名eureka-server-node01、eureka-server-node02,因此不能开启使用主机名来定义注册中心的地址,否则会导致集群节点之间识别为unavailable-replicas

  • 配置说明,其中一份为例

    #自定义微服务名称
    spring:
      application:
        name: eureka-server
      cloud:
        inetutils:
          # 忽略虚拟机网卡,防止使用了虚拟机网卡出现远程调用失败等问题
          ignored-interfaces:
            # 支持名称,关键字正则
            - VMware.*  
          use-only-site-local-interfaces: true
          # 优先使用 192.168.0.*
          preferred-networks: 192.168.0.* 
    
    # 服务配置
    server:
      port: 8001
    
    # 集群部署使用配置,便于扩充管理
    cluster:
      cluster1:
        hostname: eureka-server-node02
        port: 8002
    
    management:
      endpoints:
        web:
          exposure:
            include: "*" # 暴露所有端点
    
    eureka:
      # 使用cluster配置,因此这里不使用hostname
      # hostname: eureka-server-node02
      instance:
        # 使用主机名来定义注册中心的地址,同主机下的集群不能为true,否则集群其他服务为检测为不可用
        preferIpAddress: false
        # 当前节点的服务实例名称
        hostname: eureka-server-node01
      #暴露eureka服务的地址
      client:
        serviceUrl:
          defaultZone: http://${cluster.cluster1.hostname}:${cluster.cluster1.port}/eureka/
        #是否注册到eureka
        registerWithEureka: true
        #是否从eureka中拉取注册信息,同步集群注册信息
        fetchRegistry: true
      server:
        # 关闭自我保护
        enable-self-preservation: true
        #清除无效节点,时间间隔为10秒
        eviction-interval-timer-in-ms: 1000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 解决方案,在各eureka-server服务节点更新配置
    eureka:
      hostname: eureka-server-node02
      instance:
        # 使用主机名来定义注册中心的地址,同主机下的集群不能为true,否则集群其他服务为检测为不可用
        preferIpAddress: false
        # 当前节点的服务实例名称
        hostname: eureka-server-node01
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/953063
推荐阅读
相关标签
  

闽ICP备14008679号