Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。
SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
——上面的文字是在百度百科中搜索得到的结果。
springcloud中文官网:Spring Cloud中文网-官方文档中文版
什么是服务治理:
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册与发现:
Eureka采用了CS的设计结构,Eureka Server服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动时候,会把当前自己服务器的信息 比如服务地址 通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用。RPC远程调用框架核心设计思想:注册中心,因为便用注册中心管理每个服务与服务之间的一个依赖关系。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))。
Eureka系统架构:
代码实战:
创建两个注册中心:EurekaServerMain7001,EurekaServerMain7002
EurekaServerMain7001的application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com # eureka 服务器的实例地址
client:
# false 代表不向服务注册中心注册自己,因为它本身就是服务中心
register-with-eureka: false
# false 代表自己就是服务注册中心,自己的作用就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
# ## 一定要注意这里的地址,这是搭建集群的关键。反过来写,写的是集群中其他Eureka服务器的地址
# defaultZone: http://eureka7002.com:7002/eureka/
## 单机版(配置自己7001),不再和7002相互守望
defaultZone: http://eureka7002.com:7002/eureka/
EurekaServerMain7002的application.yml
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com # eureka 服务器的实例地址
client:
register-with-eureka: false
fetch-registry: false
service-url:
## 一定要注意这里的地址 这是搭建集群的关键
defaultZone: http://eureka7001.com:7001/eureka/
消费者:OrderMain80
OrderMain80的application.yml
server:
port: 80 # 80端口就可以省略了
eureka:
client:
# 表示是否将自己入驻eurekaServer中心,默认为true
register-with-eureka: true
# 是否从eurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true,才能配合rabbitmq
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka/ # 单机版
# 集群版
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
spring:
application:
name: cloud-order-service
生产者:PaymentMain8001,PaymentMain8002
PaymentMain8001的application.yml
eureka:
client:
# 注册进 Eureka 的服务中心
register-with-eureka: true
# 检索 服务中心 的其它服务
fetch-registry: true
service-url:
# 设置与 Eureka Server 交互的地址
# defaultZone: http://localhost:7001/eureka/ # 单机版
# 集群版
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
instance: #重点,和client平行
instance-id: payment8001 # 每个提供者的id不同,显示的不再是默认的项目名
prefer-ip-address: true # 可以显示ip地址
PaymentMain8002的application.yml
eureka:
client:
# 注册进 Eureka 的服务中心
register-with-eureka: true
# 检索 服务中心 的其它服务
fetch-registry: true
service-url:
# 设置与 Eureka Server 交互的地址
# defaultZone: http://localhost:7001/eureka/ # 单机版
# 集群版
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
instance: #重点,和client平行
instance-id: payment8002 # 每个提供者的id不同,显示的不再是默认的项目名
prefer-ip-address: true # 可以显示ip地址
Eureka 集群7001,7002
1先启动eureka注册中心
2启动服务提供者payment支付服务
3支付服务启动后会把自身信息化 服务以别名方式注册进eureka
4消费者order服务在要调用接囗时,使用服务别名去注册中心取实际的RPC远程调用地址
5消费者获得调用地址后,底层实际是利用HttpClient技术实现远程调用
6消费者获得服务地址后会存jvm内存中,默认每间隔30s更新一次服务调用地址
问题:微服务RPC远程服务调用最核心的是什么:
高可用,如果你的注册中心只有一个,它出故障了那就会导致整个为服务环境不可用,所以要搭建Eureka注册中心集群,实现负载均衡+故障容错
Eureka 集群的原理:相互注册,互相守望。每台Eureka服务器都有集群里其他Eureka服务器地址的信息
互相注册,相互守望:eureka注册集群-->如果有三台注册中心:1注册2,3;2注册1,3;3注册1,2;
Eureka 自我保护机制
什么是自我保护模式?
默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时、卡顿、拥挤)时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了,因为微服务本身其实是健康的,此时本不应该注销这个微服务。
Eureka通过"自我保护模式"来解决这个问题—当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。
自我保护机制:默认情况下Eureka CIient定时向Eureka Server端发送心跳包。
如果Eureka在server端在一定时间内(默认90秒)没有收到Eureka Client发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间(90秒内)内丢失了大量的服务实例心跳,这时Eureka Server会开启自我保护机制,不会剔除该服务(该现象可能出现如果网络不通但是Eureka Client出现宕机,此时如果别的注册中心如果一定时间内没有收到心跳会将剔除该服务这样就出现了严重失误,因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的
在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注册任何服务实例。
自我保护模式是一种应对网络异常的安全保护措施。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
git代码: