序
本文次要钻研一下dubbo-go-proxy的recoveryFilter
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办法
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()。
doc
- dubbo-go-proxy