面试题答案
一键面试设计思路
- 选择合适的负载均衡策略:
- Feign默认使用Ribbon进行负载均衡,Ribbon提供了多种负载均衡策略,如轮询(RoundRobinRule)、随机(RandomRule)、根据响应时间加权(WeightedResponseTimeRule)等。在高并发场景下,可根据实际业务特点选择。例如,如果服务实例性能差异不大,轮询策略能较均匀地分配请求;若各实例处理能力不同,根据响应时间加权的策略可能更合适,它会将更多请求分配给响应快的实例。
- 自定义负载均衡策略:如果现有的负载均衡策略都无法满足业务需求,可以通过继承AbstractLoadBalancerRule类来自定义负载均衡逻辑,比如结合业务指标(如实例当前的请求队列长度等)进行请求分配。
- Hystrix熔断机制与负载均衡的协同:
- Hystrix熔断机制旨在当某个服务调用出现故障(如超时、异常等)达到一定阈值时,熔断该服务调用,避免故障扩散。在与Feign结合时,要确保负载均衡策略不会影响熔断机制的正常运作。例如,当某个实例被熔断后,负载均衡策略应能将请求合理分配到其他健康实例上,避免继续向已熔断的实例发送请求。
- 监控与动态调整:通过监控系统(如Spring Boot Actuator结合一些可视化工具)实时获取服务实例的健康状态、调用成功率等指标,基于这些指标动态调整负载均衡策略和Hystrix的熔断阈值等参数,以适应高并发场景下系统的动态变化。
关键配置
- 配置负载均衡策略:
- 在Spring Boot项目的
application.yml
文件中配置Ribbon的负载均衡策略,例如使用根据响应时间加权的策略:
service-name: # 这里的service - name是被调用的微服务名称 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
- 如果是自定义负载均衡策略,先定义策略类:
然后在import com.netflix.loadbalancer.AbstractLoadBalancerRule; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.Server; public class CustomLoadBalancerRule extends AbstractLoadBalancerRule { @Override public void initWithNiwsConfig(IClientConfig clientConfig) { // 初始化配置 } @Override public Server choose(Object key) { ILoadBalancer lb = getLoadBalancer(); // 自定义选择Server的逻辑 Server server = null; while (server == null) { // 例如结合业务指标选择实例 } return server; } }
application.yml
中配置:service - name: ribbon: NFLoadBalancerRuleClassName: com.example.CustomLoadBalancerRule
- 在Spring Boot项目的
- Hystrix配置:
- 在
application.yml
中配置Hystrix的熔断相关参数,例如:
hystrix: command: default: circuitBreaker: enabled: true # 开启熔断 requestVolumeThreshold: 20 # 在滚动时间窗内,请求数量达到20个才会开启熔断检查 errorThresholdPercentage: 50 # 错误率达到50%时,开启熔断 sleepWindowInMilliseconds: 5000 # 熔断后休眠5000毫秒,然后尝试半开状态
- 在Feign客户端配置中开启Hystrix支持:
feign: hystrix: enabled: true
- 还可以为Feign客户端定义降级处理类,以在服务熔断或调用失败时提供兜底逻辑:
并在Feign客户端接口定义中指定降级类:import org.springframework.stereotype.Component; @Component public class FeignClientFallback implements YourFeignClient { @Override public String yourMethod() { // 降级逻辑,例如返回友好提示信息 return "Service is unavailable"; } }
import org.springframework.cloud.openfeign.FeignClient; @FeignClient(name = "service - name", fallback = FeignClientFallback.class) public interface YourFeignClient { String yourMethod(); }
- 在