前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊dubbo-go-proxy的remoteFilter

聊聊dubbo-go-proxy的remoteFilter

原创
作者头像
code4it
修改于 2021-02-08 02:00:32
修改于 2021-02-08 02:00:32
24000
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下dubbo-go-proxy的remoteFilter

remoteFilter

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊dubbo-go-proxy的recoveryFilter
dubbo-go-proxy/pkg/filter/recovery/recovery.go
code4it
2021/02/05
2180
聊聊dubbo-go-proxy的recoveryFilter
聊聊dubbo-go-proxy的hostFilter
dubbo-go-proxy的hostFilter将f.host设置给c.Request.Host,然后执行c.Next()。
code4it
2021/02/10
2830
聊聊dubbo-go-proxy的hostFilter
聊聊dubbo-go-proxy的Route
Route定义了lock、tree、wildcardTree属性,其NewRoute方法用于创建Route;它提供了PutAPI、UpdateAPI、FindAPI等方法;里头实现使用的是avltree.Tree。
code4it
2021/02/14
2810
聊聊dubbo-go-proxy的Route
聊聊dubbo-go-proxy的timeoutFilter
dubbo-go-proxy/pkg/filter/timeout/timeout.go
code4it
2021/02/06
3480
聊聊dubbo-go-proxy的timeoutFilter
聊聊dubbo-go的DubboPackage
DubboPackage定义了Header、Service、Body、Err属性;codec.go提供了Marshal、Unmarshal方法用于读写DubboPackage
code4it
2020/07/28
4530
聊聊dubbo-go的DubboPackage
聊聊dubbo-go的DubboPackage
DubboPackage定义了Header、Service、Body、Err属性;codec.go提供了Marshal、Unmarshal方法用于读写DubboPackage
code4it
2020/07/30
3230
聊聊dubbo-go的ConsumerSignFilter
dubbo-go-v1.4.2/filter/filter_impl/auth/consumer_sign.go
code4it
2020/07/29
4310
聊聊dubbo-go-proxy的authorityFilter
dubbo-go-proxy/pkg/filter/authority/authority.go
code4it
2021/02/04
2700
聊聊dubbo-go-proxy的authorityFilter
聊聊dubbo-go的ProviderAuthFilter
dubbo-go-v1.4.2/filter/filter_impl/auth/provider_auth.go
code4it
2020/07/29
3560
聊聊dubbo-go-proxy的plugins
dubbo-go-proxy-filter@v0.1.0-rc1.0.20210120132524-c63f4eb13725/pkg/api/config/api_config.go
code4it
2021/02/10
2850
聊聊dubbo-go-proxy的plugins
聊聊dubbo-go-proxy的loggerFilter
dubbo-go-proxy/pkg/filter/logger/logger.go
code4it
2021/02/04
1840
聊聊dubbo-go-proxy的loggerFilter
聊聊dubbo-go-proxy的apiFilter
dubbo-go-proxy-filter@v0.1.0-rc1.0.20210120132524-c63f4eb13725/pkg/api/api.go
code4it
2021/02/12
2490
聊聊dubbo-go-proxy的apiFilter
聊聊dubbo-go-proxy的AccessLogFilter
dubbo-go-proxy/pkg/filter/accesslog/access_log.go
code4it
2021/02/02
2930
聊聊dubbo-go-proxy的AccessLogFilter
聊聊dubbo-go-proxy的Client
dubbo-go-proxy的client.Client接口定义了Init、Close、Call、MapParams方法;其dubbo.Client实现了client.Client接口;其主要是通过mapper进行参数转换,然后通过GenericService.Invoke进行请求。
code4it
2021/01/31
3400
聊聊dubbo-go-proxy的Client
聊聊dubbo-go-proxy的replacePathFilter
dubbo-go-proxy/pkg/filter/replacepath/replace_path.go
code4it
2021/02/08
2980
聊聊dubbo-go-proxy的replacePathFilter
聊聊dubbo-go-proxy的DiscoveryService
dubbo-go-proxy/pkg/service/discovery_service.go
code4it
2021/02/13
2980
聊聊dubbo-go-proxy的DiscoveryService
聊聊dubbo-go-proxy的ConsulRegistryLoad
本文主要研究一下dubbo-go-proxy的ConsulRegistryLoad
code4it
2021/02/15
3180
聊聊dubbo-go-proxy的ConsulRegistryLoad
聊聊dubbo-go-proxy的ZookeeperRegistryLoad
本文主要研究一下dubbo-go-proxy的ZookeeperRegistryLoad
code4it
2021/02/16
2980
聊聊dubbo-go-proxy的ZookeeperRegistryLoad
聊聊dubbo-go-proxy的ParamMapper
dubbo-go-proxy的ParamMapper接口定义了Map方法;它有四个实现类分别是headerMapper、uriMapper、queryStringsMapper、bodyMapper;mapPrepare方法用于提取参数,setTarget方法用于将val写入到requestParams的对应部分。
code4it
2021/02/01
2780
聊聊dubbo-go-proxy的ParamMapper
聊聊dubbo-go-proxy的jtypes
dubbo-go-proxy/pkg/common/constant/jtypes.go
code4it
2021/02/11
4940
聊聊dubbo-go-proxy的jtypes
相关推荐
聊聊dubbo-go-proxy的recoveryFilter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验