in server/src/main/java/org/apache/seata/server/cluster/raft/RaftServerManager.java [91:152]
public static void init() {
if (INIT.compareAndSet(false, true)) {
String initConfStr = CONFIG.getConfig(ConfigurationKeys.SERVER_RAFT_SERVER_ADDR);
RAFT_MODE = StoreConfig.getSessionMode().equals(SessionMode.RAFT);
if (StringUtils.isBlank(initConfStr)) {
if (RAFT_MODE) {
throw new IllegalArgumentException(
"Raft store mode must config: " + ConfigurationKeys.SERVER_RAFT_SERVER_ADDR);
}
return;
} else {
if (RAFT_MODE) {
for (RegistryService<?> instance : MultiRegistryFactory.getInstances()) {
if (!(instance instanceof FileRegistryServiceImpl)
&& !(instance instanceof NamingserverRegistryServiceImpl)) {
throw new IllegalArgumentException("Raft store mode not support other Registration Center");
}
}
}
LOGGER.warn("raft mode and raft cluster is an experimental feature");
}
final Configuration initConf = new Configuration();
if (!initConf.parse(initConfStr)) {
throw new IllegalArgumentException("fail to parse initConf:" + initConfStr);
}
int port = Integer.parseInt(System.getProperty(SERVER_RAFT_PORT_CAMEL, "0"));
PeerId serverId = null;
String host = XID.getIpAddress();
if (port <= 0) {
// Highly available deployments require different nodes
for (PeerId peer : initConf.getPeers()) {
List<String> peerIps = NetUtil.getHostByName(peer.getIp());
for (String peerIp : peerIps) {
if (StringUtils.equals(peerIp, host)) {
if (serverId != null) {
throw new IllegalArgumentException(
"server.raft.cluster has duplicate ip, For local debugging, use -Dserver.raftPort to specify the raft port");
}
serverId = peer;
break;
}
}
}
} else {
// Local debugging use
serverId = new PeerId(host, port);
}
final String dataPath = CONFIG.getConfig(ConfigurationKeys.STORE_FILE_DIR, DEFAULT_SESSION_STORE_FILE_DIR)
+ separator + "raft" + separator + serverId.getPort();
String group = CONFIG.getConfig(ConfigurationKeys.SERVER_RAFT_GROUP, DEFAULT_SEATA_GROUP);
try {
// Here you have raft RPC and business RPC using the same RPC server, and you can usually do this
// separately
rpcServer = RaftRpcServerFactory.createRaftRpcServer(serverId.getEndpoint());
RaftServer raftServer = new RaftServer(dataPath, group, serverId, initNodeOptions(initConf), rpcServer);
// as the foundation for multi raft group in the future
RAFT_SERVER_MAP.put(group, raftServer);
} catch (IOException e) {
throw new IllegalArgumentException("fail init raft cluster:" + e.getMessage(), e);
}
}
}