快捷搜索:  汽车  科技

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 创造一个新的节点。

dubbo启动服务:Dubbo-go 源码笔记 一(1)

并且写入具体 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()

dubbo启动服务:Dubbo-go 源码笔记 一(2)

protocol/protocolwrapped/protocol_filter_wrapper.go:buildInvokerChain

dubbo启动服务:Dubbo-go 源码笔记 一(3)

可见,根据配置的内容,通过链式调用的构造,将 proxy_invoker 层层包裹在调用链的最底部,最终返回一个调用链 invoker。

对应图中部分:

dubbo启动服务:Dubbo-go 源码笔记 一(4)

至此,我们已经拿到 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()。

dubbo启动服务:Dubbo-go 源码笔记 一(5)

猜您喜欢: