聊聊dubbo-go-proxy的remoteFilter


本文摘自网络,作者,侵删。

本文主要研究一下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 int8

const (
    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

本文来自:51CTO博客

感谢作者:mb601a588b8eae6

查看原文:聊聊dubbo-go-proxy的remoteFilter

相关阅读 >>

[系列] - Go-gin-api 路由中间件 - 签名验证(七)

Golang 中的 nil

java反射与Golang反射简单对比

Golang基础-高级数据结构

如何通过Go语言将utc和gmt时间处理为标准北京时间?

Golang交叉编译简述

Golang中cat输出乱码问题解决方法

Golang是多线程模式吗?

Golang中关于文件的操作

Golang interface接口深入理解

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...