本文目录导读:

- 静态节点配置方式
- 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");
}
}
关键特点:
- 静态节点配置在初始化时确定
- 节点信息通常存储在配置文件或数据库中
- 支持运行时动态更新
- 通常配合健康检查机制使用
这种静态配置方式适合节点相对固定的分布式系统部署场景。