1. 概述
本文是一篇 Hazelcast 入门指南,我们将学习如何创建集群成员、使用分布式 Map 在集群节点间共享数据,以及构建 Java 客户端来连接和查询集群中的数据。
2. Hazelcast 是什么?
Hazelcast 是一个面向 Java 的分布式内存数据网格平台。其架构支持集群环境下的高可扩展性和数据分布,具备节点自动发现和智能同步特性。
Hazelcast 提供了不同版本,本教程使用开源版本。它还提供多种功能:
- ✅ 分布式数据结构
- ✅ 分布式计算
- ✅ 分布式查询
本文将重点介绍分布式 Map 的使用。
3. Maven 依赖
Hazelcast 提供了多种库满足不同需求,可在 Maven Central 的 com.hazelcast 组下找到。本文只需核心依赖:
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>4.0.2</version>
</dependency>
最新版本可在 Maven 中央仓库 查看。
4. 第一个 Hazelcast 应用
4.1 创建 Hazelcast 成员
成员(也称节点)会自动加入形成集群。自动加入通过多种发现机制实现。下面创建一个存储分布式 Map 数据的成员:
public class ServerNode {
HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance();
...
}
启动 ServerNode
后,控制台会显示类似内容,表示在 JVM 中创建了新节点并加入集群:
Members [1] {
Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c this
}
启动多个 ServerNode
实例即可创建多节点集群。例如再次运行后,控制台显示集群已有两个成员:
Members [2] {
Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c
Member [192.168.1.105]:5702 - d6b81800-2c78-4055-8a5f-7f5b65d49f30 this
}
4.2 创建分布式 Map
使用之前创建的 HazelcastInstance
构建分布式 Map(继承自 java.util.concurrent.ConcurrentMap
):
Map<Long, String> map = hazelcastInstance.getMap("data");
...
添加 10 条数据,使用 FlakeIdGenerator
确保键唯一:
FlakeIdGenerator idGenerator = hazelcastInstance.getFlakeIdGenerator("newid");
for (int i = 0; i < 10; i++) {
map.put(idGenerator.newId(), "message" + i);
}
⚠️ 虽然这不是生产级示例,但展示了分布式 Map 的基本操作。后续会通过客户端访问这些数据。
Hazelcast 内部会对 Map 条目分区并在集群成员间分布复制。更多细节参考官方文档。
4.3 创建 Hazelcast Java 客户端
客户端无需加入集群即可执行所有 Hazelcast 操作,只需连接一个集群成员并委托操作:
ClientConfig config = new ClientConfig();
config.setClusterName("dev");
HazelcastInstance hazelcastInstanceClient = HazelcastClient.newHazelcastClient(config);
就这么简单粗暴!
4.4 从客户端访问分布式 Map
使用客户端实例访问分布式 Map:
Map<Long, String> map = hazelcastInstanceClient.getMap("data");
...
现在可以像普通 Map 一样操作,例如遍历条目:
for (Entry<Long, String> entry : map.entrySet()) {
...
}
5. 配置 Hazelcast
本节介绍如何通过 XML 和 API 配置网络,并使用管理中心监控节点。
启动时,Hazelcast 会按以下顺序查找配置:
- 系统属性
hazelcast.config
指定的路径 - 工作目录或 classpath 下的
hazelcast.xml
- 默认配置
hazelcast-default.xml
(hazelcast.jar 内置)
5.1 网络配置
默认使用多播发现成员。若环境不支持多播,可配置 TCP/IP 集群:
XML 配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-4.0.xsd">
<network>
<port auto-increment="true" port-count="20">5701</port>
<join>
<multicast enabled="false"/>
<tcp-ip enabled="true">
<member>machine1</member>
<member>localhost</member>
</tcp-ip>
</join>
</network>
</hazelcast>
Java API 配置方式:
Config config = new Config();
NetworkConfig network = config.getNetworkConfig();
network.setPort(5701).setPortCount(20);
network.setPortAutoIncrement(true);
JoinConfig join = network.getJoin();
join.getMulticastConfig().setEnabled(false);
join.getTcpIpConfig()
.addMember("machine1")
.addMember("localhost").setEnabled(true);
💡 默认会尝试 100 个端口。本例设置起始端口 5701,端口数量 20,则成员加入时会尝试 5701-5721 端口。若需固定端口,设置
auto-increment="false"
。
5.2 管理中心配置
管理中心可监控集群状态、分析数据结构、更新配置、导出线程堆栈等。
使用方式:
- 部署
mancenter-*.war
到应用服务器 - 或从命令行启动(下载 Hazelcast ZIP)
XML 配置管理中心 URL:
<management-center enabled="true">
http://localhost:8080/mancenter
</management-center>
Java API 配置:
ManagementCenterConfig manCenterCfg = new ManagementCenterConfig();
manCenterCfg.setEnabled(true).setUrl("http://localhost:8080/mancenter");