我理解的是,当服务启动的时候,会将要注册的服务封装成一个URL 然后往 zookeeper 进行注册,
而当我们进行调用的时候,spring会调用getBean的时候,就会创建 NettyClient 对象,构造出一个 Socket 客户端,进行连接服务端
最终会调用 HeaderExchangeChannel 的 request 方法,通过 channel 进行请求。
Provider 作为被访问方,肯定是一个 Server 模式的 Socket。如何启动的呢?
当 Spring 容器启动的时候,会调用一些扩展类的初始化方法,比如继承了 InitializingBean,ApplicationContextAware,ApplicationListener 。而 dubbo 创建了 ServiceBean 继承了一个监听器。Spring 会调用他的 onApplicationEvent 方法,该类有一个 export 方法,用于打开 ServerSocket 。
然后执行了 DubboProtocol 的 createServer 方法,然后创建了一个 NettyServer 对象。NettyServer 对象的
可以看到,dubbo 使用 Netty 还是挺简单的,消费者使用 NettyClient,提供者使用 NettyServer,Provider 启动的时候,会开启端口监听,使用我们平时启动 Netty 一样的方式。而 Client 在 Spring getBean 的时候,会创建 Client,当调用远程方法的时候,将数据通过 dubbo 协议编码发送到 NettyServer,然后 NettServer 收到数据后解码,并调用本地方法,并返回数据,完成一次完美的 RPC 调用。
本人没用过 Dubbo,只是看些文章进行写总结,写的不好请勿喷,多多给与意见。谢谢