什么是Eureka
Eureka是微服务框架中负责完成服务治理的组件,我感觉跟之前学的zookeeper差不多,就是一个服务注册中心(zk+dubbo),简单点说就是一个管理服务的中心,它包含服务注册中心,服务注册和发现机制。
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
架构
Eureka采用了C-S的设计架构,一共有两个端,服务端Eureka Server和客户端Eureka Client
Eureka Server:提供服务注册服务,即作为服务注册功能的服务器,是服务注册的中心,而系统中的其他微服务使用Eureka的客户端来连接到服务端并维持心跳连接,这样开发维护人员都可以从服务端监控微服务是否正常运行,而SpringCloud的其他组件在配置Eureka之后,也就可以在Eureka发现其他服务。
Eureka Client:是一个java客户端,它使与服务的交互变得更加容易。客户端还有一个内置的负载均衡器,可以进行基本的循环负载均衡,在应用启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
什么是服务治理
无数个服务提供者和服务调用者,我们就需要使用服务治理,管理服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
Eureka高可用
微服务RPC远程服务调用最核心的是搭建集群,避免单点故障
集群图解
部署实例图解
上图的异地部署服务注册中心Eureka就实现了高可用和异地容灾。
重点就是修改配置文件,其他的基本一致
7001和7002互相注册
7001的配置文件如下
7002配置修改端口、实例名称和注册中心即可
将客户端注册中心切换为红色字体的集群版配置
Eureka自我保护机制
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式Eureka将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销服务
如果看到如下提示,就表示Eureka进入了保护模式
简单点说就是某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对微服务的信息进行保存
为什么会产生Eureka自我保护机制
为了防止Eureka Client可以正常运行,但是与EurekaServer网络不通的情况下,EurekaServer不会立刻注销服务
什么是保护模式
默认情况下,如果Eureka在一定时间内没有收到某个微服务的心跳,EurekaServer将会注销服务,保护模式是当网络分区发生(延时、卡顿、拥挤)时,微服务和EurekaServer无法通信,以上行为可以说服务本身其实是健康的,不应该注册该服务,短时间内丢失过多客户端(可能发生了网络分区故障),那么这个节点就会进入自我保护模式,Eureka Server 在运行期间会去统计心跳失败比例在 15分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
保护模式就是为了解决健康的服务因网络延时等问题无法联系EurekaServer导致被剔除的问题。
具体搭建
服务端
新建Moudle
下一步
选择初始依赖
.yml
server: port: 10086 spring: application: name: jczb-eureka #微服务名称 eureka: client: service-url: defaultZone: http://localhost:${server.port}/eureka
启动类
@SpringBootApplication @EnableEurekaServer public class JczbEurekaApplication { public static void main(String[] args) { SpringApplication.run(JczbEurekaApplication.class, args); } }
启动成功
Eureka常用配置文件说明 |
服务端
server: port: 10086 #服务启动端口 spring: application: name: leyou-registry #服务名称 eureka: client: service-url: defaultZone: http://localhost:10086/eureka #服务访问地址 register-with-eureka: false #关闭自己的服务,服务提供方启动时,会检测该参数是否为True,true注册给eureka,一般eureka不自己发现自己,所以改为false fetch-registry: false #fetch-registry: false #要不要去注册中心获取其他服务的地址 server: enable-self-preservation: false #关闭自我保护模式 eviction-interval-timer-in-ms: 10000 #定期清理无效衔接
客户端
eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka registry-fetch-interval-seconds: 5 # 拉取服务时间 instance: lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳 lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
小结
生产者与消费者注册过程
- 首先启动Eureka注册中心
- 启用生产者服务
- 生产者服务启动后会将自身信息比如服务地址以别名的方式注册进Eureka
- 消费者需要调用接口时,使用别名去注册中心获取实际的RPC远程调用地址
- 消费者获得调用地址后,底层实际使用HttpClient技术实现远程调用
- 消费者获取地址会缓存在本地JVM内存中,默认每30秒更新一次服务调用地址