Eureka 注册中心

Eureka 注册中心

薛定谔的汪

Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的服务注册和服务发现,还有服务的熔断降级等功能,是springcloud体系中最重要最核心的组件之一。

Eureka这个词来源于古希腊语,意为“我找到了!我发现了!”,据传,阿基米德在洗澡时发现浮
力原理,高兴得来不及穿上裤子,跑到街上大喊:“Eureka(我找到了)!”。

Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。

Eureka Server 提供服务注册、服务发现的功能。

Eureka Client 可以分为 Provider 和 Consumer,Provider 去 Eureka Server上注册自己的服务(包括 ip,端口号等),Consumer去 Eureka Server 上调用自己想要的服务。

注:Provider 和 Consumer 是相对的概念,比如Consumer也可能去注册中心注册自己的服务供其他服务调用。

Eureka Server作为一个独立的部署单元,以REST API的形式为服务实例提供了注册、管理和查询等操作。同时,Eureka Server也为我们提供了可视化的监控页面,可以直观地看到各个Eureka Server当前的运行状态和所有已注册服务的情况。

My Eureka

我在自己的服务器上搭建了一个 Eureka 注册中心,有需要的可以直接使用我的。

实践

idea新建springboot 项目(版本2.0.3.RELEASE),引入相关依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

启动类代码中添加@EnableEurekaServer 注解

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

我比较喜欢 yml 格式的配置文件,简洁、层次感清晰,在application.yml中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
port: 8000
eureka:
client:
#表示是否将自己注册到Eureka Server,默认为true。(注册中心自己本身没必要)
register-with-eureka: false
#表示是否从Eureka Server获取注册信息,默认为true。(注册中心自己本身没必要)
fetch-registry: false
#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。
#默认是http://localhost:8761/eureka ;多个地址可使用逗号分隔。
service-url:
defaultZone: http://localhost:${server.port}/eureka/
spring:
application:
name: server

运行启动类,启动项目,访问 http://localhost:8000,看到 Eureka 的管理界面:

此时一个简单的 Eureka 单节点注册中心就弄好了,是不是非常快捷?

集群

注册中心管理着系统中所有的服务,是非常重要的,通常会搭建集群来保证服务的高可用。

Eureka通过互相注册的方式来实现高可用的部署,即 Peer to Peer,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。

修改 host:

1
2
3
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3

新建3个 SpringBoot 项目 eureka-server1, eureka-server2, eureka-server3,三个项目的启动类分别添加@EnableEurekaServer 注解,三个项目的配置文件如下:

eureka-server1的application.yml:

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8001
eureka:
instance:
hostname: peer1
client:
service-url:
defaultZone: http://peer2:8002/eureka/,http://peer3:8003/eureka/

spring:
application:
name: server

eureka-server2的application.yml:

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8002
eureka:
instance:
hostname: peer2
client:
service-url:
defaultZone: http://peer1:8001/eureka/,http://peer3:8003/eureka/
spring:
application:
name: server

eureka-server3的application.yml:

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8003
eureka:
instance:
hostname: peer3
client:
service-url:
defaultZone: http://peer1:8001/eureka/,http://peer2:8002/eureka/
spring:
application:
name: server

启动eureka-server1、eureka-server2、eureka-server3三个项目,打开 http://localhost:8001 观察页面:

发现peer1已经有了 peer2和 peer3的节点信息,至此 Eureka 集群搭建完成。

Eureka 高可用集群分析

Eureka Server可以运行多个实例来构建集群,解决单点问题,但不同于ZooKeeper的选举leader的过程,Eureka Server采用的是Peer to Peer对等通信。这是一种去中心化的架构,无master/slave区分,每一个Peer都是对等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。每个节点都可被视为其他节点的副本。

如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer(节点间复制)操作,将请求复制到其他Eureka Server当前所知的所有节点中。

一个新的Eureka Server节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。Eureka Server通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果Eureka Server在一定时间内没有接收到某个服务实例的心跳,Eureka Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。

什么是自我保护模式?默认配置下,如果Eureka Server每分钟收到心跳续约的数量低于一个阈值(instance的数量*(60/每个instance的心跳间隔秒数)*自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学前面提到过,那就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation = false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔,eureka.server.renewal-percent-threshold可以用来修改自我保护系数(默认0.85)。

  • Title: Eureka 注册中心
  • Author: 薛定谔的汪
  • Created at : 2018-05-25 13:20:16
  • Updated at : 2023-11-17 19:37:36
  • Link: https://www.zhengyk.cn/2018/05/25/springcloud/eureka/
  • License: This work is licensed under CC BY-NC-SA 4.0.