本文目录导读:

- 静态节点配置方式
- Hazelcast静态节点示例
- Apache Ignite静态节点配置
- ZooKeeper静态节点管理
- Spring Cloud Consul静态节点
- 完整实现示例
- 配置管理最佳实践
- 动态更新静态节点
我来为您详细解释Java分布式系统中的静态节点配置方法。
静态节点配置方式
1 配置文件方式
application.yml 示例:
cluster:
nodes:
- node1: server1.example.com:8080
- node2: server2.example.com:8080
- node3: server3.example.com:8080
static-nodes:
- id: node-1
host: 192.168.1.10
port: 5701
- id: node-2
host: 192.168.1.11
port: 5701
2 代码配置方式
@Configuration
public class StaticNodeConfig {
@Bean
public StaticNodeList staticNodes() {
StaticNodeList nodeList = new StaticNodeList();
// 添加静态节点
nodeList.addNode("node-1", "192.168.1.10", 5701);
nodeList.addNode("node-2", "192.168.1.11", 5701);
nodeList.addNode("node-3", "192.168.1.12", 5701);
return nodeList;
}
}
Hazelcast静态节点示例
@Configuration
public class HazelcastConfig {
@Bean
public Config hazelcastConfig() {
Config config = new Config();
// TCP/IP 配置
TcpIpConfig tcpIpConfig = config.getNetworkConfig()
.getJoin()
.getTcpIpConfig();
// 启用TCP/IP发现
tcpIpConfig.setEnabled(true);
// 添加静态节点
tcpIpConfig.addMember("192.168.1.10:5701")
.addMember("192.168.1.11:5701")
.addMember("192.168.1.12:5701");
// 禁用组播
config.getNetworkConfig()
.getJoin()
.getMulticastConfig()
.setEnabled(false);
return config;
}
}
Apache Ignite静态节点配置
@Configuration
public class IgniteConfig {
@Bean
public Ignite igniteInstance() {
TcpCommunicationSpi communicationSpi = new TcpCommunicationSpi();
// 静态IP发现
TcpDiscoveryStaticIpFinder ipFinder = new TcpDiscoveryStaticIpFinder();
ipFinder.setAddresses(Arrays.asList(
"192.168.1.10:47500",
"192.168.1.11:47500",
"192.168.1.12:47500"
));
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
discoverySpi.setIpFinder(ipFinder);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setDiscoverySpi(discoverySpi);
cfg.setCommunicationSpi(communicationSpi);
return Ignition.start(cfg);
}
}
ZooKeeper静态节点管理
@Service
public class ZooKeeperNodeManager {
private final ZooKeeper zooKeeper;
public ZooKeeperNodeManager() throws Exception {
// 静态节点连接
this.zooKeeper = new ZooKeeper(
"192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181",
3000,
watchedEvent -> {}
);
}
// 注册静态节点
public void registerStaticNode(String nodeInfo) {
try {
String path = "/static-nodes/node-" + System.currentTimeMillis();
zooKeeper.create(path,
nodeInfo.getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL);
} catch (Exception e) {
log.error("Failed to register static node", e);
}
}
}
Spring Cloud Consul静态节点
spring:
cloud:
consul:
host: 192.168.1.10
port: 8500
discovery:
instanceId: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}
healthCheckPath: /actuator/health
healthCheckInterval: 15s
# 静态节点配置
preferIpAddress: true
ipAddress: 192.168.1.10
serviceName: my-service
完整实现示例
@Component
public class StaticClusterManager {
private static final Logger log = LoggerFactory.getLogger(StaticClusterManager.class);
private final Map<String, NodeInfo> staticNodes = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
// 从配置文件加载静态节点
loadStaticNodes();
}
private void loadStaticNodes() {
// 方式1:硬编码
addStaticNode("node-1", "192.168.1.10", 8080);
addStaticNode("node-2", "192.168.1.11", 8080);
addStaticNode("node-3", "192.168.1.12", 8080);
}
public void addStaticNode(String nodeId, String host, int port) {
NodeInfo node = new NodeInfo(nodeId, host, port);
staticNodes.put(nodeId, node);
log.info("Added static node: {}", node);
}
public NodeInfo getNode(String nodeId) {
return staticNodes.get(nodeId);
}
public List<NodeInfo> getAllStaticNodes() {
return new ArrayList<>(staticNodes.values());
}
@Data
@AllArgsConstructor
public static class NodeInfo {
private String nodeId;
private String host;
private int port;
}
// 节点健康检查
@Scheduled(fixedRate = 30000)
public void healthCheck() {
staticNodes.values().forEach(node -> {
try {
InetAddress address = InetAddress.getByName(node.getHost());
boolean reachable = address.isReachable(5000);
log.debug("Node {} reachable: {}", node.getNodeId(), reachable);
} catch (IOException e) {
log.error("Health check failed for node {}", node.getNodeId(), e);
}
});
}
}
配置管理最佳实践
@Component
@ConfigurationProperties(prefix = "cluster.static-nodes")
public class StaticNodeConfiguration {
private List<NodeConfig> nodes = new ArrayList<>();
@Data
public static class NodeConfig {
private String nodeId;
private String host;
private int port;
private int weight = 1; // 负载权重
private boolean primary = false; // 是否主节点
}
// ... getters and setters
}
动态更新静态节点
@Component
public class DynamicStaticNodeUpdater {
@Autowired
private StaticClusterManager clusterManager;
// 运行时更新节点配置
public void updateNodes(List<StaticNodeConfiguration.NodeConfig> newNodes) {
// 清除旧节点
clusterManager.getAllStaticNodes().clear();
// 添加新节点
newNodes.forEach(node ->
clusterManager.addStaticNode(
node.getNodeId(),
node.getHost(),
node.getPort()
)
);
log.info("Static nodes updated successfully");
}
}
关键特点:
- 静态节点配置在初始化时确定
- 节点信息通常存储在配置文件或数据库中
- 支持运行时动态更新
- 通常配合健康检查机制使用
这种静态配置方式适合节点相对固定的分布式系统部署场景。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播