版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingyangV587/article/details/85990523
服务引入总流程
- 创建client客户端,用来连接请求服务消费者。
- 封装invoker,里面主要包含请求的客户端,服务端地址端口,请求的类以及方法。
服务引入详细流程
- 在ReferenceBean->getObject()->init()中会调用createProxy()方法用来创建代理对象。
- 在createProxy()中会执行一个refprotocol.refer()方法,这里refprotocol同样有两个实现类,一个是RegistryProtocol,一个是DubboProtocol
- RegistryProtocol负责注册信息,订阅信息,构造invoker代理类,并将消费者对于的invoke缓存到注册列表中。
- DubboProtocol主要负责connect/getClients()连接获取客户端,等待与服务端通信
源码跟踪详解
消费者端获取代理类在ReferenceBean类中,而这个类实现类FactoryBean,这个是个工程Bean,通过getObject()方法获取代理类invoker。
进入get()
第一次ref肯定为空,进入init()
这里面有个重要的方法createProxy(),用来创建代理类,进入这个方法看看主要有啥:
这里有个refprotocol.refer()方法,用来创建invoker,同时这个接口有多个实现类包括,DubboProtocol与RegistryProtocol,我们分别在这两个类的refer()方法打上断点备用。然后我们放开断点,进入下一步:
如果服务没有分组的话,会走到这里执行doRefer()方法,这里是重点,我们进入这个方法:
如图所示,进行注册,订阅,缓存,最后会把创建好的vinoker返回出去,因为invoker肯定包含客户端相关信息,不然怎么连接服务端呢,所以在返回invoker之前会有创建客户端的操作。这时我们放开第二个断点会来到如图:
这里有个重要的方法,getClients(),点开这个方法:
要初始化一个client,点开继续往下
点开connect,继续:
这里又到了netty的底层了,客户端这时候就建立起来了,随时等待与服务端的连接。
这时主要的代码就执行完了,最开始那个getObjet(),就会获得一个invoker,有客户端,有服务器地址,有类以及方法。所以用客户端连接服务器,请求服务器某个类的方法,就顺利成章了!具体怎么调用的请看下一篇文章,服务的调用。
能力有限,有问题的地方求指正!