面试题答案
一键面试1. 识别过载
可以通过以下几种方式识别服务过载:
- 基于资源指标:
- CPU使用率:通过操作系统或容器监控工具(如Prometheus + Grafana)实时获取CPU使用率。当CPU使用率超过设定阈值(如80%),可认为服务有过载风险。
- 内存使用率:类似地,监控内存使用情况,当内存使用率达到特定比例(如90%),表明可能过载。
- 线程数:对于Java应用,可监控线程池的活跃线程数。若活跃线程数接近或达到线程池最大线程数,可能面临过载。
- 基于请求指标:
- 请求响应时间:统计一段时间内(如1分钟)请求的平均响应时间。若平均响应时间大幅超过正常水平(例如超过平时的2倍),说明服务可能过载。
- 请求队列长度:如果请求队列持续增长且不下降,表明服务处理速度跟不上请求速度,可能处于过载状态。
2. 优先降级的服务
- 非核心业务服务:例如,一些辅助性的功能,如用户个性化推荐(但不影响基本产品浏览和交易)、第三方广告展示等服务。这些服务即使暂时不可用,对核心业务影响较小。
- 资源消耗大且可替代的服务:比如复杂的数据分析计算服务,如果有简单版本的计算方式可满足基本需求,那么复杂计算服务可优先降级。
- 依赖外部不稳定服务的业务:若某个服务依赖于外部接口,而该接口经常不稳定,为避免影响自身系统,可考虑优先降级此服务。
3. 保证核心业务可用性
- 业务梳理与分级:对整个微服务系统的业务进行详细梳理,明确区分核心业务和非核心业务。例如电商系统中,商品展示、下单、支付属于核心业务,而用户积分兑换等属于非核心业务。
- 资源隔离:通过容器化(如Docker)和资源限制(如Kubernetes的资源配额),确保核心业务服务有足够的CPU、内存等资源,不会因其他服务过载而受影响。
- 备用方案:为核心业务服务准备备用方案,如缓存策略。当核心业务服务依赖的其他服务降级时,可从缓存中读取数据以维持基本功能。例如,商品详情页面的数据,可先从Redis缓存读取。
4. 代码实现
以Java Spring Cloud为例,使用Hystrix库实现服务降级:
- 引入依赖:
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.18</version>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
<version>1.5.18</version>
</dependency>
- 定义服务方法和降级方法:
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String exampleMethod() {
// 正常业务逻辑
return "正常响应";
}
public String fallbackMethod() {
// 降级逻辑
return "服务降级,返回兜底数据";
}
}
- 启用Hystrix:在Spring Boot主类上添加
@EnableHystrix
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.netflix.hystrix.contrib.javanica.annotation.EnableHystrix;
@SpringBootApplication
@EnableHystrix
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
5. 配置实现
以Spring Cloud Netflix Hystrix为例,在application.yml
文件中进行配置:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 # 设置超时时间,单位毫秒
circuitBreaker:
requestVolumeThreshold: 10 # 在滚动时间窗内,请求数达到此值,断路器才会开启
errorThresholdPercentage: 50 # 错误率达到此值,断路器开启
sleepWindowInMilliseconds: 5000 # 断路器开启后,休眠时间,单位毫秒
通过这些配置,可以灵活调整服务降级策略的触发条件和行为。同时,结合监控工具(如Hystrix Dashboard)实时监控服务的运行状态,及时调整配置以适应不同的流量场景。