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