暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Cloud系列(六)Neflix Eureka高可用

丁锅笔记 2018-08-15
235

1

Eureka较zookeeper和consul比较,他具备以下特点


1,AP(最终一致性),采用的是HTTP 定时轮训方式。主要是保证高可用。
2,适用规模:2000多个 实例(节点)。

2

Neflix Eureka高可用


客户端高可用


高可用注册中心集群

  • 单机模拟多台Eureka服务器

    • 1,在工程里面添加多份配置文件


      application-pro1.properties:
      spring.application.name=eureka-server
      server.port=9090
      ##取消服务器自我注册上报的功能
      eureka.client.register-with-eureka=false
      ##不需要检索服务
      eureka.client.fetch-register=false
      ##eureka server 服务的Url 用于客户端注册
      eureka.client.serviceUrl.defaultZone=\
      http://localhost:${server.port}/eureka
      application-pro2.properties:
      spring.application.name=eureka-server
      server.port=9091
      ##取消服务器自我注册上报的功能
      eureka.client.register-with-eureka=false
      ##不需要检索服务
      eureka.client.fetch-register=false
      ##eureka server 服务的Url 用于客户端注册
      eureka.client.serviceUrl.defaultZone=\
      http://localhost:${server.port}/eureka

    • 2,使用Program arg的方式配置--spring.profiles.active=pro2和--spring.profiles.active=pro1先后激活这两台服务。

    • 3,在浏览器中输入地址http://localhost:9090/,http://localhost:9091/ ,即可访问这两台服务

  • 客户端配置

    • 1,在客户端的配置文件中添加如下配置:
      eureka.client.serviceUrl.defaultZone=\
      http://localhost:9091/eureka,http://localhost:9090/eureka

    • 2,先后启动我们的服务提供者(多台)和消费者
      这里有个小技巧:可以配置服务提供者的随机端口的范围,这样就不需要重复的去修改配置。
      即在配置文件中添加server.port=${random.int[7070,7079]}即可。

    • 3,再次在浏览器中输入地址http://localhost:9090/,http://localhost:9091/ 访问这两台服务。我们可以看到如图所示内容,其中一台服务没有注册任何实例?这是因为:如果 Eureka 客户端应用配置多个 Eureka 注册服务器,那么默认情况只有第一台可用的服务器,存在注册信息。如果 第一台可用的 Eureka 服务器 Down 掉了,那么 Eureka 客户端应用将会选择下一台可用的 Eureka 服务器。

其他的重要配置

  • 获取注册信息时间间隔

    • Eureka 客户端需要获取 Eureka 服务器注册信息,这个方便服务调用。Eureka 客户端:EurekaClient,关联应用集合:Applications单个应用信息:Application,关联多个应用实例。单个应用实例:InstanceInfo 。当 Eureka 客户端需要调用具体某个服务时,比如消费者调用服务提供者,服务提供者实际对应对象是Application,关联了许多应用实例(InstanceInfo)。见源码:

    • 如果应用服务提供者的应用实例发生变化时,那么服务消费者是需要感知的(拉的模式)。比如:服务提供者机器从10 台降到了5台,那么,作为调用方的服务消费者需要知道这个变化情况。可是这个变化过程,可能存在一定的延迟,可以通过调整注册信息时间间隔来减少错误。具体的配置项如下:
      ## 调整注册信息的获取周期,默认值:30秒
      eureka.client.registryFetchIntervalSeconds = 5

  • 实例信息复制时间间隔

    • 具体就是客户端信息的上报到 Eureka 服务器时间。当 Eureka 客户端应用上报的频率越频繁(推的模式),那么 Eureka 服务器的应用状态管理一致性就越高。具体配置项如下:
      ## 调整客户端应用状态信息上报的周期
      eureka.client.instanceInfoReplicationIntervalSeconds = 5

  • 实例Id

    • 从 Eureka Server Dashboard 里面可以看到具体某个应用中的实例信息,如lqdachjj:eureka-server:9090,这里我们可以自定义,在配置文件中添加:eureka.instance.instanceId=${spring.application.name}:${server.port},修改后效果如图:

    • 源码如图所示。这里其实设计的不合理,根据应用的实例注册,导致我们在Eureka Server Dashboard里头同一个服务有多个名称展示出来。

  • 实例端点映射

    • 我们在Eureka Server Dashboard 点击跳转默认配置是/info,可以修改配置项如下,调整请求的地址。
      ## Eureka 客户端应用实例状态 URL
      eureka.instance.statusPageUrlPath = /health

    • 可以在EurekaInstanceConfigBean类中找到具体的设计(private String statusPageUrlPath = "/info")

服务端高可用

  • 1,修改上面的注册服务器的配置信息
    application-pro1.properties:
    spring.application.name=eureka-server
    server.port=9090
    ##取消服务器自我注册上报的功能
    eureka.client.register-with-eureka=true
    ##不需要检索服务
    eureka.client.fetch-register=true
    ##eureka server 服务的Url 用于客户端注册
    eureka.client.serviceUrl.defaultZone=\
    http://localhost:9091/eureka
    application-pro2.properties:

    spring.application.name=eureka-server
    server.port=9091
    ##取消服务器自我注册上报的功能
    eureka.client.register-with-eureka=true
    ##不需要检索服务
    eureka.client.fetch-register=true
    ##eureka server 服务的Url 用于客户端注册
    eureka.client.serviceUrl.defaultZone=\
    http://localhost:9090/eureka

  • 2,按上面的方式启动服务,在浏览器中访问,如图所示,发现注册的服务不再只有一台服务上有信息了,且两台服务互为副本。

文章转载自丁锅笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论