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 | <dependency> |
启动类代码中添加@EnableEurekaServer 注解
1 |
|
我比较喜欢 yml 格式的配置文件,简洁、层次感清晰,在application.yml
中添加:
1 | server: |
运行启动类,启动项目,访问 http://localhost:8000
,看到 Eureka 的管理界面:
此时一个简单的 Eureka 单节点注册中心就弄好了,是不是非常快捷?
集群
注册中心管理着系统中所有的服务,是非常重要的,通常会搭建集群来保证服务的高可用。
Eureka通过互相注册的方式来实现高可用的部署,即 Peer to Peer,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。
修改 host:
1 | 127.0.0.1 peer1 |
新建3个 SpringBoot 项目 eureka-server1, eureka-server2, eureka-server3,三个项目的启动类分别添加@EnableEurekaServer 注解,三个项目的配置文件如下:
eureka-server1的application.yml:
1 | server: |
eureka-server2的application.yml:
1 | server: |
eureka-server3的application.yml:
1 | 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.