Eureka 的高可用

Eureka 是 Netfilx 开源的服务发现组件,本身是一个基于 REST 的服务。它包含 EurekaServer 和 EurekaClient 两部分,SpringCloud 将它集成在子项目 Spring Cloud Netfilx 中,实现了微服务的注册与发现。 Eureka 作为服务注册中心对整个微服务架构起着最核心的整合作用。 Eureka 简单来讲就是 Netflix 开源的一款提供服务注册和发现的产品,Spring Cloud Netflix 提供的胶水代码更换了一些初始化配置,并增加了更人性化的界面,可以这样理解,Spring Cloud Netflix 让 Eureka 更简单易用,下面我们看看如何实现 Eureka 的高可用。

当其中一台的服务发生故障时不影响整体服务状况,不能因为一台服务器的问题导致服务停止,高可用的方法有三种:主从方式、双机双工方式、集群工作方式。而 Zookeeper 采用的是主从方式、Eureka 则采用的是集群方式,当多台服务器相互注册就形成了高可用,这样当其中的一台停止提供服务时,剩余的则会继续提供服务。

mark

我们需要将原来的单个 EurekaClient 与单个 EurekaServer 进行注册的方式改成两个单个 EurekaServer 相互注册,然后,Client 分别在两个 EurekaServer 上注册。这样就算其中一台单个 EurekaServer 挂掉了,另一个还能继续工作。实现了最简单的高可用的架构。那么如何实现呢?

首先需要在 xxApplication 类中加上 @EnableEurekaServer 注解,表示这是一个 EurekaServer,然后配置如下:

1
2
3
4
5
6
7
8
9
10
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka

接下来我开启两个 EurekaServer,端口分别为 8761 与 8762:

mark

在启动 EurekaServer1 的时候,把它的注册地址改为 http://127.0.0.1:8762/eureka/,在启动 EurekaServer2 的时候,把它的注册地址改为 http://127.0.0.1:8761/eureka/,这样两个 EurekaServer 便完成了相互注册。

这里需要注意,虽然 localhost 与 127.0.0.1 在我们平时使用起来是一样的,但是如果这里写成了 http://localhost:8761/eureka/ 就无法相互注册,一定要写 127.0.0.1,如果不可以的话需要修改 Windows 的 Host 文件,通过假域名来替代 localhost。

这里还有个问题,那就是注册地址为什么是 http://127.0.0.1:8761/eureka/ ?为什么 context-path 是 eureka, 因为在 SpringCloud 环境下,context-path 就是 eureka

启动两个 EurekaServer,我们可以看到相互注册的结果:

mark

接下来我们把一个 CLient 注册到其中一个 EurekaServer1 上面:

1
2
3
4
5
6
7
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: clientA

但是我们打开 EurekaServer2,却发现这个 Client 同时注册到了 EurekaServer2 上面:

mark

那么这样做的缺点就是如果 EurekaServer1 挂掉了,那么 Client 也就无法再 EurekaServer2 中注册,为了避免这种情况,Client 需要在多个 EurekaServer 中注册,配置文件可以这么写(同时不要忘记需要在 xxApplication 类上注解 @EnableDiscoveryClient):

1
2
3
4
5
6
7
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/, http://localhost:8762/eureka/
spring:
application:
name: clientA

其实我们还可以弄三台 EurekaServer 相互注册,像下图这样:

mark

我们需要再开启一台 EurekaServer3:

mark

那么这三台 EurekaServer 在启动的配置分别为:

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
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8762/eureka/, http://127.0.0.1:8763/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka

##################### EurekaServer2
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8763/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
##################### EurekaServer3
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka

mark

上面介绍了双节点注册中心和三节点注册中心,如果是在生产环境中需要至少三台或者三台以上的注册中心,保证服务的高可用性。不过,我们还需要重点了解的就是 Eureka 的心跳检测、健康检查以及负载均衡是如何做到的等原理性的东西。另外,理解微服务架构也是很重要的,服务注册中心是最重要的基础部分。