快捷搜索:  汽车  科技

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

dubbo启动服务:Dubbo-go 源码笔记 一这个函数内构造了多个 EventListener,非常有 java 的设计感。registry/protocol/protocol.go:: Export()3. registry 协议在 zkRegistry 上暴露上面的 proxy_invoker上面,我们执行到了 exporter = c.cacheProtocol.Export(invoker)。这里的 cacheProtocol 为一层缓存设计,对应到原始的 demo 上,这里是默认实现好的 registryProtocol。

到这里,上面 GetInvoker(*regUrl) 返回的 invoker 即为 proxy_invoker,它封装好了用户定义的 rpc_service,并将具体的调用逻辑封装入了 Invoke 函数内。

为什么使用 Proxy_invoker 来调用?

通过这个 proxy_invoke 调用用户的功能函数,调用方式将更加抽象化,可以在代码中看到,通过 ins 和 outs 来定义入参和出参,将整个调用逻辑抽象化为 invocation 结构体,而将具体的函数名的选择、参数向下传递和 reflect 反射过程封装在 invoke 函数内,这样的设计更有利于之后远程调用。个人认为这是 dubbo Invoke 调用链的设计思想。

至此,实现了图中对应的部分:

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

3. registry 协议在 zkRegistry 上暴露上面的 proxy_invoker

上面,我们执行到了 exporter = c.cacheProtocol.Export(invoker)。

这里的 cacheProtocol 为一层缓存设计,对应到原始的 demo 上,这里是默认实现好的 registryProtocol。

registry/protocol/protocol.go:: Export()

这个函数内构造了多个 EventListener,非常有 java 的设计感。

我们只关心服务暴露的过程,先忽略这些监听器。

1)获取注册 url 和服务 url

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

2)获取注册中心实例 zkRegistry

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

一层缓存操作,如果 cache 没有需要从 common 里面重新拿 zkRegistry。

3)zkRegistry 调用 Registry 方法,在 zookeeper 上注册 dubboPath

上述拿到了具体的 zkRegistry 实例,该实例的定义在:registry/zookeeper/registry.go。

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

该结构体组合了 registry.BaseRegistry 结构,base 结构定义了注册器基础的功能函数,比如 Registry、Subscribe 等,但在这些默认定义的函数内部,还是会调用 facade 层(zkRegistry 层)的具体实现函数,这一设计模型能在保证已有功能函数不需要重复定义的同时,引入外层函数的实现,类似于结构体继承却又复用了代码。这一设计模式值得学习。

我们查看上述 registry/protocol/protocol.go:: Export() 函数,直接调用了:

// 1. 通过zk注册器,调用Register()函数,将已有@root@rawurl注册到zk上 err := reg.Register(*registeredProviderUrl)

将已有 RegistryUrl 注册到了 zkRegistry 上。

这一步调用了 baseRegistry 的 Register 函数,进而调用 zkRegister 的 DoRegister 函数,进而调用:

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

猜您喜欢: