# raft
**Repository Path**: vrv_liuwei/raft
## Basic Information
- **Project Name**: raft
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-07-04
- **Last Updated**: 2026-01-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Server-Raft
基于Raft一致性算法的分布式共识库,可以轻松集成到SpringBoot应用中。
## 功能特点
- 完整实现Raft一致性算法
- 支持SpringBoot自动配置
- 提供简洁的API接口
- 支持状态机机制
- 支持基于时间和条数的快照策略
- 支持节点自动发现
## 快速开始
### 1. 添加依赖
```xml
com.vrv.im
server-raft
1.0-SNAPSHOT
```
### 2. 配置Raft
在`application.yml`中添加配置:
```yaml
raft:
enabled: true
node-id: ${spring.application.name}-${server.port}
host: localhost
port: 8000
data-dir: data/raft
cluster:
discovery-mode: SEED_NODES
seed-nodes:
- node1:localhost:8000
- node2:localhost:8001
- node3:localhost:8002
election:
timeout-ms: 5000
random-range-ms: 5000
heartbeat:
interval-ms: 3000
snapshot:
enabled: true
threshold-count: 1000
threshold-time-ms: 300000
```
### 3. 实现状态机
创建自定义状态机:
```java
@Component
public class MyStateMachine implements StateMachine {
private final Map data = new HashMap<>();
private final AtomicLong lastAppliedIndex = new AtomicLong(-1);
@Override
public byte[] apply(long logIndex, byte[] command) {
// 解析并执行命令
String cmdStr = new String(command, StandardCharsets.UTF_8);
// 实现业务逻辑...
lastAppliedIndex.set(logIndex);
return "OK".getBytes();
}
@Override
public byte[] takeSnapshot() {
// 创建状态快照
// ...
return snapshotData;
}
@Override
public void restoreFromSnapshot(byte[] snapshot) {
// 从快照恢复状态
// ...
}
@Override
public long getLastAppliedIndex() {
return lastAppliedIndex.get();
}
}
```
### 4. 使用RaftService
```java
@Service
public class MyService {
private final RaftService raftService;
@Autowired
public MyService(RaftService raftService, MyStateMachine stateMachine) {
this.raftService = raftService;
// 注册状态机
raftService.registerStateMachine(stateMachine);
// 启动Raft服务
raftService.start();
}
public void performOperation(String key, String value) {
// 创建命令
String command = "PUT " + key + " " + value;
// 提交命令到Raft集群
try {
CommandResult result = raftService.submitCommand(command.getBytes()).get();
if (result.isSuccess()) {
// 处理成功结果
} else {
// 处理失败结果
}
} catch (Exception e) {
// 处理异常
}
}
@PreDestroy
public void shutdown() {
// 停止Raft服务
raftService.stop();
}
}
```
## 配置说明
| 配置项 | 说明 | 默认值 |
|-------|------|-------|
| raft.enabled | 是否启用Raft | false |
| raft.node-id | 节点ID | ${spring.application.name}-${server.port} |
| raft.host | 节点主机名/IP | localhost |
| raft.port | 节点端口号 | 8000 |
| raft.data-dir | 数据目录 | data/raft |
| raft.cluster.discovery-mode | 发现模式 (AUTO/MANUAL/SEED_NODES) | MANUAL |
| raft.cluster.seed-nodes | 种子节点列表 | [] |
| raft.election.timeout-ms | 选举超时时间(毫秒) | 5000 |
| raft.election.random-range-ms | 选举超时随机范围(毫秒) | 5000 |
| raft.heartbeat.interval-ms | 心跳间隔(毫秒) | 3000 |
| raft.snapshot.enabled | 是否启用快照 | true |
| raft.snapshot.threshold-count | 触发快照的日志条数阈值 | 1000 |
| raft.snapshot.threshold-time-ms | 触发快照的时间阈值(毫秒) | 300000 |
## 示例项目
参考 [server-raft-example](https://github.com/vrv-im/server-raft-example) 项目,了解更多使用示例。
## 启动方式
```
# 1. 启动node1 (8091)
java -jar server-raft-1.0-SNAPSHOT.jar --server.port=8091 --raft.node-id=node1 --raft.port=8001
# 2. 启动node2 (8092)
java -jar server-raft-1.0-SNAPSHOT.jar --server.port=8092 --raft.node-id=node2 --raft.port=8002
# 3. 启动node3 (8093)
java -jar server-raft-1.0-SNAPSHOT.jar --server.port=8093 --raft.node-id=node3 --raft.port=8003
# 3. 启动node3 (8094)
java -jar server-raft-1.0-SNAPSHOT.jar --server.port=8094 --raft.node-id=node4 --raft.port=8004
```
## 许可证
MIT