本文次要钻研一下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