# 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