1. 捕获panic
- 技术手段:在Go语言中,使用
recover
函数在每个微服务的关键入口(如HTTP handler函数、RPC服务方法等)捕获panic。例如:
func myHandler(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
// 记录错误日志
log.Printf("Panic occurred: %v", err)
// 返回合适的HTTP错误码给客户端
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
}
}()
// 正常业务逻辑
}
- 原理:
recover
函数只能在defer
函数中生效,它可以捕获当前goroutine中发生的panic,并恢复程序的正常执行流程,防止panic继续向上传播。
2. 错误日志记录
- 技术手段:使用Go标准库的
log
包或第三方日志库(如zap
)记录详细的错误信息。记录内容应包括发生panic的时间、微服务名称、具体错误信息以及调用栈。例如使用zap
:
func myHandler(w http.ResponseWriter, r *http.Request) {
logger, _ := zap.NewProduction()
defer func() {
if err := recover(); err != nil {
stack := make([]byte, 4096)
length := runtime.Stack(stack, false)
logger.Error("Panic occurred",
zap.String("service_name", "my_service"),
zap.String("error", fmt.Sprintf("%v", err)),
zap.String("stack_trace", string(stack[:length])))
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
}
}()
// 正常业务逻辑
}
- 原理:详细的错误日志有助于快速定位问题根源,便于开发和运维人员进行故障排查。
3. 熔断机制
- 技术手段:引入熔断机制,如使用开源库
circuitbreaker
。当某个微服务频繁发生panic导致调用失败次数超过一定阈值时,熔断该微服务的调用。例如:
// 创建断路器
cb := circuitbreaker.NewCircuitBreaker(circuitbreaker.Settings{
FailureThreshold: 3, // 连续失败3次熔断
RecoveryTimeout: 10 * time.Second, // 10秒后尝试恢复
})
func callRemoteService() error {
err := cb.Execute(func() error {
// 实际调用远程微服务的代码
return nil
})
return err
}
- 原理:避免因某个微服务的不稳定导致整个系统雪崩,当微服务出现问题时,快速切断对它的调用,防止大量无效请求堆积,影响其他正常微服务。
4. 事务管理(保证数据一致性)
- 技术手段:如果微服务涉及数据操作,使用分布式事务框架(如
TCC
- Try - Confirm - Cancel或Saga
模式)。以Saga
模式为例,将一个大事务拆分成多个本地事务,每个本地事务对应微服务的一个操作。如果某个微服务发生panic,根据之前已执行的操作执行补偿操作。例如:
// 假设微服务1操作数据库
func service1() error {
// 数据库操作
return nil
}
// 微服务1的补偿操作
func service1Compensate() error {
// 回滚数据库操作
return nil
}
// 假设微服务2操作数据库
func service2() error {
// 数据库操作
return nil
}
// 微服务2的补偿操作
func service2Compensate() error {
// 回滚数据库操作
return nil
}
func saga() error {
if err := service1(); err != nil {
service1Compensate()
return err
}
if err := service2(); err != nil {
service2Compensate()
service1Compensate()
return err
}
return nil
}
- 原理:通过一系列的本地事务和补偿操作,确保在分布式环境下数据的一致性,即使某个微服务出现故障,也能通过补偿操作将数据恢复到事务执行前的状态。
5. 监控与报警
- 技术手段:使用监控工具(如Prometheus + Grafana)监控微服务的关键指标,如请求成功率、响应时间、错误率等。当错误率或其他关键指标超出正常范围时,通过报警系统(如Alertmanager与钉钉、邮件等集成)通知相关人员。例如:
# Prometheus配置示例
scrape_configs:
- job_name:'my_service'
static_configs:
- targets: ['my_service:8080']
metrics_path: '/metrics'
- 原理:实时监控系统状态,及时发现潜在问题并通知相关人员进行处理,降低故障对系统造成的影响。