本文次要钻研一下dubbo-go-proxy的remoteFilter

remoteFilter

dubbo-go-proxy/pkg/filter/remote/call.go

func Init() {    extension.SetFilterFunc(constant.RemoteCallFilter, remoteFilterFunc())}func remoteFilterFunc() fc.FilterFunc {    return New(defaultNewParams()).Do()}func defaultNewParams() mockLevel {    mock := 1    mockStr := os.Getenv(constant.EnvMock)    if len(mockStr) > 0 {        i, err := strconv.Atoi(mockStr)        if err == nil {            mock = i        }    }    return mockLevel(mock)}type mockLevel int8const (    open = iota    close    all)// clientFilter is a filter for recover.type clientFilter struct {    level mockLevel}// New create timeout filter.func New(level mockLevel) filter.Filter {    if level < 0 || level > 2 {        level = close    }    return &clientFilter{        level: level,    }}
clientFilter往extension注册了名为dgp.filters.remote_call的filter func;该func执行的是Do办法

Do

dubbo-go-proxy/pkg/filter/remote/call.go

func (f clientFilter) Do() fc.FilterFunc {    return func(c fc.Context) {        f.doRemoteCall(c.(*contexthttp.HttpContext))    }}func (f clientFilter) doRemoteCall(c *contexthttp.HttpContext) {    api := c.GetAPI()    if (f.level == open && api.Mock) || (f.level == all) {        c.SourceResp = &filter.ErrResponse{            Message: "mock success",        }        c.Next()        return    }    typ := api.Method.IntegrationRequest.RequestType    cli, err := matchClient(typ)    if err != nil {        c.Err = err        return    }    resp, err := cli.Call(client.NewReq(c.Ctx, c.Request, *api))    if err != nil {        logger.Errorf("[dubbo-go-proxy] client call err:%v!", err)        c.Err = err        return    }    logger.Debugf("[dubbo-go-proxy] client call resp:%v", resp)    c.SourceResp = resp    // response write in response filter.    c.Next()}func matchClient(typ config.RequestType) (client.Client, error) {    switch strings.ToLower(string(typ)) {    case string(config.DubboRequest):        return dubbo.SingletonDubboClient(), nil    case string(config.HTTPRequest):        return clienthttp.SingletonHTTPClient(), nil    default:        return nil, errors.New("not support")    }}
Do办法执行的是doRemoteCall,该办法辉县判断是否是mock,如果是则返回mock success;之后依据RequestType判断是否反对该申请类型并返回对应的client,最初通过cli.Call执行申请

Client

dubbo-go-proxy/pkg/client/client.go

type Client interface {    Init() error    Close() error    // Call invoke the downstream service.    Call(req *Request) (res interface{}, err error)    // MapParams mapping param, uri, query, body ...    MapParams(req *Request) (reqData interface{}, err error)}
Client接口定义了Init、Close、Call、MapParams办法,它有两个实现类,别离是dubbo.Client及http.Client

小结

dubbo-go-proxy的clientFilter往extension注册了名为dgp.filters.remote_call的filter func;该func执行的是Do办法,该办法依据RequestType判断是否反对该申请类型并返回对应的client,最初通过cli.Call执行申请。

doc

  • dubbo-go-proxy