200703-Eureka注册中心原理及其搭建

Eureka注册中心原理及其搭建

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

一、Eureka组件

Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server

  1. Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  2. Eureka Server本身也是一个服务,默认情况下会自动注册到Eureka注册中心。

  3. Eureka Server通过Register、Get、Renew等接口提供服务的注册、发现和心跳检测等服务。

Eureka Client

  1. Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
  2. Eureka Client分为两个角色,分别是:Application Service(Service Provider)和Application Client(Service Consumer)
  3. 在这里,Application Service和Application Client不是绝对上的定义,因为Provider在提供服务的同时,也可以消费其他Provider提供的服务;Consumer在消费服务的同时,也可以提供对外服务。

Application Service

服务提供方,是注册到Eureka Server中的服务。

Application Client

服务消费方,通过Eureka Server发现服务,并消费。

二、EurekaServer架构原理简介

EurekaServer架构原理简介

  1. Register(服务注册):IP和端口注册给Eureka Server
  2. Renew(服务续约):发送心跳包,每30秒发送一次。
  3. Cancel(服务下线):当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务。
  4. Fetch Registry(获取服务注册列表):获取其他服务列表。
  5. Replicate(集群中数据同步):eureka集群中的数据复制与同步。
  6. Make Remote Call(远程调用):完成服务的远程调用。

三、Eurekaerver集群搭建

注册中心作为微服务架构中的核心功能,其重要性不言而喻。所以单机版的Eureka Server在可靠性上并不符合现在的互联网开发环境。集群版的Eureka Server才是商业开发中的选择。

  1. ZooKeeper注册中心集群搭建后,集群中各节点呈现主从关系,集群中只有主节点对外提供服务的注册和发现功能,从节点相当于备份节点,只有主节点宕机时,从节点会选举出一个新的主节点,继续提供服务的注册和发现功能。
  2. Eureka Server注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供服务的发现和注册等功能。同时集群中每个Eureka Server节点又是一个微服务。

四、EurekaServer安全认证

Eureka Server作为Spring Cloud中的服务注册中心,如果可以任意访问的话,那么其安全性太低。所以Spring Cloud中也有为Eureka Server提供安全认证的方式。可以使用spring-boot-starter-security组件来为Eureka Server增加安全认证。

  1. 添加pom依赖

    1
    2
    3
    4
    5
    <!-- spring boot security安全认证启动器 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. 修改配置文件
    修改全局配置文件,在全局配置文件中,开启基于http basic的安全认证。

    peer1的yml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    spring:
    application:
    name: register-center
    security:
    user:
    name: test
    password: 123456
    server:
    port: 8761 # 指定该Eureka实例的端口
    eureka:
    server:
    enableSelfPreservation: false
    evictionIntervalTimerInMs: 5000 # 清理无效节点的时间间隔
    instance:
    hostname: peer1.eureka.laosan.xin # 指定该Eureka实例的主机名
    lease-renewal-interval-in-seconds: 5 # 心跳时间间隔
    lease-expiration-duration-in-seconds: 15 # 没有心跳的淘汰时间,15秒
    client:
    registerWithEureka: true #false表示不向注册中心注册自己
    fetchRegistry: false #是否将自己注册到Eureka Server 默认为true,我的职责就是维护服务实例,并不需要去检索服务
    serviceUrl:
    defaultZone: http://test:123456@peer2.laosan.xin:8762/eureka/

    peer2的yml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    spring:
    application:
    name: register-center
    security:
    user:
    name: test
    password: 123456
    server:
    port: 8761 # 指定该Eureka实例的端口
    eureka:
    server:
    enableSelfPreservation: false
    evictionIntervalTimerInMs: 5000 # 清理无效节点的时间间隔
    instance:
    hostname: peer2.eureka.laosan.xin # 指定该Eureka实例的主机名
    lease-renewal-interval-in-seconds: 5 # 心跳时间间隔
    lease-expiration-duration-in-seconds: 15 # 没有心跳的淘汰时间,15秒
    client:
    registerWithEureka: true #false表示不向注册中心注册自己
    fetchRegistry: false #是否将自己注册到Eureka Server 默认为true,我的职责就是维护服务实例,并不需要去检索服务
    serviceUrl:
    defaultZone: http://test:123456@peer1.laosan.xin:8762/eureka/

五、服务保护

服务保护模式

微服务在Eureka上注册后,会每30秒发送心跳包,Eureka通过心跳来判断服务时候健康,同时会定期删除超过90秒没有发送心跳服务

导致Eureka Server接收不到心跳包的可能:一是微服务自身的原因,二是微服务与Eureka之间的网络故障。通常微服务的自身的故障只会导致个别服务出现故障,一般不会出现大面积故障,而网络故障通常会导致Eureka Server在短时间内无法收到大批心跳。考虑到这个区别,Eureka设置了一个阀值,当判断挂掉的服务的数量超过阀值时,Eureka Server认为很大程度上出现了网络故障,将不再删除心跳过期的服务。

Eureka Server在运行期间,会统计心跳失败的比例在15分钟内是否低于85%,如果低于85%,Eureka Server则任务是网络故障,不会删除心跳过期服务。

这种服务保护算法叫做Eureka Server的服务保护模式。

这种不删除的,90秒没有心跳的服务,称为无效服务,但是还是保存在服务列表中。如果Consumer到注册中心发现服务,则Eureka Server会将所有好的数据(有效服务数据)和坏的数据(无效服务数据)都返回给Consumer。

参考资料

  1. Spring Cloud Eureka详解
  2. Eureka注册中心原理及其搭建
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×