【Hazelcast源码笔记】一、AddressPicker

Node在创建过程中,会生成一个AddressPicker,通过AddressPicker来获取publicAddress和bindAddress. 在很多情况下,这两者包含相同的IP和端口。在某些情况下会有不同,如通过<public-address>配置指定了publicAddress或者通过MemberAddressProvider来生成了bindAddress。下面看源码:

在Node.class类中,Node的构造函数。创建AddressPicker的方法nodeContext.createAddressPicker(this).

【Hazelcast源码笔记】一、AddressPicker

解析MemberAddressProviderConfig和AdvancedNetworkConfig,

(AdvancedNetworkConfig是3.12后出现的特性,可以为不同的网络接口配置不同的实现协议,比如Member和Client之间通信使用不同的网络接口。)

默认情况下是没有。

【Hazelcast源码笔记】一、AddressPicker

然后就开始pickAddress:

【Hazelcast源码笔记】一、AddressPicker

看DefaultAddressPicker的pickAddress方法:

【Hazelcast源码笔记】一、AddressPicker

getPublicAddressByPortSearch获取publicAddress,主要步骤被框出:

【Hazelcast源码笔记】一、AddressPicker

第一步,pickAddressDef:

【Hazelcast源码笔记】一、AddressPicker按顺序来:getSystemConfiguredAddress,默认一般是没有。

pickInterfaceAddressDef():

【Hazelcast源码笔记】一、AddressPicker

pickLoopbackAddress(null):取本机地址做Address.

第二步createServerSocketChannel,绑定ServerSocket到bindAddressDef(inetAddress,port)

第三步createAddress(bindAddress是DefaultAddressPicker的成员变量,到此已经完成了addressPick了)

第四步getPublicAddress,如果没有指定hazelcast.local.publicAddress或者配置public-address,则返回Null. 此时使用bindAddress作为publicAddress。

pickAddress完成后,bindAddress和publicAddress也都生成了,归纳获取bindAddress的步骤:

1.  生成一个AddressPicker, 根据配置情况,判断使用DefaultAddressPicker还是AdvancedNetworkAddressPicker还是DelegatingAddressPicker。一般默认情况下都是DefaultAddressPicker,配置了advancedNetwork时,会使用AdvancedNetworkAddressPicker,根据配置来选择,配置了MemberAddressProvider时,会使用DelegatingAddressPicker,由用户来实现地址的生成。后两种情况另做分析。

2. pickAddress生成publicAddress和bindAddress。第一步getSystemConfiguredAddress判断是不是用户通过hazelcast.local.localAddress来设置了绑定地址,默认是没有的。第二步从members、interfaces等配置中筛选出和本机网卡地址相匹配的地址,来作为bindAddress,如果没有找到匹配项,则取默认loopback地址做绑定。

3. 生成ServerSocketChannel绑定ServerSocket到bindAddressDef(inetAddress,port)

4. 生成publicAddress,如果没有指定hazelcast.local.publicAddress或者配置public-address,则返回Null. 此时使用bindAddress作为publicAddress。