dubbo启动服务:Dubbo-go 源码笔记 一
dubbo启动服务:Dubbo-go 源码笔记 一protocol/protocolwrapped/protocol_filter_wrapper.go:buildInvokerChainprotocol/protocolwrapped/protocol_filter_wrapper.go:Export()4)proxy_invoker 封装入 wrapped_invoker,得到 filter 调用链 // invoker封装入warppedInvoker wrappedInvoker := newWrappedInvoker(invoker providerUrl) // 经过为invoker增加filter调用链,再使用dubbo协议Export,开启service并且返回了Exporter 。 // export_1 cachedExporter = extension.GetProtoco
在这个函数里,将对应 root 创造一个新的节点。
并且写入具体 node 信息,node 为 url 经过 encode 的结果,包含了服务端的调用方式。
这部分的代码较为复杂,具体可以看 baseRegistry 的 processURL() 函数:http://t.tb.cn/6Xje4bijnsIDNaSmyPc4Ot。
至此,将服务端调用 url 注册到了 zookeeper 上,而客户端如果想获取到这个 url,只需要传入特定的 dubboPath,向 zk 请求即可。目前 client 是可以获取到访问方式了,但服务端的特定服务还没有启动,还没有开启特定协议端口的监听,这也是 registry/protocol/protocol.go:: Export() 函数接下来要做的事情。
4)proxy_invoker 封装入 wrapped_invoker,得到 filter 调用链
// invoker封装入warppedInvoker
wrappedInvoker := newWrappedInvoker(invoker providerUrl)
// 经过为invoker增加filter调用链,再使用dubbo协议Export,开启service并且返回了Exporter 。
// export_1
cachedExporter = extension.GetProtocol(protocolwrapper.FILTER).Export(wrappedInvoker)
新建一个 WrappedInvoker,用于之后链式调用。
拿到提前实现并注册好的 ProtocolFilterWrapper,调用 Export 方法,进一步暴露。
protocol/protocolwrapped/protocol_filter_wrapper.go:Export()
protocol/protocolwrapped/protocol_filter_wrapper.go:buildInvokerChain
可见,根据配置的内容,通过链式调用的构造,将 proxy_invoker 层层包裹在调用链的最底部,最终返回一个调用链 invoker。
对应图中部分:
至此,我们已经拿到 filter 调用链,期待将这个 chain 暴露到特定端口,用于相应请求事件。
5)通过 dubbo 协议暴露 wrapped_invoker
protocol/protocolwrapped/protocol_filter_wrapper.go:Export()
// 通过dubbo协议Export dubbo_protocol调用的 export_2
return pfw.protocol.Export(invoker)
回到上述 Export 函数的最后一行,调用了 dubboProtocol 的 Export 方法,将上述 chain 真正暴露。
该 Export 方法的具体实现在:protocol/dubbo/dubbo_protocol.go: Export()。