面试题答案
一键面试搭建Eureka Server集群实现高可用性
- 多实例部署:在不同的服务器节点上部署多个Eureka Server实例。例如,假设有三个服务器节点A、B、C,分别在每个节点上部署Eureka Server。
- 相互注册:每个Eureka Server实例都需要向其他实例进行注册。在配置文件中,通过
eureka.client.service-url.defaultZone
属性指定其他Eureka Server的地址。例如,在节点A的配置文件中:
eureka:
client:
service-url:
defaultZone: http://B的地址/eureka/,http://C的地址/eureka/
同样,在节点B和C的配置文件中也需要类似配置,将defaultZone指向其他节点的Eureka Server地址。 3. 负载均衡:可以在前端使用负载均衡器(如Nginx),将客户端请求均匀分配到各个Eureka Server实例上。Nginx配置示例如下:
upstream eureka_servers {
server A的地址;
server B的地址;
server C的地址;
}
server {
listen 80;
location /eureka/ {
proxy_pass http://eureka_servers;
}
}
Eureka自我保护机制工作原理
- 原理:Eureka Server在运行期间,会统计心跳失败的比例,如果在15分钟内超过85%的客户端心跳没有收到,Eureka Server会进入自我保护模式。在该模式下,Eureka Server不再从注册表中移除因为长时间没有收到心跳而应该过期的服务实例,而是会保留这些实例信息,即使这些实例可能已经失效。
实际应用中的利弊
- 优点:
- 防止误删:在网络分区等异常情况下,避免因为部分客户端心跳无法正常上报,而导致Eureka Server误将这些服务实例从注册表中删除,保证了服务的可用性。例如,在网络抖动期间,服务实例本身是正常运行的,但由于网络问题心跳无法及时到达Eureka Server,如果没有自我保护机制,这些实例可能会被误删,导致客户端无法访问服务。
- 提高系统稳定性:在大规模微服务环境中,自我保护机制有助于维持整个服务注册与发现系统的稳定性,防止连锁反应导致更多服务不可用。
- 缺点:
- 可能包含无效实例:进入自我保护模式后,注册表中可能会保留一些实际上已经失效的服务实例,这可能导致客户端调用到无效的实例,从而引发业务异常。例如,某个服务实例所在服务器硬件故障,但由于自我保护机制,该实例仍然在注册表中,客户端调用时可能会出现连接失败等问题。
合理配置以平衡利弊
- 调整自我保护阈值:可以通过
eureka.server.renewal-percent-threshold
属性来调整自我保护机制触发的阈值,默认是0.85。如果对服务实例的健康检查要求较高,可适当降低该值,如设置为0.8,这样在心跳失败比例达到80%时就触发自我保护机制;如果希望更保守地保护服务实例,可适当提高该值。 - 心跳检测优化:通过合理设置
eureka.instance.lease-renewal-interval-in-seconds
(服务实例向Eureka Server发送心跳的间隔时间,默认30秒)和eureka.instance.lease-expiration-duration-in-seconds
(服务实例在Eureka Server中没有收到心跳后,等待多长时间将该实例从注册表中删除,默认90秒),使Eureka Server能更准确地判断服务实例的健康状态。例如,在网络状况较好的环境中,可以适当缩短心跳间隔时间和过期时间,以便更快发现失效实例;在网络不稳定的环境中,适当延长这些时间,避免误判。 - 结合其他健康检查机制:除了依赖Eureka自身的心跳检测,结合第三方健康检查工具(如Spring Boot Actuator),对服务实例进行更全面的健康检查。当服务实例自身出现问题但心跳仍能正常发送时,第三方健康检查机制可以发现并通知Eureka Server将该实例从注册表中移除。