✅104、深入探索BrokerOuter API是如何发送注册请求的
深入探索BrokerOuter API是如何发送注册请求的?
1、进入真正的注册请求方法去看看
现在我们进入到真正的注册Broker的网络请求方法里去看看,其实入口就是下面这行代码:
RegisterBrokerResult result = registerBroker(namesrvAddr,oneway, timeoutMills,requestHeader,body);进入这个方法之后,会看到下面的一段代码,我们可以看看,我写了详细的注释,大家仔细看看我写的注释。


看到这里,大家先看看下面的图,有没有发现最终的请求是基于NettyClient这个组件给发送出去的?大家看下面的红圈处。

2、进入到NettyClient的网络请求方法中去看看
接着我们进入到NettyClient的网络请求方法中去看看,大家仔细看下面的代码,我都写了详细的注释了。


通过上面代码的分析,我现在在下面的图里,给大家再次加入一些东西,我通过Channel这个概念,表示出了Broker和NameServer之间的一个网络连接的概念,然后通过这个Channel就可以发送实际的网络请求出去!

3、如何跟NameServer建立网络连接?
接着我们进入上面的this.getAndCreateChannel(addr)这行代码看看,他是如何跟NameServer之间建立实际的网络连接的?
大家看下面的代码,下面的代码就是先从缓存里尝试获取连接,如果没有缓存的话,就创建一个连接。

那我们接着看下面的this.createChannel(addr)方法是如何实际通过一个NameServer的地址创建出来一个网络连接的吧。
我们看下面的代码,我写了详细的注释,大家仔细看里面的注释。



大家看下图,只要上面的Channel网络连接建立起来之后,我下面画红圈的地方,其实Broker和NameServer都会有一个Channel用来进行网络通信。

4、如何通过Channel网络连接发送请求?
接着我们看看,如何通过Channel网络连接发送请求出去?
其实核心入口就是下面的方法,之前讲过了。
RemotingCommand response = this.invokeSyncImpl(channel, request, timeoutMillis - costTime);我们进入这个方法去看看,他是如何发送网络请求出去的?我同样写了详细的注释,大家注意看我的注释就行,一些乱七八糟的代码如果暂时看不明白也没关系的,关键是抓住重点的逻辑。 

其实上面的代码只要关注我写的几行注释就可以了,抓住重点,就知道,最终底层其实就是基于Netty的Channel API,把注册的请求给发送到了NameServer就可以了。
我们看下面的图,里面的红圈就展示了通过Channel发送网络请求出去的示意。

5、今日源码分析作业
希望大家参考今天的文章,把Broker注册的时候,在NettyClient底层进行Channel网络连接建立,以及通过Channel连接把注册请求发送出去的这些逻辑,都自己看一遍,同时好好理解我文章里画出来的图。
大家一定要注意,看源码的每一行细节是一个过程,加深你的理解,但是最终记在你脑子里的,一定是一幅一幅的图,这才是最终你自己沉淀下来的东西