系列文章目录
- 深入微服务-SpringBoot启动原理
- 深入微服务-服务调用组件SpringCloud Feign
- 深入微服务-服务注册与发现 SpringCloud Eureka之基础
- 深入微服务-服务注册与发现 SpringCloud Eureka之高可用以及核心原理
文章目录
前言
本系列带着大家深入微服务 Spring体系的各个框架的基本使用以及底层原理。上一篇文章介绍了SpringCloud Eureka基本使用以及搭建,本节将带着大家掌握微服务服务注册与发现框架 Spring Eureka 的高可用以及核心原理
Eureka 之高可用概念
- 在微服务环境,一旦注册中心发生故障或短时间通信断开,可能导致整个微服务无法访问,所以注册中心需要实现高可用
Eureka、Zookeeper作为注册中心的区别
首先了解下CAP理论
C - consistency 强一致性
A - availability 可用性
P - partition tolerance 分区容错性
CAP理论:一个分布式系统,不可能同时做到这三点(强一致性、可用性、分区容错性)
CP - 满足一致性,分区容错性,强一致性
AP - 满足可用性,分区容错性,最终一致性
- Eureka 保证最终一致性(AP),Eureka 服务节点都是平等的,某个服务节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务
- 当Eureka 客户端注册服务失败会自动切换其他服务节点,保证可用性,Eureka不能保证强一致性(即查询到的信息可能不是最新的服务信息),只能保证最终一致性
- Zookeeper保证强一致性(CP),当Zookeeper的主节点leader发生宕机,进行leader选举的时候会进行投票选举(Zab算法),选举期间会发生服务(注册中心)不可用的情况,直到选举成功之后才能保证正常使用,因此Zookeepr能保证强一致性(各个节点的数据是最新的)。
Eureka 高可用环境搭建
eureka Server 相互注册,服务名称一致
1)eureka Server1
server:
port: 8007 # server 端口号
spring:
application:
name: eureka-server
eureka:
instance:
hostname: 127.0.0.1 # eureka 注册的主机地址
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8008/eureka/
register-with-eureka: true # 指定是否从注册中心获取服务
fetch-registry: true # 指定是否注册到注册中心
2)eureka Server2
server:
port: 8008 # server 端口号
spring:
application:
name: eureka-server
eureka:
instance:
hostname: 127.0.0.1 # eureka 注册的主机地址
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8007/eureka/
register-with-eureka: true # 指定是否从注册中心获取服务
fetch-registry: true # 指定是否注册到注册中心
客户端集成Eureka集群
server:
port: 8001
spring:
application:
name: provider-server
eureka:
client:
service-url:
defaultZone: http://localhost:8007/eureka,http://localhost:8008/eureka ##填写注册中心地址
register-with-eureka: true # 指定是否从注册中心获取服务
fetch-registry: true #指定是否注册到注册中心
Eureka 集群启动成功可看到web界面显示的信息
Eureka核心原理
客户端获取服务
客户端启动服务的时候,会发送一个rest请求到注册中心获取服务信息,缓存到客户端本地,每隔30s会重新获取,可通过eureka.client.registry
进行调优
客户端服务下线
当客户端正常下线的时候会发送一个rest请求到注册中心,注册中心会把服务的状态改为DOWN,也会推送服务下线的UDP事件到各个服务
服务端失效剔除
微服务环境中某个Eureka下线因网络故障等原因短时间内不可用,又没有收到服务下线通知时,Eureka 服务端 注册中心启动的时候会初始化一个定时任务,每隔60s剔除续约超时
服务端自我保护/心跳续约
Eureka 客户端定时向Eureka Server服务端发送心跳(renew),当服务端长时间(60s)没有收到心跳续约时间会进行失效剔除
核心配置
服务端核心配置
server:
port: 8007
##定义服务名称
spring:
application:
name: eureka-server
eureka:
instance:
hostname: 127.0.0.1 #注册中心ip地址
client:
serviceUrl:
##注册地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
register-with-eureka: false # 指定是否从注册中心获取服务
fetch-registry: false # 指定是否注册到注册中心
server:
# 是否开启自我保护机制
enable-self-preservation: false
# 剔除失效服务间隔
eviction-interval-timer-in-ms: 2000
客户端核心配置
server:
port: 8001
spring:
application:
name: provider-server
eureka:
client:
service-url:
defaultZone: http://localhost:8007/eureka
register-with-eureka: true # 指定是否从注册中心获取服务
fetch-registry: true # 指定是否注册到注册中心
#eureka服务器获取注册表信息的频率
registry-fetch-interval-seconds: 30
# 心跳检测检测与续约时间
instance:
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒,默认为30s
lease-renewal-interval-in-seconds: 30
#Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,默认为90s,超过则剔除
lease-expiration-duration-in-seconds: 90