3.Eureka
3.1.简介
Eureka
是Netflix
在线影片公司开源的一个服务注册与发现的组件,和其他Netflix
公司的服务组件(例如负载均衡、 熔断器、网关等) 一起,被Spring Cloud
社区整合为SpringCloudNetflix
模块。
3.2.Eureka与Zookeeper
3.2.1.CAP原则
CAP
原则又叫CAP
定理,指的是在一个分布式系统中,
一致性(Consistency)
可用性(Availability)
分区容错性(Partition tolerance)(这个特性是不可避免的)
CAP
原则:这三个要素最多只能同时实现两点,不能三者兼顾。
3.2.2.分布式特征
数据的一致性:(A,B,C 里面的数据是一致的)
- Zookeeper注重数据的一致性。
- Eureka不是很注重数据的一致性!
服务的可用性:(若 Zookeeper集群里面的master挂了怎么办)
- Paxos(多数派) 在Zookeeper里面,若主机挂了,则Zookeeper集群整体不对外提供服务了,需要选一个新的出来(120s左右)才能继续对外提供服务!
- Eureka注重服务的可用性,当Eureka集群只有一台活着,它就能对外提供服务
分区的容错性:(在集群里面的机器,因为网络原因,机房的原因,可能导致数据不会里面 同步),它在分布式必须需要实现的特性!
Zookeeper注重数据的一致性,CP(注册中心,配置文件中心,协调中心)
Eureka注重服务的可用性,AP(注册中心)
3.3.快速入门
3.3.1.搭建Eureka-server
①创建项目
②选择依赖
③pom.xml
④修改配置文件
⑤修改启动类
⑥访问测试
Eureka-Server
不仅提供让别人注册的功能,它也能注册到别人里面,自己注册自己 所以,在启动项目时,默认会注册自己,也可以关掉这个功能。
3.3.2.搭建Eureka-client
①创建项目
②选择依赖
③pom.xml
④修改配置文件
⑤修改启动类
⑥访问测试
还可以继续创建多个client
,只需要修改端口和服务名即可。
3.3.3.注册中心的状态认识
UP:服务是上线的,括号里面是具体服务实例的个数,提供服务的最小单元
DOWN:服务是下线的
UN_KONW:服务的状态未知
3.3.4.常用配置设置
①server中的配置
server:
port: 8761 # eureka默认端口
spring:
application:
name: eureka-server # 服务名称
eureka:
server: #server既是服务端又是客户端
eviction-interval-timer-in-ms: 10000 #服务端间隔多少毫秒进行定期删除
renewal-percent-threshold: 0.85 #超过百分之多少的客户端和当前服务端没有进行续约时,eureka会进行保护服务,不会进行删除
instance:
hostname: localhost #主机名称/服务的ip
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名称:服务名称:端口号 localhost:eureka-server:8761
prefer-ip-address: true #以ip的形式显示具体的服务信息
lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔,单位是秒
lease-expiration-duration-in-seconds: 20 #表示 eureka server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例
②client中的配置
server:
port: 8001 # 客户端的端口可以随便给,只要不冲突即可
spring:
application:
name: eureka-client-a # 访问名称
# 将客户端注册到服务端
eureka:
client:
eureka-server:
defaultZone: http://localhost:8761/eureka/ # 注册地址
register-with-eureka: true #是否注册自己
fetch-registry: true #是否拉取服务列表
registry-fetch-interval-seconds: 5 # 表示eureka-client间隔多久去拉取服务注册信息
instance:
hostname: localhost # 服务主机名称
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 实例id
prefer-ip-address: true # 服务列表以ip的形式显示
lease-renewal-interval-in-seconds: 10 # 表示eureka-client发送心跳给server端的频率
lease-expiration-duration-in-seconds: 20 #表示eureka-server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例
3.4.构建集群
3.4.1.server-1
server:
port: 8761 #端口号
spring:
application:
name: eureka-server #服务名称
eureka:
client:
fetch-registry: true #是否拉取服务列表
register-with-eureka: true #是否注册自己(集群需要注册自己和拉取服务)
service-url:
defaultZone: http://localhost2:8762/eureka/,http://localhost3:8763/eureka/
instance:
lease-expiration-duration-in-seconds: 90 #server在等待下一个客户端发送的心跳时间,若在指定时间不能收到客户端心跳,则剔除此实例并且禁止流量
3.4.2.server-2
server:
port: 8762 #端口号
spring:
application:
name: eureka-server #服务名称,server1,2,3都要相同
eureka:
client:
fetch-registry: true #是否拉取服务列表
register-with-eureka: true #是否注册自己(集群需要注册自己和拉取服务)
service-url:
defaultZone: http://localhost1:8761/eureka/,http://localhost3:8763/eureka/
instance:
lease-expiration-duration-in-seconds: 90 #server在等待下一个客户端发送的心跳时间,若在指定时间不能收到客户端心跳,则剔除此实例并且禁止流量
3.4.3.server-3
server:
port: 8763 #端口号
spring:
application:
name: eureka-server #服务名称,server1,2,3都要相同
eureka:
client:
fetch-registry: true #是否拉取服务列表
register-with-eureka: true #是否注册自己(集群需要注册自己和拉取服务)
service-url:
defaultZone: http://localhost1:8761/eureka/,http://localhost2:8762/eureka/
instance:
lease-expiration-duration-in-seconds: 90 #server在等待下一个客户端发送的心跳时间,若在指定时间不能收到客户端心跳,则剔除此实例并且禁止流量
3.4.4.client
server:
port: 8001 #端口号
spring:
application:
name: eureka-client-a # 访问名称
# 将客户端注册到服务端
eureka:
client:
eureka-server:
defaultZone: http://localhost:8761/eureka/ # 注册地址
register-with-eureka: true #是否注册自己
fetch-registry: true #是否拉取服务列表
instance:
instance-id: ${spring.application.name}:${server.port} # 实例id
lease-renewal-interval-in-seconds: 10 # 表示eureka-client发送心跳给server端的频率
3.4.5.访问测试
当无论访问的是8061/8062/8063哪个服务端时都能看到8001这个端口的客户端即为创建集群成功。
3.4.6.server宕机
EurekaServer
的集群里面,没有主机和从机的概念,节点都是对等的,只有集群里面有一 个集群存活,就能保证服务的可用性。 (主机 (写) 从 (读)) 只要有一台存活,服务就能注册和调用
http://thesecretlivesofdata.com/raft/
这个网址生动的表达了一些问题是如何解决的,比如主机和从机之间的数据如何传输,主机是怎么选的,日志复制等。。
分布式数据一致性协议:
zk
是Paxos
eureka
没有分布式数据一致性的机制节点都是相同的
nacos
是raft
在有主从模式的集群中 一般都要遵循这样的协议才可以稳定对外提供服务
Zookeeper
-> Paxos
acos
-> raft
3.5.概念理解
3.5.1.服务的注册
当项目启动时(eureka的客户端),就会向eureka-server
发送自己的元数据(原始数据)(运行的ip,端口port,健康的状态监控等,因为使用的是http/ResuFul
请求风格),eureka-server
会在自己内部保留这些元数据(内存中)。(有一个服务列表,restful
风格,以http
动词的请求方式,完成对url资源的操作)
3.5.2.服务的续约
项目启动成功了,除了向eureka-server
注册自己成功,还会定时的向eureka-server
汇 报自己,心跳,表示自己还活着。(修改一个时间)
3.5.3.服务的主动下线
当项目关闭时,会给eureka-server
报告,说明自己要下机
3.5.4.服务的被动下线
当项目超过了指定时间没有向eureka-server
汇报自己,那么eureka-server
就会认为此 节点死掉了,会把它剔除掉,也不会放流量和请求到此节点了。