MST

星途 面试题库

面试题:微服务架构中Eureka的高可用部署与负载均衡策略

在实际生产环境中,如何实现Eureka Server的高可用部署?当有多个Eureka Server时,Eureka Client如何进行服务发现?另外,Eureka自身采用了哪些负载均衡策略来保证客户端能获取到合适的服务实例?
24.4万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

1. 实现Eureka Server高可用部署

  • 相互注册:多个Eureka Server之间相互注册,形成对等网络。例如,假设有两个Eureka Server实例,分别部署在不同的服务器上,端口分别为8761和8762。在配置文件中,为每个实例配置对方的地址。对于运行在8761端口的实例,其配置文件可以如下:
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8762/eureka/

对于运行在8762端口的实例,其配置文件为:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

这样它们就可以互相发现并同步服务注册信息。

  • 负载均衡器:在多个Eureka Server前面添加负载均衡器,如Nginx、HAProxy等。以Nginx为例,在Nginx配置文件中添加如下内容:
upstream eureka_servers {
    server eureka1.example.com:8761;
    server eureka2.example.com:8762;
}

server {
    listen 80;
    location / {
        proxy_pass http://eureka_servers;
    }
}

Eureka Client可以通过负载均衡器的地址(如http://lb.example.com/eureka/)来注册和获取服务信息,负载均衡器会将请求均匀分配到各个Eureka Server实例上。

2. Eureka Client进行服务发现

  • 配置defaultZone:Eureka Client在配置文件中指定Eureka Server的地址,即defaultZone。例如:
eureka:
  client:
    service-url:
      defaultZone: http://lb.example.com/eureka/

这里http://lb.example.com/eureka/是负载均衡器的地址,客户端通过该地址与Eureka Server集群进行通信。

  • 本地缓存:Eureka Client从Eureka Server获取服务注册信息后,会在本地缓存这些信息。即使Eureka Server集群出现短暂故障,客户端仍然可以使用本地缓存的信息进行服务调用,保证一定的可用性。同时,客户端会定期(默认30秒)从Eureka Server更新缓存中的服务注册信息,以确保获取到最新的服务实例列表。

3. Eureka负载均衡策略

  • 轮询:默认情况下,Eureka采用轮询策略进行负载均衡。当Eureka Client从Eureka Server获取到服务实例列表后,会按照顺序依次选择实例进行调用。例如,假设有三个服务实例instance1instance2instance3,第一次调用会选择instance1,第二次调用会选择instance2,第三次调用会选择instance3,第四次调用又回到instance1,以此类推。
  • 随机:也可以通过配置使用随机策略。在Spring Cloud应用中,可以通过配置ribbon相关属性来实现。例如,在配置文件中添加:
service-name:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

这里service-name是具体的服务名称,通过上述配置,该服务在进行负载均衡时会随机选择一个可用的实例。

  • 权重:可以根据服务实例的性能、资源等因素设置权重。性能好、资源充足的实例权重可以设置得高一些,这样被选中的概率就更大。在Spring Cloud应用中,可以通过配置ribbon相关属性来实现。例如:
service-name:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

WeightedResponseTimeRule会根据实例的响应时间来动态调整权重,响应时间越短,权重越高,被选中的概率越大。