面试题答案
一键面试异常分类
- 业务异常:针对特定业务规则不满足的情况,例如用户输入不符合要求、业务流程出现冲突等。这类异常应具有明确的业务含义和错误码,方便下游服务或客户端理解。
- 系统异常:由于系统层面问题导致的异常,如网络故障、数据库连接失败、资源不足等。这类异常通常由底层框架或运行时环境抛出。
异常处理设计
- 微服务内部异常处理
- 业务异常:在业务逻辑层捕获并封装为统一的业务异常对象,包含错误码、错误信息以及可能的上下文数据。例如,在用户注册微服务中,如果用户名已存在,抛出带有特定错误码和提示信息的业务异常。
- 系统异常:在全局异常处理器中捕获,将其转换为统一的系统异常格式,同样包含错误码和相关信息。同时,记录详细的异常堆栈信息用于故障排查。例如,若数据库查询时出现连接超时,捕获并转换为系统异常。
- 异常跨服务传递
- 使用统一的异常格式:定义一个通用的异常数据结构,在所有微服务间传递。这个结构至少包含错误码、错误信息、异常类型(业务异常或系统异常)。例如,可以使用 JSON 格式来定义这个结构。
- HTTP 状态码:利用 HTTP 状态码来表示异常的严重程度和类型。例如,400 系列表示客户端错误(如业务异常中用户输入错误),500 系列表示服务器端错误(如系统异常)。在微服务间通过 HTTP 调用时,根据异常类型设置相应的状态码。
- 统一日志记录
- 日志框架:选择一个成熟的日志框架,如 Log4j 或 SLF4J,在所有微服务中统一使用。
- 记录内容:在捕获异常时,记录异常发生的时间、所在微服务名称、异常类型、错误码、错误信息以及完整的堆栈跟踪信息。例如,日志格式可以为:
[时间] [微服务名称] [异常类型] [错误码] - [错误信息] [堆栈跟踪]
。 - 日志级别:根据异常的严重程度设置不同的日志级别。业务异常可以设置为 INFO 级别,系统异常设置为 ERROR 级别。
- 对业务流程的影响
- 重试机制:对于一些可恢复的系统异常(如短暂的网络故障),可以在微服务内部实现重试机制。例如,设置重试次数和重试间隔,在失败后自动重试一定次数。
- 熔断机制:当某个微服务频繁出现异常,可能导致整个业务流程不可用。引入熔断机制,当异常达到一定阈值,暂时停止对该微服务的调用,并返回默认值或错误提示给上游服务,防止级联故障。
- 补偿机制:对于已经执行部分业务流程但因异常中断的情况,设计补偿机制。例如,在一个涉及订单创建和库存扣减的业务流程中,如果库存扣减成功但订单创建失败,需要有补偿操作将库存回滚。
异常处理的监控与报警
- 监控系统:使用监控工具(如 Prometheus + Grafana)来收集和分析异常相关指标,如异常发生率、不同类型异常的分布等。
- 报警机制:设定阈值,当异常指标超过阈值时,通过邮件、短信或即时通讯工具发送报警信息,通知相关开发人员及时处理。