本文主要研究一下dubbo-go-proxy的recoveryFilter
dubbo-go-proxy/pkg/filter/recovery/recovery.go
func Init() { extension.SetFilterFunc(constant.RecoveryFilter, recoveryFilterFunc()) } func recoveryFilterFunc() context.FilterFunc { return New().Do() } // recoveryFilter is a filter for recover. type recoveryFilter struct { } // New create timeout filter. func New() filter.Filter { return &recoveryFilter{} }
recoveryFilter往extension注册名为dgp.filters.recovery
的recoveryFilterFunc;该func执行的是recoveryFilter的Do方法
dubbo-go-proxy/pkg/filter/recovery/recovery.go
// Recovery execute recoveryFilter filter logic, if recover happen, print log or do other things. func (f recoveryFilter) Do() context.FilterFunc { return func(c context.Context) { defer func() { if err := recover(); err != nil { logger.Warnf("[dubboproxy go] error:%+v", err) c.WriteErr(err) } }() c.Next() } }
Do方法先注册一个defer func进行recover,然后再执行c.Next()
dubbo-go-proxy的recoveryFilter注册一个defer func进行recover,然后再执行c.Next()。