in proxy/protocol/dubbo/proxy/dubbo_proxy_ouput.go [85:141]
func Handle(ctx *dubbo.InvokeContext) error {
interfaceName := ctx.Req.GetAttachment(dubbo.PathKey, "")
svc := schema.GetSvcByInterface(interfaceName)
if svc == nil {
return &util.BaseError{ErrMsg: "can't find the svc by " + interfaceName}
}
inv := new(invocation.Invocation)
inv.SourceServiceID = runtime.ServiceID
inv.SourceMicroService = ctx.Req.GetAttachment(common.HeaderSourceName, "")
inv.Args = ctx.Req
inv.Ctx = context.WithValue(context.Background(), chassisCommon.ContextHeaderKey{}, ctx.Req.GetAttachments())
inv.MicroServiceName = svc.ServiceName
inv.RouteTags = utiltags.NewDefaultTag(svc.Version, svc.AppID)
inv.Protocol = "dubbo"
inv.URLPath = ""
inv.Reply = &dubboclient.WrapResponse{nil} //&rest.Response{Resp: &ctx.Response}
var err error
err = SetLocalServiceAddress(inv) //select local service
if err != nil {
openlog.Warn(err.Error())
IsProvider = false
} else {
IsProvider = true
}
var c *handler.Chain
//发送请求
//value := ctx.Req.GetAttachment(ProxyTag, "")
if !IsProvider || inv.MicroServiceName != runtime.ServiceName { //come from proxyedDubboSvc
ctx.Req.SetAttachment(common.HeaderSourceName, runtime.ServiceName)
ctx.Req.SetAttachment(ProxyTag, "true")
if mesherRuntime.Role == mesherCommon.RoleSidecar {
c, err = handler.GetChain(common.Consumer, mesherCommon.ChainConsumerOutgoing)
if err != nil {
openlog.Error("Get Consumer chain failed: " + err.Error())
return err
}
}
c.Next(inv, func(ir *invocation.Response) {
handleDubboRequest(inv, ctx, ir)
})
} else { //come from other mesher
ctx.Req.SetAttachment(ProxyTag, "")
c, err = handler.GetChain(common.Provider, mesherCommon.ChainProviderIncoming)
if err != nil {
openlog.Error("Get Provider Chain failed: " + err.Error())
return err
}
c.Next(inv, func(ir *invocation.Response) {
handleDubboRequest(inv, ctx, ir)
})
}
return nil
}