在第六篇中,我们已经有过将 Eureka Client 注册到本地 Eureka Server 服务上的介绍,但当时的本地 Eureka Server 服务是个单节点服务,在第七篇中我们实现了 Eureka Server 高可用方案后 Client 又该如何注册呢?
其实很简单,只需要将 Client 注册到集群中的每一个节点即可。
一、Eureka Client 高可用
1.1 Eureka Client 配置
以第六篇中我们创建的 Eureka Client 为例。当时,我们注册到单节点的 Eureka Server 的配置文件如下所示:
spring:
application:
name: client-test
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
而我们只需要将 eureka.client.service-url.defaultZone 的值由一个节点改为多个节点即可,如下配置:
spring:
application:
name: client-test
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/
注:http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/ 是我们在第七讲中实现的一个 Eureka 高可集群方案。
1.2 实现 client 高可用
前面我们实现了 Eureka Server 的高可用,即建立一个集群来实现 Server 服务的交叉注册,并且我们将客户端服务分别注册到集群上的每一个节点,这样即使某一个 Server 服务挂掉了,仍然能够保证我们能够获取到我们的 Client 服务信息。
这似乎看起来已经是一个完美的解决方案了呀,还要做什么 client 的高可用呢?
难道你没发现一个问题,如果我们的 client 服务它自己挂了呢?就算我们的 Server 服务是正常的,那么我们不是也访问不了我们的 Client 端的服务了吗,那这个问题如何解决呢?
其实非常简单,我们只需要把我们的 client 服务的程序多运行几个便解决了这个问题,启动方法大致有两种:
(1) 我们可以在同一台服务器上启动多个 Client 程序监听不同的端口,只需要该服务器与 Server 集群的服务器网络连通。
(2) 也可以在不同服务器上启动多个 Client 程序监听 "不同/相同" 的端口,同样需要该服务器与 Server 集群的服务器网络连通。
如:
我在 localhost 上运行一个 localhost:8080 的 Client 并注册到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/,
在 localhost 上运行一个 localhost:8081 的 Client 并注册到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/,
在 192.168.174.135 (不同于 Eureka Server 集群另一台虚拟机) 运行一个 192.168.174.135:8080 的 Client 并注册到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/。
程序打包及运行此处省略,可参考第六篇中介绍的方法操作。
运行正常后,我们可以从 Eureka Server 集群的各节点中查看到已经注册的 Eureka Client 服务,如下图所示:
其他节点信息基本相同,不再列出。
至此,我们的 Eureka 的 Server 和 Client 的高可用便完整的实现了。
二、Eureka 总结及注意事项
2.1 Eureka 注意事项
1 伪高可用
在我们将 Client 服务注册到我们的 Server 集群上时,也许有人会发现,如果我们的注册地址只填写 Server 集群上的一个节点,我们也能在三个节点的 UI 界面上都看到这个 Client 服务。如下示例:
Client -> application.yml
eureka:
client:
service-url:
defaultZone: http://hadoop1:8000/eureka/
这是不是说我们前面讲的在 Client 的配置文件中配置 Eureka Server 集群的每一个节点是多余的操作呢?其实不然,我们只配置了注册到 hadoop1 节点的 Eureka Server 服务,那么 Client 服务就只是在 hadoop1 节点上进行了注册,而在 hadoop2/hadoop3 节点上也能看见 Client 服务的信息则是因为 Server 之间有互相同步数据的功能。因此,我们只是在 hadoop2/hadoop3 节点看到了 hadoop1 上的数据而已,实则并没有真正注册在 hadoop2/hadoop3 节点。
如果 hadoop1 节点的 Eureka Server 不幸挂掉了的话,那么 hadoop2/hadoop3 节点上的 Client 服务也就看不到了。
这就是一个伪高可用的坑。
1 Eureka Server 自己本身也是一个 Client,它也需要向 其他的 Eureka Server 注册
从构建集群时,我们可以了解到,Eureka Server
这有点类似于,苏宁是一个电商平台,用户可以直接从苏宁的官网上买到其所售的商品;淘宝也是一个电商平台,用户也可以直接从淘宝上买到其所售的商品。然后,苏宁在淘宝上注册了一个店铺。这样你既能从苏宁官网买到他所售的商品,也能从淘宝的苏宁店铺买到他的商品...
当然,苏宁在淘宝注册店铺的原因应该不会是害怕自家的官网宕掉了...哈哈,此处思路应该是相通的,只是各自所需要达到的目的可能不同。
Eureka Server 使用相互交叉注册的方式,能够使得即使一个服务挂掉了,整个注册中心仍然处于可正常运转的状态。
2 Eureka Server 自我保护机制
Eureka Server 的自我保护机制可以通过 eureka.server.enable-self-preservation: false 来关闭。
自我保护机制的响应率阀值默认 85%,如果 15 min 之内心跳失败的比例低于该阀值,会有告警,但 Eureka Server 还是会保留 Client 在注册中心里,这是为了防止由于网络原因导致了心中检测出现问题,给出了一定的容错空间。
此阀值也可以通过设置 eureka.server.renewal-percent-threshold:0.50 来进行设置
2.2 Eureka 总结
1 创建 Eureka Server/Client
要创建一个 Eureka Server/Client 程序,我们只需要以下几步
(1) 创建一个 spring boot 项目
(2) 添加 spring cloud netflix 依赖及 spring boot 依赖
(3) 配置项目信息
(4) 在 spring boot 的启动类上添加 @EnableEurekaServer (Server) 注册或者 @EnableDiscoveryClient/@EnableEurekaClient (Client)注解即可。
2 高可用
要实现 Eureka Server 的高可用,我们只需要为 Eureka Server 服务搭建一个集群,让其多个(至少俩)服务之间交叉注册即可。
要实现 Eureka Client 的高可用,我们只需要为 Eureka Client 程序多启动几个服务并且注册到 Eureka Server 即可。
3 Eureka 服务间通讯机制
Eureka 默认使用 Jersey/Xstream/ 进行数据的序列化,使用 HTTP 协议进行 Client 与 Server 端的通信,但你也可以使用自己的序列化方式来进行服务间通信。官方文档地址如下:
https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication
4 Eureka 自我保护机制
自我保护机制是跟 Eureka 的心跳机制有关的 (心跳机制就是 Client 与 Server 端每隔一段时间进行一次网络通信,交换服务的相关元数据)。而用过网络通信自然就有可能存在网络上的问题,比如,Client A 本来运行是正常的,但在 Client A 与 Server A 之前的网络出现了异常,导致这两者之间的通信中断。这种情况下就属于误判了,因为 Client 本身是正常运行的,于是为了防止这类情况,Eureka 做了个自我保护机制。
官方文档地址如下:
https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication
5 官方的 Eureka 高可用架构图
前面虽然我也画过 Eureka 的高可用架构图,但我只画了 Server 部分的,完整及权威的请参数如下架构图:
官方文档地址
https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
6 更多 Eureka Server/Client 的配置
更多 Eureka Server/Client 的配置请参考官方源码
EurekaServerConfigBean 类
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfigBean.java
EurekaClientConfigBean 类
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java
EurekaInstanceConfigBean 类
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java
7 Eureka 相关项目代码
Eureka Server
https://github.com/jiangzhuolin/eureka-server-simple
Eureka Client
https://github.com/jiangzhuolin/eureka-client-simple