面试题答案
一键面试构建Eureka高可用集群
- 多实例部署:
- 在不同的服务器上部署多个Eureka Server实例。例如,假设有三个服务器
server1
、server2
、server3
,分别在这些服务器上部署Eureka Server。 - 每个实例需要相互注册,形成一个集群。在
application.yml
配置文件中进行如下配置:
eureka: instance: hostname: server1 # 这里假设在server1上,实际根据服务器主机名修改 client: register - with - eureka: true fetch - registry: true service - url: defaultZone: http://server2:8761/eureka/,http://server3:8761/eureka/ # 注册到其他实例的地址
- 在
server2
和server3
上类似配置,将hostname
分别改为server2
和server3
,defaultZone
中地址也相应调整。
- 在不同的服务器上部署多个Eureka Server实例。例如,假设有三个服务器
- 负载均衡:
- 可以使用硬件负载均衡器(如F5)或软件负载均衡器(如Nginx、HAProxy)对多个Eureka Server实例进行负载均衡。以Nginx为例,配置如下:
upstream eureka_cluster { server server1:8761; server server2:8761; server server3:8761; } server { listen 8761; location / { proxy_pass http://eureka_cluster; } }
- 这样客户端只需要访问负载均衡器的地址(如
http://nginx_ip:8761/eureka/
),负载均衡器会将请求分发到不同的Eureka Server实例上。
配置优化措施
- 心跳间隔(Heartbeat Interval):
- 默认值:Eureka客户端向Eureka Server发送心跳的默认间隔是30秒。在高并发且规模较大的微服务环境下,如果心跳间隔过长,可能导致Eureka Server不能及时感知到微服务实例的状态变化。
- 调整方式:可以在Eureka客户端的
application.yml
中通过eureka.instance.lease - renewal - interval - in - seconds
参数调整心跳间隔。例如,将心跳间隔调整为10秒:
eureka: instance: lease - renewal - interval - in - seconds: 10
- 适用场景:适用于对实例状态变化感知要求较高,网络环境相对稳定的场景。较短的心跳间隔能使Eureka Server更快得知实例是否存活,但会增加网络流量。
- 续约时间(Lease Expiration Duration):
- 默认值:Eureka Server等待Eureka客户端续约的默认时间是90秒。如果续约时间过短,可能导致一些正常运行但因网络波动等原因暂时未能及时续约的实例被误剔除;如果过长,则可能导致已失效的实例长时间保留在注册中心。
- 调整方式:在Eureka客户端的
application.yml
中通过eureka.instance.lease - expiration - duration - in - seconds
参数调整续约时间。例如,将续约时间调整为60秒:
eureka: instance: lease - expiration - duration - in - seconds: 60
- 适用场景:对于网络相对稳定,希望及时剔除失效实例的场景,可以适当缩短续约时间;对于网络不太稳定的场景,适当延长续约时间可避免误剔除实例。
- 缓存配置:
- Eureka Server缓存:Eureka Server默认会缓存注册表信息。可以通过
eureka.server.response - cache - update - interval - ms
参数调整缓存更新间隔,默认值是30000(30秒)。例如,如果希望更快地更新缓存,可以将其设置为10000(10秒):
eureka: server: response - cache - update - interval - ms: 10000
- Eureka Client缓存:Eureka客户端也会缓存从Eureka Server获取的注册表信息。可以通过
eureka.client.cache - refresh - interval - seconds
参数调整客户端缓存刷新间隔,默认值是30秒。例如,将其设置为20秒:
eureka: client: cache - refresh - interval - seconds: 20
- Eureka Server缓存:Eureka Server默认会缓存注册表信息。可以通过
- 禁用自我保护模式:
- 默认情况:Eureka Server默认开启自我保护模式,该模式下,当Eureka Server在一定时间内没有接收到足够的心跳时,不会剔除实例,以防止因网络分区等原因导致正常实例被误删。
- 调整方式:在高并发且网络相对稳定的环境下,如果希望及时剔除失效实例,可以在Eureka Server的
application.yml
中禁用自我保护模式:
eureka: server: enable - self - preservation: false
- 注意事项:禁用自我保护模式可能会在网络异常时误剔除正常实例,使用时需谨慎评估网络环境。