我是靠谱客的博主 大胆鸭子,最近开发中收集的这篇文章主要介绍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
      
    • 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
      
  • 更新hosts

    127.0.0.1 eureka-server-node01
    127.0.0.1 eureka-server-node02
    
  • 更新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: 
      
    • 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
      
  • 启动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
    
  • 解决方案,在各eureka-server服务节点更新配置
    eureka:
      hostname: eureka-server-node02
      instance:
        # 使用主机名来定义注册中心的地址,同主机下的集群不能为true,否则集群其他服务为检测为不可用
        preferIpAddress: false
        # 当前节点的服务实例名称
        hostname: eureka-server-node01
    

最后

以上就是大胆鸭子为你收集整理的Spring Cloud搭建Eureka服务注册中心高可用集群的全部内容,希望文章能够帮你解决Spring Cloud搭建Eureka服务注册中心高可用集群所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部