【Hazelcast源码笔记】一、AddressPicker
Node在创建过程中,会生成一个AddressPicker,通过AddressPicker来获取publicAddress和bindAddress. 在很多情况下,这两者包含相同的IP和端口。在某些情况下会有不同,如通过<public-address>配置指定了publicAddress或者通过MemberAddressProvider来生成了bindAddress。下面看源码:
在Node.class类中,Node的构造函数。创建AddressPicker的方法nodeContext.createAddressPicker(this).
解析MemberAddressProviderConfig和AdvancedNetworkConfig,
(AdvancedNetworkConfig是3.12后出现的特性,可以为不同的网络接口配置不同的实现协议,比如Member和Client之间通信使用不同的网络接口。)
默认情况下是没有。
然后就开始pickAddress:
看DefaultAddressPicker的pickAddress方法:
getPublicAddressByPortSearch获取publicAddress,主要步骤被框出:
第一步,pickAddressDef:
按顺序来:getSystemConfiguredAddress,默认一般是没有。
pickInterfaceAddressDef():
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。