下面是详细讲解“深入理解SpringCloud之Eureka注册过程分析”的完整攻略:
1. Eureka注册中心简介
Eureka是Netflix开源的一款基于REST的服务注册和发现组件,它可以帮助我们实现微服务治理中的服务注册、服务发现、负载均衡等功能。
Eureka的核心组件包括:Eureka Server和Eureka Client。Eureka Server是服务注册中心,它负责记录注册进它的微服务实例,并提供查询服务。而Eureka Client是微服务实例,它会向Eureka Server注册自己的服务信息,并从中获取其他实例的信息。
下面我们来详细分析一下Eureka注册过程。
2. Eureka注册过程分析
Eureka注册过程可以分为三个步骤:微服务实例注册、服务实例信息缓存、微服务实例自我保护。下面我们来逐个分析。
2.1 微服务实例注册
当一个微服务启动后,它会向Eureka Server发送一个REST请求,进行自我注册。Eureka Server接收到请求后,会将微服务实例的信息注册到自己的服务注册表中。在注册过程中,微服务实例需要提供以下信息:
- 服务实例ID:每个微服务实例都有一个唯一的服务实例ID,通常由主机名+端口号组成。
- 服务名:用于描述微服务实例的名称。
- IP地址和端口号:微服务实例的网络地址。
- 健康检查地址:用于检查微服务实例的健康状况。
- 其他元数据:为了方便扩展,可以自定义其他元数据。
下面是一个示例REST请求的JSON格式:
{
"instance": {
"instanceId": "service-1:8080",
"app": "service-1",
"ipAddr": "192.168.0.1",
"port": {
"$": 8080,
"@enabled": true
},
"healthCheckUrl": "http://192.168.0.1:8080/health",
"statusPageUrl": "http://192.168.0.1:8080/status",
"homePageUrl": "http://192.168.0.1:8080/"
}
}
2.2 服务实例信息缓存
Eureka Server会将接收到的微服务实例信息存储到自己的服务注册表中,并将注册表信息缓存到自己的本地内存中。由于服务注册表的信息比较大,Eureka Server会把信息分为多个区域进行缓存,每个区域有自己的副本。也就是说,Eureka Server需要知道微服务实例所属的区域,这个信息通常由微服务实例的部署环境决定。例如,在AWS上部署的微服务可以指定自己所属的AWS区域。
在缓存服务实例信息时,Eureka Server会记录每个服务实例的心跳时间和最后更新时间。如果一个服务实例在心跳时间之内没有发送心跳信息,Eureka Server就会将该服务实例标记为不可用。同时,如果一个服务实例的最后更新时间比较旧,Eureka Server也会将其视为不可用。
2.3 微服务实例自我保护
微服务实例自我保护是Eureka的一个非常重要的特性。当Eureka Server发现某个微服务实例在一定时间内没有发送心跳信息时,它会将该微服务实例从服务注册表中剔除。这时如果有其他服务想要调用该微服务,会出现调用不到的现象。
为了避免这种情况,Eureka引入了自我保护机制。当Eureka Server发现某个微服务实例在心跳时间内没有发送心跳信息时,并不会立即将其从注册表中剔除。而是会先将该微服务实例的信息加入到一个叫做Self-Preservation、Info-Renewal、Replication三项指标的保护列表中。保护列表中的微服务实例信息不会被自动剔除,而是在服务注册表中标记为Lower-Remote-Status,并不断尝试去重新恢复与服务实例的联系。
3. 示例说明
为了更好地理解Eureka注册过程,这里引入两个示例:
3.1 微服务实例注册示例
假设我们部署了一个微服务实例,它的IP地址是192.168.0.1,端口号是8080,服务名是service-1。我们可以通过以下REST请求将它注册到Eureka Server:
curl -X POST \
http://eureka-server:8761/eureka/apps/service-1 \
-H 'Content-Type: application/json' \
-d '{
"instance": {
"instanceId": "service-1:8080",
"app": "service-1",
"ipAddr": "192.168.0.1",
"port": {
"$": 8080,
"@enabled": true
},
"healthCheckUrl": "http://192.168.0.1:8080/health",
"statusPageUrl": "http://192.168.0.1:8080/status",
"homePageUrl": "http://192.168.0.1:8080/"
}
}'
其中,eureka-server是Eureka Server的地址,8761是Eureka Server的默认端口号。
3.2 微服务实例自我保护示例
假设我们部署了一个微服务实例,它没有发送心跳信息,且已经超过了心跳时间。此时,Eureka Server会将该微服务实例从注册表中剔除。我们可以通过以下设置来禁用自我保护机制,使这个微服务实例被剔除:
eureka.server.enable-self-preservation=false # 禁用自我保护机制
eureka.server.eviction-interval-timer-in-ms=30000 # 每隔30s剔除一次不可用的微服务实例
在这种情况下,如果有其他服务想要调用该微服务,会出现调用不到的情况。
如果要启用自我保护机制,可以将上述配置改为以下内容:
eureka.server.enable-self-preservation=true # 启用自我保护机制
eureka.server.eviction-interval-timer-in-ms=60000 # 每隔60s剔除一次不可用的微服务实例
eureka.server.heartbeat-expiration-in-ms=30000 # 设置心跳时间为30s
eureka.server.renewal-percent-threshold=0.85 # 设置服务实例续约百分比阈值为85%
在这种情况下,当Eureka Server发现某个微服务实例在心跳时间内没有发送心跳信息时,它会将该微服务实例加入到自我保护列表中,而不是将其立即剔除。当微服务实例恢复正常后,Eureka会将其从保护列表中移除,并将其信息重新加入到注册表中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解SpringCloud之Eureka注册过程分析 - Python技术站