Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊dubbo-go-proxy的Client

聊聊dubbo-go-proxy的Client

原创
作者头像
code4it
修改于 2021-01-31 14:20:31
修改于 2021-01-31 14:20:31
33900
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

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

Client

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Client represents the interface of http/dubbo clients
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方法

Client

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Client client to generic invoke dubbo
type Client struct {
    lock               sync.RWMutex
    GenericServicePool map[string]*dg.GenericService
}

Client定义了lock、GenericServicePool属性,它实现了Client接口

Init

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Init init dubbo, config mapping can do here
func (dc *Client) Init() error {
    dc.GenericServicePool = make(map[string]*dg.GenericService, 4)

    cls := config.GetBootstrap().StaticResources.Clusters

    // dubbogo comsumer config
    dgCfg = dg.ConsumerConfig{
        Check:      new(bool),
        Registries: make(map[string]*dg.RegistryConfig, 4),
    }
    dgCfg.ApplicationConfig = defaultApplication
    for i := range cls {
        c := cls[i]
        dgCfg.Request_Timeout = c.RequestTimeoutStr
        dgCfg.Connect_Timeout = c.ConnectTimeoutStr
        for k, v := range c.Registries {
            if len(v.Protocol) == 0 {
                logger.Warnf("can not find registry protocol config, use default type 'zookeeper'")
                v.Protocol = defaultDubboProtocol
            }
            dgCfg.Registries[k] = &dg.RegistryConfig{
                Protocol:   v.Protocol,
                Address:    v.Address,
                TimeoutStr: v.Timeout,
                Username:   v.Username,
                Password:   v.Password,
            }
        }
    }

    initDubbogo()

    return nil
}

func initDubbogo() {
    dg.SetConsumerConfig(dgCfg)
    dg.Load()
}

Init方法主要是构建ConsumerConfig,然后执行initDubbogo

Close

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Close clear GenericServicePool.
func (dc *Client) Close() error {
    dc.lock.Lock()
    defer dc.lock.Unlock()
    for k := range dc.GenericServicePool {
        delete(dc.GenericServicePool, k)
    }
    return nil
}

Close方法通过加锁遍历dc.GenericServicePool执行delete操作

Call

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Call invoke service
func (dc *Client) Call(req *client.Request) (res interface{}, err error) {
    types, values, err := dc.genericArgs(req)
    if err != nil {
        return nil, err
    }

    dm := req.API.Method.IntegrationRequest
    method := dm.Method

    logger.Debugf("[dubbo-go-proxy] dubbo invoke, method:%s, types:%s, reqData:%v", method, types, values)

    gs := dc.Get(dm)

    rst, err := gs.Invoke(req.Context, []interface{}{method, types, values})

    if err != nil {
        return nil, err
    }

    logger.Debugf("[dubbo-go-proxy] dubbo client resp:%v", rst)

    return rst, nil
}

Call方法通过dc.Get(dm)获取GenericService,然后通过GenericService.Invoke进行请求

MapParams

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// MapParams params mapping to api.
func (dc *Client) MapParams(req *client.Request) (interface{}, error) {
    r := req.API.Method.IntegrationRequest
    if len(r.ParamTypes) != len(r.MappingParams) {
        return nil, errors.New("Numbers of param types and paramMappings are not the same")
    }
    var values []interface{}
    for _, mappingParam := range r.MappingParams {
        source, _, err := client.ParseMapSource(mappingParam.Name)
        if err != nil {
            return nil, err
        }
        if mapper, ok := mappers[source]; ok {
            if err := mapper.Map(mappingParam, req, &values, buildOption(mappingParam)); err != nil {
                return nil, err
            }
        }
    }
    return values, nil
}

MapParams方法遍历MappingParams,通过client.ParseMapSource获取source,再通过mappers[source]获取mapper,最后通过mapper的Map方法进行转换

小结

dubbo-go-proxy的client.Client接口定义了Init、Close、Call、MapParams方法;其dubbo.Client实现了client.Client接口;其主要是通过mapper进行参数转换,然后通过GenericService.Invoke进行请求。

doc

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊dubbo-go-proxy的remoteFilter
dubbo-go-proxy的clientFilter往extension注册了名为dgp.filters.remote_call的filter func;该func执行的是Do方法,该方法根据RequestType判断是否支持该请求类型并返回对应的client,最后通过cli.Call执行请求。
code4it
2021/02/07
2400
聊聊dubbo-go-proxy的remoteFilter
聊聊dubbo-go-proxy的ConsulRegistryLoad
本文主要研究一下dubbo-go-proxy的ConsulRegistryLoad
code4it
2021/02/15
3180
聊聊dubbo-go-proxy的ConsulRegistryLoad
聊聊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的ZookeeperRegistryLoad
本文主要研究一下dubbo-go-proxy的ZookeeperRegistryLoad
code4it
2021/02/16
2980
聊聊dubbo-go-proxy的ZookeeperRegistryLoad
聊聊dubbo-go-proxy的DiscoveryService
dubbo-go-proxy/pkg/service/discovery_service.go
code4it
2021/02/13
2980
聊聊dubbo-go-proxy的DiscoveryService
聊聊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的jtypes
dubbo-go-proxy/pkg/common/constant/jtypes.go
code4it
2021/02/11
4940
聊聊dubbo-go-proxy的jtypes
聊聊dubbo-go-proxy的Route
Route定义了lock、tree、wildcardTree属性,其NewRoute方法用于创建Route;它提供了PutAPI、UpdateAPI、FindAPI等方法;里头实现使用的是avltree.Tree。
code4it
2021/02/14
2790
聊聊dubbo-go-proxy的Route
聊聊dubbo-go-proxy的recoveryFilter
dubbo-go-proxy/pkg/filter/recovery/recovery.go
code4it
2021/02/05
2180
聊聊dubbo-go-proxy的recoveryFilter
聊聊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的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的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的timeoutFilter
dubbo-go-proxy/pkg/filter/timeout/timeout.go
code4it
2021/02/06
3480
聊聊dubbo-go-proxy的timeoutFilter
聊聊dubbo-go-proxy的authorityFilter
dubbo-go-proxy/pkg/filter/authority/authority.go
code4it
2021/02/04
2700
聊聊dubbo-go-proxy的authorityFilter
聊聊dubbo-go的DubboInvoker
dubbo-go-v1.4.2/protocol/dubbo/dubbo_invoker.go
code4it
2020/07/26
4490
聊聊dubbo-go的DubboInvoker
Dubbo 源码分析 - 服务引用
在上一篇文章中,我详细的分析了服务导出的原理。本篇文章我们趁热打铁,继续分析服务引用的原理。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直联的方式引用服务,第二种方式是基于注册中心进行引用。服务直联的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。这些步骤,我将在后续章节中一一进行分析。
田小波
2018/12/13
8620
聊聊promtail的Client
promtail的client定义了logger、cfg、client、quit、once、entries、wg、externalLabels属性;它实现了Client接口的Handle、Stop方法;Handle方法构造entry发送到c.entries这个channel;Stop方法执行close(c.quit);然后它还有一个run方法将entry添加到batch,然后将batch通过http的POST请求发送到指定的地址。
code4it
2021/01/21
8360
聊聊promtail的Client
聊聊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搭建dubbo接口测试平台
http接口测试只需要一个curl命令,但dubbo协议没有这样的现成接口测试工具。通常公司内的dubbo控制台或其他平台会集成一个dubbo接口测试工具。
龟仙老人
2021/07/22
7350
相关推荐
聊聊dubbo-go-proxy的remoteFilter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验