【Hazelcast源码笔记】一、AddressPicker

探讨Hazelcast Node在创建过程中的地址选择机制,包括publicAddress和bindAddress的生成方式,及其背后的AddressPicker组件作用。深入分析DefaultAddressPicker的工作流程,从系统配置、网络接口筛选到ServerSocket绑定,直至生成最终的bindAddress和publicAddress。

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。

 

 

/** * 只显示省份级 * provinceBlock : 回调省份 */ (instancetype)provincePickerViewWithProvinceBlock:(void(^)(NSString *province))provinceBlock; /** * 显示省份和市级 * cityBlock : 回调省份和城市 */ (instancetype)cityPickerViewWithCityBlock:(void(^)(NSString *province, NSString *city))cityBlock; /** * 显示省份和市级和区域 * areaBlock : 回调省份城市和区域 */ (instancetype)areaPickerViewWithAreaBlock:(void(^)(NSString *province, NSString *city, NSString *area))areaBlock; /** * 只显示省份级 * province : 传入了省份自动滚动到省份,没有传或者找不到默认选中第个 * provinceBlock : 回调省份 */ (instancetype)provincePickerViewWithProvince:(NSString *)province provinceBlock:(void(^)(NSString *province))provinceBlock; /** * 显示省份和市级 * province,city : 传入了省份和城市自动滚动到选中的,没有传或者找不到默认选中第个 * cityBlock : 回调省份和城市 */ (instancetype)cityPickerViewWithProvince:(NSString *)province city:(NSString *)city cityBlock:(void(^)(NSString *province, NSString *city))cityBlock; /** * 显示省份和市级和区域 * province,city : 传入了省份和城市和区域自动滚动到选中的,没有传或者找不到默认选中第个 * areaBlock : 回调省份城市和区域 */ (instancetype)areaPickerViewWithProvince:(NSString *)province city:(NSString *)city area:(NSString *)area areaBlock:(void(^)(NSString *province, NSString *city, NSString *area))areaBlock;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值