{"id":13499903,"url":"https://github.com/wenweihu86/raft-java","last_synced_at":"2025-03-29T05:32:34.571Z","repository":{"id":41168812,"uuid":"90026142","full_name":"wenweihu86/raft-java","owner":"wenweihu86","description":"Raft Java implementation which is simple and easy to understand.","archived":false,"fork":false,"pushed_at":"2024-01-10T04:43:19.000Z","size":379,"stargazers_count":1174,"open_issues_count":26,"forks_count":404,"subscribers_count":44,"default_branch":"master","last_synced_at":"2024-08-01T22:52:08.485Z","etag":null,"topics":["distributed-file-system","distributed-storage","raft","raft-algorithm","raft-consensus","raft-consensus-algorithm","raft-java","raft-protocol"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wenweihu86.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-02T11:29:58.000Z","updated_at":"2024-08-01T09:24:55.000Z","dependencies_parsed_at":"2022-07-21T11:33:13.159Z","dependency_job_id":null,"html_url":"https://github.com/wenweihu86/raft-java","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenweihu86%2Fraft-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenweihu86%2Fraft-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenweihu86%2Fraft-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wenweihu86%2Fraft-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wenweihu86","download_url":"https://codeload.github.com/wenweihu86/raft-java/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222465722,"owners_count":16989066,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["distributed-file-system","distributed-storage","raft","raft-algorithm","raft-consensus","raft-consensus-algorithm","raft-java","raft-protocol"],"created_at":"2024-07-31T22:00:46.573Z","updated_at":"2024-10-31T18:31:22.706Z","avatar_url":"https://github.com/wenweihu86.png","language":"Java","funding_links":[],"categories":["Raft","Java","分布式开发"],"sub_categories":["Implementations"],"readme":"# raft-java\nRaft implementation library for Java.\u003cbr\u003e\n参考自[Raft论文](https://github.com/maemual/raft-zh_cn)和Raft作者的开源实现[LogCabin](https://github.com/logcabin/logcabin)。\n\n# 支持的功能\n* leader选举\n* 日志复制\n* snapshot\n* 集群成员动态更变\n\n## Quick Start\n在本地单机上部署一套3实例的raft集群，执行如下脚本：\u003cbr\u003e\ncd raft-java-example \u0026\u0026 sh deploy.sh \u003cbr\u003e\n该脚本会在raft-java-example/env目录部署三个实例example1、example2、example3；\u003cbr\u003e\n同时会创建一个client目录，用于测试raft集群读写功能。\u003cbr\u003e\n部署成功后，测试写操作，通过如下脚本：\ncd env/client \u003cbr\u003e\n./bin/run_client.sh \"list://127.0.0.1:8051,127.0.0.1:8052,127.0.0.1:8053\" hello world \u003cbr\u003e\n测试读操作命令：\u003cbr\u003e\n./bin/run_client.sh \"list://127.0.0.1:8051,127.0.0.1:8052,127.0.0.1:8053\" hello\n\n# 使用方法\n下面介绍如何在代码中使用raft-java依赖库来实现一套分布式存储系统。\n## 配置依赖（暂未发布到maven中央仓库，需要手动install到本地）\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.wenweihu86.raft\u003c/groupId\u003e\n    \u003cartifactId\u003eraft-java-core\u003c/artifactId\u003e\n    \u003cversion\u003e1.9.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## 定义数据写入和读取接口\n```protobuf\nmessage SetRequest {\n    string key = 1;\n    string value = 2;\n}\nmessage SetResponse {\n    bool success = 1;\n}\nmessage GetRequest {\n    string key = 1;\n}\nmessage GetResponse {\n    string value = 1;\n}\n```\n```java\npublic interface ExampleService {\n    Example.SetResponse set(Example.SetRequest request);\n    Example.GetResponse get(Example.GetRequest request);\n}\n```\n\n## 服务端使用方法\n1. 实现状态机StateMachine接口实现类\n```java\n// 该接口三个方法主要是给Raft内部调用\npublic interface StateMachine {\n    /**\n     * 对状态机中数据进行snapshot，每个节点本地定时调用\n     * @param snapshotDir snapshot数据输出目录\n     */\n    void writeSnapshot(String snapshotDir);\n    /**\n     * 读取snapshot到状态机，节点启动时调用\n     * @param snapshotDir snapshot数据目录\n     */\n    void readSnapshot(String snapshotDir);\n    /**\n     * 将数据应用到状态机\n     * @param dataBytes 数据二进制\n     */\n    void apply(byte[] dataBytes);\n}\n```\n\n2. 实现数据写入和读取接口\n```\n// ExampleService实现类中需要包含以下成员\nprivate RaftNode raftNode;\nprivate ExampleStateMachine stateMachine;\n```\n```\n// 数据写入主要逻辑\nbyte[] data = request.toByteArray();\n// 数据同步写入raft集群\nboolean success = raftNode.replicate(data, Raft.EntryType.ENTRY_TYPE_DATA);\nExample.SetResponse response = Example.SetResponse.newBuilder().setSuccess(success).build();\n```\n```\n// 数据读取主要逻辑，由具体应用状态机实现\nExample.GetResponse response = stateMachine.get(request);\n```\n\n3. 服务端启动逻辑\n```\n// 初始化RPCServer\nRPCServer server = new RPCServer(localServer.getEndPoint().getPort());\n// 应用状态机\nExampleStateMachine stateMachine = new ExampleStateMachine();\n// 设置Raft选项，比如：\nRaftOptions.snapshotMinLogSize = 10 * 1024;\nRaftOptions.snapshotPeriodSeconds = 30;\nRaftOptions.maxSegmentFileSize = 1024 * 1024;\n// 初始化RaftNode\nRaftNode raftNode = new RaftNode(serverList, localServer, stateMachine);\n// 注册Raft节点之间相互调用的服务\nRaftConsensusService raftConsensusService = new RaftConsensusServiceImpl(raftNode);\nserver.registerService(raftConsensusService);\n// 注册给Client调用的Raft服务\nRaftClientService raftClientService = new RaftClientServiceImpl(raftNode);\nserver.registerService(raftClientService);\n// 注册应用自己提供的服务\nExampleService exampleService = new ExampleServiceImpl(raftNode, stateMachine);\nserver.registerService(exampleService);\n// 启动RPCServer，初始化Raft节点\nserver.start();\nraftNode.init();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenweihu86%2Fraft-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwenweihu86%2Fraft-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwenweihu86%2Fraft-java/lists"}