面试题答案
一键面试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获取到服务实例列表后,会按照顺序依次选择实例进行调用。例如,假设有三个服务实例
instance1
、instance2
、instance3
,第一次调用会选择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
会根据实例的响应时间来动态调整权重,响应时间越短,权重越高,被选中的概率越大。