面试题答案
一键面试负载均衡策略优化
- 选择合适的负载均衡算法:
- Ribbon 是 Spring Cloud 中常用的负载均衡器,默认采用轮询(Round Robin)策略。对于一些读多写少且对性能要求较高的服务调用场景,可以考虑使用随机(Random)策略,在服务实例较多时,它能够更均匀地分摊请求。例如,在一些提供静态数据查询的微服务调用中,随机策略可能会带来更好的效果。
- 加权轮询(Weighted Round Robin)策略适用于不同实例性能不同的情况。如果某些微服务实例部署在性能更强的服务器上,可以给这些实例分配更高的权重,让它们承担更多的请求。比如在图片处理微服务中,配置较高的实例可以处理更复杂的图片格式转换,分配较高权重。
- 自定义负载均衡策略:
- 当默认的负载均衡策略不能满足业务需求时,可以自定义负载均衡策略。通过实现
IRule
接口,在choose
方法中根据业务逻辑,如根据请求的来源 IP、请求的时间段等因素,选择合适的服务实例。例如,对于来自特定地区的请求,优先选择该地区部署的微服务实例,以减少网络传输距离。
- 当默认的负载均衡策略不能满足业务需求时,可以自定义负载均衡策略。通过实现
连接池配置
- 启用 Feign 连接池:
- 默认情况下,Feign 使用的是 JDK 原生的
HttpURLConnection
,不支持连接池。为了提高性能,需要引入 Apache HttpClient 或 OkHttp 作为 HTTP 客户端,并启用连接池。以 Apache HttpClient 为例,首先在pom.xml
中添加依赖:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
- 然后在配置文件(如
application.yml
)中启用 Apache HttpClient 作为 Feign 的 HTTP 客户端:
feign: httpclient: enabled: true
- 默认情况下,Feign 使用的是 JDK 原生的
- 配置连接池参数:
maxTotal
:设置连接池中最大的连接数。例如,根据系统预估的并发请求数,设置maxTotal
为 200,以确保在高并发情况下有足够的连接可用。defaultMaxPerRoute
:每个路由(即每个服务实例)允许的最大连接数。可以设置为 50,保证每个服务实例不会因为连接数过多而导致性能下降。connectionTimeout
:连接建立的超时时间,设置为 5000 毫秒(5 秒),避免长时间等待无效连接。socketTimeout
:数据传输的超时时间,设置为 10000 毫秒(10 秒),防止因网络波动导致数据传输过长时间无响应。
熔断机制
- 引入 Hystrix 或 Resilience4j:
- Hystrix 是 Netflix 开源的容错库,在 Spring Cloud 中可以方便地集成。在
pom.xml
中添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring - cloud - starter - netflix - hystrix</artifactId> </dependency>
- 然后在启动类上添加
@EnableHystrix
注解开启 Hystrix 功能。 - Resilience4j 是新一代的容错框架,具有轻量级、可定制性强等优点。添加依赖:
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j - feign</artifactId> </dependency>
- 在配置文件中启用 Resilience4j 相关配置。
- Hystrix 是 Netflix 开源的容错库,在 Spring Cloud 中可以方便地集成。在
- 配置熔断参数:
- Hystrix:
circuitBreaker.requestVolumeThreshold
:在滑动窗口(默认 10 秒)内,请求数量达到该阈值,熔断机制才会生效。例如设置为 20,意味着在 10 秒内至少有 20 个请求,熔断机制才会根据失败率等情况判断是否熔断。circuitBreaker.errorThresholdPercentage
:失败请求的百分比阈值,当失败请求占总请求的比例超过该值时,触发熔断。如设置为 50,表示失败率达到 50% 时熔断。circuitBreaker.sleepWindowInMilliseconds
:熔断后进入半开状态的时间窗口,设置为 5000 毫秒(5 秒),在此期间会尝试少量请求来判断服务是否恢复。
- Resilience4j:
failureRateThreshold
:与 Hystrix 的errorThresholdPercentage
类似,设置失败率阈值,如 50,表示失败率达到 50% 触发熔断。minimumNumberOfCalls
:与 Hystrix 的requestVolumeThreshold
类似,设置最小请求数,如 10,在统计失败率时,只有请求数达到这个值才会触发熔断判断。slidingWindowSize
:滑动窗口大小,设置为 20,表示统计最近 20 个请求的失败率来判断是否熔断。waitDurationInOpenState
:熔断后保持打开状态的时间,设置为 10 秒,之后进入半开状态。
- Hystrix:
通过以上负载均衡策略优化、连接池配置以及熔断机制的合理设置,可以在保证可维护性的前提下,有效优化 Feign 客户端的调用性能,降低网络延迟。