5.2 Eureka 服务端集群
- 使用了注册中心,所有服务都有通过注册中心获取服务信息地址,这时稳定性就变得重要了,一旦坏了,一项整个系统的稳定性,所有实际开发中,一般都是集群
5.2.1 集群的搭建
- 原理
实际上就是启动多个 eureka 实例,实例之间相互注册、同步数据、共同组成一个 Eureka 集群 - 配置 hosts 文件
地址:
C:\Windows\System32\drivers\etc\hosts
最后一行添加
127.0.0.1 eurekaA eurekaB
- 新增配置文件
在笔记【Spring Cloud 学习笔记——Eureka 服务端介绍和基本搭建】的基础上,新增两个配置文件:application-a.properties 和 application-b.properties
application-a.properties
# 此微服务名称
spring.application.name=eureka
# 此微服务端口
server.port=1111
# 相当于给服务起个别名,注册到注册中心,与 hosts 文件中配置相对应
eureka.instance.hostname=eurekaA
# 默认本身也是一个微服务,当它是注册中心时,有两个身份,一个是服务注册中心,一个是普通项目,它会自己把注册到自己上面,默认是true
# 集群,当前项目要注册到服务注册中心,设为true
eureka.client.register-with-eureka=true
# 集群,获取注册信息表
eureka.client.fetch-registry=true
# B 服务要注册到 A 服务上去
eureka.client.service-url.defaultZone=http://eurekaB:1112/eureka
application-b.properties
# 此微服务名称
spring.application.name=eureka
# 此微服务端口
server.port=1112
# 相当于给服务起个别名,注册到注册中心,与 hosts 文件中配置相对应
eureka.instance.hostname=eurekaB
# 默认本身也是一个微服务,当它是注册中心时,有两个身份,一个是服务注册中心,一个是普通项目,它会自己把注册到自己上面,默认是true
# 集群,当前项目要注册到服务注册中心,设为true
eureka.client.register-with-eureka=true
# 集群,获取注册信息表
eureka.client.fetch-registry=true
# A 服务要注册到 B 服务上去
eureka.client.service-url.defaultZone=http://eurekaA:1111/eureka
- 配置完成后,对象名打包,双击 package
- 打开到两个 target 目录,分别输入
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=a
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=b
启动两个 Eureka 服务端,启动后报错可能是代码问题,也可能是另一个 Eureka 没启动完成,过一段时间都不报错了,Eureka 集群就搭建好了
- 访问 http://localhost:1111/
- 访问http://localhost:1112/
- 至此说明 Eureka 集群搭建成功
5.3 Eureka 工作细节
- Eureka 本身分为两个部分, Eureka Server 和 Eureka Client
5.3.1 Eureka Server
- Eureka Server 主要提供3个功能
① 服务注册,所有服务都注册到 Eureka Server 上来
② 提供注册表,注册表就是所有注册上来服务的一个列表,Eureka Client 在调用服务时,需要获取这个注册表,一般来说,这个注册表会缓存下来,如果缓存失效,则直接获取最新的注册表
③ 同步状态, Eureka Client 通过注册、心跳机制,和 Eureka Server 同步当前客户端的状态
5.3.1.1 自我保护机制
- 网络波动,如果三次没有收到 Eureka Client 的请求后,就删除该 Eureka Client 信息,可能造成误杀,为此出现了自我保护机制,开发环境不用开启,生产建议开启
eureka.server.enable-self-preservation=true
- 统计 15 分钟内是否低于 85% ,如果低于 85%,进入保护机制
① 不在移除因长时间没有收到心跳而过期的微服务
② 依然会接收新的注册、查询请求,但是不会同步
③ 不会同步到其他节点(自己不知道注册信息有没有失效),当恢复后同步到其他节点,退出保护机制
5.3.2 Eureka Client
- Eureka Client 主要是用来简化每个服务和 Eureka Server 之间的交互,Eureka Client 会自动拉取、更新、以及缓存 Eureka Server 中的信息,这样 Eureka Server 所有节点宕机,Eureka Client 依然能够获取到想要调用服务的地址(这是理想状态,有时候地址可能不准确,比如有个服务重启 IP 变了,还拿老地址调用服务,就不行了)
5.3.2.1 服务注册
- 服务提供者(本质也是一个 Eureka Client)将自己注册到服务中心(Eureka Server)。当 Eureka Client 向 Eureka Server 注册时,它需要提供自身的一些元数据,例如: IP 地址、端口、名称、运行状态等等
5.3.2.2 服务续约
-
Eureka Client 注册到 Eureka Server 上之后,事情没有结束,只是刚刚开始,注册成功后,默认情况下,Eureka Client 每隔 30 秒就要向 Eureka Server 发送一条消息,来告诉 Eureka Server 我还在运行。如果 Eureka Server 连续 90 秒没有收到 Eureka Client 的续约消息(连续三次没发送),它会认为 Eureka Client 已经掉线,会将掉线的 Eureka Client 从当前的列表中删除。
-
服务续约,有两个相关属性(一般不建议修改)
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in seconds=90
eureka.instance.lease-renewal-interval-in-seconds=30
表示服务续约时间,默认是30秒
eureka.instance.lease-expiration-duration-in seconds=90
服务失效时间,默认是90秒
5.3.2.3 服务下线
- 当 Eureka Client 下线时,它会主动发送一条消息,告诉 Eureka Server,我下线啦。
5.3.2.4 获取注册表信息
- Eureka Client 从 Eureka Server 上获取服务的注册信息,并将其缓存在本地。本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的 IP 地址、端口等信息。 Eureka Client 上缓存的服务注册信息会定期更新,如果 Eureka Server 返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client 会自动处理
- 这里也涉及两个属性,一个是是否允许获取注册表信息
eureka.client.fetch-registry=true
Eureka Client 上缓存的服务注册信息,定期更新的时间间隔,默认 30 秒
eureka.client.register-fetch-interval-seconds=30
5.4 Eureka 集群原理
- 在集群中,Eureka Server 通过 Replicate 同步数据,不同 Eureka Server 之间不分主从,是平等的;节点之间,通过指定 serviceUrl 来互相注册,形成一个集群,进而提高节点的可用性,如果有一个 Eureka Server 宕机,Eureka Client 会自动切换到新的 Eureka Server 上,每个 Eureka Server 节点上,都会相互同步数据
- Eureka Server 的注册方式可以是单线的,也可以是多线的
单线:
A --> B --> C ,此方法 A 、C 也会同步,但如果 B 宕机了,A 、C 之间就不同步了
多线:
A --> B , C; B --> A , C;C --> A,B;如果一个节点宕机,另外两个节点依然可以同步数据
5.4.1 Eureka 分区
- Region:地理位置上的不同区域,比如华北、东北
- Zone:具体机房
同一个 Zone 的分区里的 Eureka Server 、Eureka Client 优先进行心跳、同步,没有找到再去其他分区找