Eureka集群与原理
原理
Eureka Server注册中心的集群和Dubbo的ZooKeeper注册中心集群在结构上有很大的不同。
Eureka Server注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供服务的发现和注册等功能。同时集群中每个Eureka Server节点又是一个微服务,也就是说,每个节点都可以在集群中的其他节点上注册当前服务。又因为每个节点都是注册中心,所以节点之间又可以相互注册当前节点中已注册的服务,并发现其他节点中已注册的服务。
- CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。
由于分布式系统中必须保证分区容错性,因此我们只能在A和C之间进行权衡。
Zookeeper保证的是CP, 而Eureka则是保证AP。
组件调用关系
搭建Eureka注册中心集群,实现负载均衡+故障容错。Eureka集群:==相互注册,相互守望。==
服务提供者
1、启动后,向注册中心发起register请求,注册服务
2、在运行过程中,定时向注册中心发送renew心跳,证明“我还活着”。
3、停止服务提供者,向注册中心发起cancel请求,清空当前服务注册信息。
服务消费者
1、启动后,从注册中心拉取服务注册信息
2、在运行过程中,定时更新服务注册信息。
3、服务消费者发起远程调用
数据存储结构
既然是服务注册中心,必然要存储服务的信息,我们知道ZK是将服务信息保存在树形节点上。而下面是Eureka的数据存储结构:
- Eureka的数据存储分了两层:数据存储层和缓存层。Eureka Client在拉取服务信息时,先从缓存层获取(相当于Redis),如果获取不到,先把数据存储层的数据加载到缓存中(相当于Mysql),再从缓存中获取。值得注意的是,数据存储层的数据结构是服务信息,而缓存中保存的是经过处理加工过的、可以直接传输到Eureka Client的数据结构。
集群
我们使用笔记本 配置 Eureka 集群
- 修改映射配置添加进hosts文件
mac系统的,接下来写的步骤是mac的。打开终端,输入sudo vim /etc/hosts来修改hosts文件。(权限不够需要加上sudo并输入密码)
在最后一行加入:
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
然后:wq!保存退出。
- 修改 Eureka 7001 的 yml 配置
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false
fetch-registry: false
service-url:
#集群版 相互注册,相互守望
defaultZone: http://eureka7002.com:7002/eureka/, http://eureka7003.com:7003/eureka/
- 修改 Eureka 7002 的 yml 配置
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
register-with-eureka: false
fetch-registry: false
service-url:
#集群版 相互注册,相互守望
defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7003.com:7003/eureka/ #相互注册,相互守望
- 修改 Eureka 7003 的 yml 配置
eureka:
instance:
hostname: eureka7003.com #eureka服务端的实例名称
client:
register-with-eureka: false
fetch-registry: false
service-url:
#集群版 相互注册,相互守望
defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/ #相互注册,相互守望
- 将客户端注册到 eureka 集群
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
actuator微服务信息完善
修改 eureka client 的yml文件:
# client:
# ... instance要和client对齐
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示ip地址
修改前:
修改后:
Eureka自我保护
保护模式主要用于一组客户端和Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其注册表的信息,不再删除服务注册表的数据,也就是不会注销任何微服务
导致原因 :某时刻某一个微服务不可用了 ,Eureka不会立刻清理,依旧会对该微服务对信息进行保存,属于CAP里面对AP分支
- Eureka自我保护机制
为了防止EurekaClient 可以正常运行,但是Server 在网络不通对情况下,Server不会立即剔除Client
只有在一定时间内丢失大量服务的心跳才开启自我保护模式。
禁止自我保护
server:
#关闭自我保护,默认为true
enable-self-preservation: false
#心跳的间隔时间,单位毫秒
eviction-interval-timer-in-ms: 2000
#Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待的时间上限,单位秒(默认90秒),超时剔除服务
lease-expiration-duration-in-seconds: 2
- Springcloud 仓库地址 : github链接.