Vesta發(fā)號(hào)器源碼解析——IpConfigurableMachineIdProvider
利用IP持有machineId的模式
字段和屬性
//日志
private static final Logger log = LoggerFactory
.getLogger(IpConfigurableMachineIdProvider.class);
//MachineId存儲(chǔ)
private long machineId;
//ip映射表
private Map<String, Long> ipsMap = new HashMap<String, Long>();
//默認(rèn)無(wú)參構(gòu)造方法
//記錄日志
public IpConfigurableMachineIdProvider() {
log.debug("IpConfigurableMachineIdProvider constructed.");
}
//根據(jù)參數(shù)ips,ip信息構(gòu)造
public IpConfigurableMachineIdProvider(String ips) {
//解析并處理IP
setIps(ips);
//初始化
init();
}
初始化方法
public void init() {
//讀取主機(jī)IP地址
String ip = IpUtils.getHostIp();
//判斷ip地址是否取到,如果沒(méi)取到拋出異常泄伪,記錄日志,終止初始化
if (StringUtils.isEmpty(ip)) {
String msg = "Fail to get host IP address. Stop to initialize the IpConfigurableMachineIdProvider provider.";
log.error(msg);
throw new IllegalStateException(msg);
}
//判斷IP是否有記錄柏蘑,如果沒(méi)有,記錄日志拋出異常
if (!ipsMap.containsKey(ip)) {
String msg = String
.format("Fail to configure ID for host IP address %s. Stop to initialize the IpConfigurableMachineIdProvider provider.",
ip);
log.error(msg);
throw new IllegalStateException(msg);
}
//獲取IP對(duì)應(yīng)的id
machineId = ipsMap.get(ip);
//記錄日志
log.info("IpConfigurableMachineIdProvider.init ip {} id {}", ip,
machineId);
}
設(shè)置IPs
public void setIps(String ips) {
log.debug("IpConfigurableMachineIdProvider ips {}", ips);
//參數(shù)校驗(yàn)
if (!StringUtils.isEmpty(ips)) {
//逗號(hào)分隔的ip地址列表
String[] ipArray = ips.split(",");
//分配ID
for (int i = 0; i < ipArray.length; i++) {
ipsMap.put(ipArray[i], (long) i);
}
}
}
getter和setter
public long getMachineId() {
return machineId;
}
public void setMachineId(long machineId) {
this.machineId = machineId;
}