use of com.jd.blockchain.consensus.raft.settings.RaftNodeSettings in project jdchain-core by blockchain-jd-com.
the class GatewayQueryServiceHandler method consensusSettingsDecorator.
private ConsensusViewSettings consensusSettingsDecorator(ConsensusViewSettings consensusSettings) {
if (consensusSettings instanceof BftsmartConsensusViewSettings) {
// bft-smart单独处理
BftsmartConsensusViewSettings bftsmartConsensusSettings = (BftsmartConsensusViewSettings) consensusSettings;
NodeSettings[] nodes = bftsmartConsensusSettings.getNodes();
BftsmartNodeSettings[] bftsmartNodes = null;
if (nodes != null && nodes.length > 0) {
bftsmartNodes = new BftsmartNodeSettings[nodes.length];
for (int i = 0; i < nodes.length; i++) {
NodeSettings node = nodes[i];
if (node instanceof BftsmartNodeSettings) {
BftsmartNodeSettings bftsmartNodeSettings = (BftsmartNodeSettings) node;
bftsmartNodes[i] = new BftsmartNodeConfig(bftsmartNodeSettings.getPubKey(), bftsmartNodeSettings.getId(), bftsmartNodeSettings.getNetworkAddress());
}
}
}
return new BftsmartConsensusConfig(bftsmartNodes, bftsmartConsensusSettings.getSystemConfigs(), 0);
} else if (consensusSettings instanceof RaftConsensusSettings) {
RaftConsensusSettings raftConsensusSettings = (RaftConsensusSettings) consensusSettings;
NodeSettings[] nodes = raftConsensusSettings.getNodes();
RaftNodeSettings[] raftNodeSettings = new RaftNodeSettings[0];
if (nodes != null && nodes.length > 0) {
raftNodeSettings = new RaftNodeSettings[nodes.length];
for (int i = 0; i < nodes.length; i++) {
NodeSettings node = nodes[i];
if (node instanceof RaftNodeSettings) {
RaftNodeSettings raftNodeSetting = (RaftNodeSettings) node;
raftNodeSettings[i] = new RaftNodeConfig(raftNodeSetting.getId(), raftNodeSetting.getAddress(), raftNodeSetting.getPubKey(), raftNodeSetting.getNetworkAddress());
}
}
}
RaftConsensusConfig raftConsensusConfig = new RaftConsensusConfig();
RaftConfig raftConfig = new RaftConfig();
RaftNetworkConfig raftNetworkConfig = new RaftNetworkConfig();
BeanUtils.copyProperties(raftConsensusSettings, raftConsensusConfig);
BeanUtils.copyProperties(raftConsensusSettings.getRaftSettings(), raftConfig);
BeanUtils.copyProperties(raftConsensusSettings.getNetworkSettings(), raftNetworkConfig);
raftConsensusConfig.setNodeSettingsList(Arrays.asList(raftNodeSettings));
raftConsensusConfig.setRaftSettings(raftConfig);
raftConsensusConfig.setNetworkSettings(raftNetworkConfig);
return raftConsensusConfig;
} else if (consensusSettings instanceof MsgQueueConsensusSettings) {
MsgQueueConsensusSettings mqConsensusSettings = (MsgQueueConsensusSettings) consensusSettings;
MsgQueueConsensusConfig mqConsensusConfig = new MsgQueueConsensusConfig();
MsgQueueBlockSettings blockSettings = mqConsensusSettings.getBlockSettings();
MsgQueueBlockConfig mqQueueBlockConfig = new MsgQueueBlockConfig();
mqQueueBlockConfig.setMaxDelayMilliSecondsPerBlock(blockSettings.getMaxDelayMilliSecondsPerBlock());
mqQueueBlockConfig.setTxSizePerBlock(blockSettings.getTxSizePerBlock());
mqConsensusConfig.setBlockSettings(mqQueueBlockConfig);
MsgQueueNetworkSettings networkSettings = mqConsensusSettings.getNetworkSettings();
MsgQueueNetworkConfig mqQueueNetworkConfig = new MsgQueueNetworkConfig();
mqQueueNetworkConfig.setBlockTopic(networkSettings.getBlockTopic());
mqQueueNetworkConfig.setMsgResultTopic(networkSettings.getMsgResultTopic());
mqQueueNetworkConfig.setMsgTopic(networkSettings.getMsgTopic());
mqQueueNetworkConfig.setServer(networkSettings.getServer());
mqQueueNetworkConfig.setTxTopic(networkSettings.getTxTopic());
mqQueueNetworkConfig.setTxResultTopic(networkSettings.getTxResultTopic());
mqConsensusConfig.setNetworkSettings(mqQueueNetworkConfig);
for (int i = 0; i < mqConsensusSettings.getNodes().length; i++) {
MsgQueueNodeSettings nodeSettings = (MsgQueueNodeSettings) mqConsensusSettings.getNodes()[i];
MsgQueueNodeConfig msgQueueNodeConfig = new MsgQueueNodeConfig();
msgQueueNodeConfig.setAddress(nodeSettings.getAddress());
msgQueueNodeConfig.setPubKey(nodeSettings.getPubKey());
msgQueueNodeConfig.setId(nodeSettings.getId());
mqConsensusConfig.addNodeSettings(msgQueueNodeConfig);
}
return mqConsensusConfig;
}
return consensusSettings;
}
use of com.jd.blockchain.consensus.raft.settings.RaftNodeSettings in project jdchain-core by blockchain-jd-com.
the class RaftNodeServerFactory method buildServerSettings.
@Override
public ServerSettings buildServerSettings(String realmName, ConsensusViewSettings viewSettings, String nodeAddress, SSLSecurity sslSecurity, Properties properties) {
if (!(viewSettings instanceof RaftConsensusSettings)) {
throw new IllegalStateException("view settings should be raft-consensus settings");
}
if (null == properties || properties.size() == 0) {
throw new IllegalStateException("Extra properties empty");
}
RaftServerSettingsConfig settingsConfig = new RaftServerSettingsConfig();
NodeSettings currentNodeSettings = null;
for (NodeSettings nodeSettings : viewSettings.getNodes()) {
if (nodeSettings.getAddress().equals(nodeAddress)) {
currentNodeSettings = nodeSettings;
break;
}
}
if (currentNodeSettings == null) {
throw new IllegalArgumentException("node address does not exist in view settings!");
}
settingsConfig.setRealmName(realmName);
settingsConfig.setConsensusSettings((RaftConsensusSettings) viewSettings);
settingsConfig.setReplicaSettings(currentNodeSettings);
settingsConfig.setExtraProperties(properties);
if (sslSecurity == null) {
return settingsConfig;
}
// TLS适配
boolean enableTLS = false;
RaftNodeSettings raftNodeConfig = (RaftNodeSettings) currentNodeSettings;
if (raftNodeConfig.getNetworkAddress().isSecure() && !Strings.isNullOrEmpty(sslSecurity.getKeyStore())) {
enableTLS = true;
GmSSLProvider.enableGMSupport(sslSecurity.getProtocol());
}
if (!enableTLS) {
return settingsConfig;
}
// Node节点作为服务端时, 配置私钥信息
setSystemProperty("bolt.ssl.protocol", sslSecurity.getProtocol());
setSystemProperty("bolt.server.ssl.enable", "true");
setSystemProperty("bolt.server.ssl.keystore", sslSecurity.getKeyStore());
setSystemProperty("bolt.server.ssl.keyalias", sslSecurity.getKeyAlias());
setSystemProperty("bolt.server.ssl.keystore.password", sslSecurity.getKeyStorePassword());
setSystemProperty("bolt.server.ssl.keystore.type", sslSecurity.getKeyStoreType());
if (sslSecurity.getEnabledProtocols() != null) {
setSystemProperty("bolt.ssl.enabled-protocols", String.join(",", sslSecurity.getEnabledProtocols()));
}
if (sslSecurity.getCiphers() != null) {
setSystemProperty("bolt.ssl.ciphers", String.join(",", sslSecurity.getCiphers()));
}
// raft共识服务端开启TLS后,raft连接客户端也需开启TLS请求
setSystemProperty("bolt.client.ssl.enable", "true");
// Node节点配置信任证书,以及作为客户端链接其他节点时的信任证书
if (!Strings.isNullOrEmpty(sslSecurity.getTrustStore())) {
// 服务端配置: 此时服务端有keystore, truststore, 此时开启双向认证
setSystemProperty("bolt.server.ssl.clientAuth", "true");
setSystemProperty("bolt.client.ssl.keystore", sslSecurity.getTrustStore());
setSystemProperty("bolt.client.ssl.keystore.password", sslSecurity.getTrustStorePassword());
setSystemProperty("bolt.client.ssl.keystore.type", sslSecurity.getTrustStoreType());
}
return settingsConfig;
}
use of com.jd.blockchain.consensus.raft.settings.RaftNodeSettings in project jdchain-core by blockchain-jd-com.
the class RaftConsensusSettingsBuilder method createSettings.
@Override
public ConsensusViewSettings createSettings(Properties props, Replica[] replicas) {
RaftConsensusConfig raftConsensusConfig = new RaftConsensusConfig();
List<NodeSettings> nodeSettings = new ArrayList<>(replicas.length);
RaftConfig raftSettings = new RaftConfig();
RaftNetworkConfig networkConfig = new RaftNetworkConfig();
for (Replica replica : replicas) {
RaftNodeConfig raftNodeSettings = new RaftNodeConfig();
raftNodeSettings.init(props, replica);
nodeSettings.add(raftNodeSettings);
}
raftSettings.init(props);
networkConfig.init(props);
raftConsensusConfig.init(props);
raftConsensusConfig.setNodeSettingsList(nodeSettings);
raftConsensusConfig.setRaftSettings(raftSettings);
raftConsensusConfig.setNetworkSettings(networkConfig);
return raftConsensusConfig;
}
use of com.jd.blockchain.consensus.raft.settings.RaftNodeSettings in project jdchain-core by blockchain-jd-com.
the class QueryManagerInfoRequestProcessor method processRequest.
@Override
protected void processRequest(QueryManagerInfoRequest request, RpcResponseClosure done) throws Exception {
if (manager_info_cache.get() == null) {
synchronized (LOCK) {
if (manager_info_cache.get() == null) {
RaftNodeSettings raftNodeSettings = getNodeServerService().getNodeServer().getServerSettings().getRaftNodeSettings();
NetworkAddress raftNodeNetworkAddress = raftNodeSettings.getNetworkAddress();
ManagerInfoResponse response = new ManagerInfoResponse();
response.setManagerPort(RuntimeConstant.getMonitorPort());
response.setManagerSSLEnabled(RuntimeConstant.isMonitorSecure());
response.setHost(raftNodeNetworkAddress.getHost());
response.setConsensusPort(raftNodeNetworkAddress.getPort());
response.setConsensusSSLEnabled(raftNodeNetworkAddress.isSecure());
manager_info_cache.set(response.toBytes());
}
}
}
done.setResponse(RpcResponse.success(manager_info_cache.get()));
done.run(Status.OK());
}
use of com.jd.blockchain.consensus.raft.settings.RaftNodeSettings in project jdchain-core by blockchain-jd-com.
the class ParticipantManagerService4Raft method applyConsensusGroupNodeChange.
@Override
public WebResponse applyConsensusGroupNodeChange(ParticipantContext context, ParticipantNode node, @Nullable NetworkAddress changeConsensusNodeAddress, List<NodeSettings> origConsensusNodes, ManagementController.ParticipantUpdateType type) {
if (origConsensusNodes.isEmpty()) {
throw new IllegalStateException("current consensus node list is empty");
}
try {
// 等待raft节点服务完全启动
if (changeConsensusNodeAddress != null) {
boolean nodeStarted = waitConsensusNodeStarted(context, changeConsensusNodeAddress);
if (!nodeStarted) {
/*
* 共识节点启动异常后, 需要先解决异常问题, 然后重启节点。重启之后步骤如下
* a. 调用deactive命令删除该共识节点
* b. 停止该节点, 拷贝最新账本数据
* c. 重启该节点
* d. 执行active命令激活节点
* e. 执行更新等命令
* */
return WebResponse.createFailureResult(-1, "raft node may be start failed, check and restart it");
}
}
RaftNodeSettings origNodeSettings = findOrigNodeSetting(node, origConsensusNodes);
Object request = buildNodeRequest(origNodeSettings, changeConsensusNodeAddress, type);
if (request == null) {
throw new IllegalStateException("unsupported operate type " + type.name());
}
RpcResponse rpcResponse = shuffleInvoke(context, origConsensusNodes, request);
LOGGER.info("apply consensus group change response: {}", rpcResponse);
if (!rpcResponse.isSuccess()) {
return WebResponse.createFailureResult(-1, rpcResponse.getErrorMessage());
}
return WebResponse.createSuccessResult(null);
} finally {
shutdownClient(context);
}
}
Aggregations