{"id":15014234,"url":"https://github.com/yomea/hangu-register","last_synced_at":"2025-06-14T03:05:24.614Z","repository":{"id":226543107,"uuid":"767917172","full_name":"yomea/hangu-register","owner":"yomea","description":"一个peer-peer的去中心化注册中心","archived":false,"fork":false,"pushed_at":"2025-01-24T08:21:59.000Z","size":372,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-14T03:03:46.482Z","etag":null,"topics":["center","netty","peer-to-peer","registry","rpc"],"latest_commit_sha":null,"homepage":"https://blog.csdn.net/qq_27785239/article/details/137174304?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22137174304%22%2C%22source%22%3A%22qq_27785239%22%7D","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/yomea.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-03-06T06:07:34.000Z","updated_at":"2025-02-08T08:15:20.000Z","dependencies_parsed_at":"2024-04-09T02:26:05.669Z","dependency_job_id":"38a9775d-7e96-4438-a8a5-9e4501aa1649","html_url":"https://github.com/yomea/hangu-register","commit_stats":{"total_commits":38,"total_committers":2,"mean_commits":19.0,"dds":0.02631578947368418,"last_synced_commit":"f5f918be4115e63b20e17da27760a27973dc9b55"},"previous_names":["yomea/hangu-register"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yomea/hangu-register","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomea%2Fhangu-register","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomea%2Fhangu-register/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomea%2Fhangu-register/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomea%2Fhangu-register/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yomea","download_url":"https://codeload.github.com/yomea/hangu-register/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomea%2Fhangu-register/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259752049,"owners_count":22905970,"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":["center","netty","peer-to-peer","registry","rpc"],"created_at":"2024-09-24T19:45:21.351Z","updated_at":"2025-06-14T03:05:24.595Z","avatar_url":"https://github.com/yomea.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hangu-register\n\n#### 一、介绍\n一个peer-peer的去中心化注册中心\n\n##### 1.1 为什么使用peer-peer的架构呢？\n- 去中心化：所有的节点都是平等的，都可以提供写与读的能力，任何一个节点挂掉都不会影响其他节点\n- 扩展性：扩容很简单，加入新的节点，只需发出新增节点的通知即可，无需复杂的成员变更信息同步，无需考虑脑裂的情况\n- 简单性：没有master的概念，没有复杂的选举流程，强领导性的集群在master挂掉之后，通常不能提供服务，因为他们需要保证各个服务的状态一致性\n- 一致性：采用的是最终一致性，会存在节点与节点之间短暂的不一致，对于注册中心来说，本人觉得应当更注重可用性和分区容错性，以得到更高的性能和稳定性\n\n##### 1.2 与redis哨兵模式对比\nredis哨兵模式采用主从架构，需要选举master，在选举过程中服务不可用，但是在数据复制过程中采用了异步复制的方式，所以严格来说redis\n只是在选举的时候使用了raft算法，数据的复制并未使用raft算法，所以在数据一致性上，它依然是最终一致性，属于CAP理论中的AP。\n\n##### 1.3 与zookeeper对比\nzookeeper采用了zab协议的主从架构，与redis相比，更加强调领导性，数据的复制必须半数以上接受提议方可提交，保证数据的分布式一致性，属于CAP理论中的CP，\n在性能上会比采用AP的差，如果集群规模N比较大，意味者要把数据成功同步到 N/2 + 1 个节点以上才能获取到数据\n\n#### 二、软件架构\n\n![在这里插入图片描述](https://raw.githubusercontent.com/yomea/hangu-register/refs/heads/master/image/img.png)\n\n从架构图中可以看到，注册中心采用了peer-peer的架构，每个节点都可以读写操作，节点与节点之间通过心跳进行增量续约，如果集群中已有其他节点\n在启动中，那么新启动的节点会向其中一个节点全量同步注册信息，当其中一个节点收到注册信息或者注销信息时，会尝试向其他的节点主动推送注册或者注销\n信息，如果推送失败，会被跳过，最终一致性可通过心跳增量续约来保证。\n\n提供者向注册中心注册并建立心跳续约，保持注册信息的有效性（过期会定时清理，消费者不能拉取到过期的数据）。\n\n消费者可向注册中心拉取信息，也可订阅信息，订阅的信息发生变化时，注册中心会主动通知消费者，消费者与注册中心通过心跳保持链接的可用性，\n如果链接失效，注册中心将从注册列表中剔除该链接\n\n#### 三、快速开始\n\n##### 3.1 项目目录结构\nhangu-register \u003cbr /\u003e\n------ hangu-center \u003cbr /\u003e\n------ hangu-client \u003cbr /\u003e\n------ hangu-common \u003cbr /\u003e\n------ hangu-register-spring-boot-starter\n\nhangu-register为项目主目录，其下有四个子模块\n- hangu-center：注册中心模块，该模块提供注册中心服务能力\n- hangu-client：客户端，用于链接注册中心的客户端，用户可依赖该模块连接注册中心\n- hangu-common：一些通用工具类\n- hangu-register-spring-boot-starter：客户端的spring-boot自动装配模块，使用springBoot的用户可依赖该模块自动启动\n\n##### 3.2 注册中心启动\n\n直接启动 hangu-center 模块里的 org.hangu.center.server.Bootstrap 类，注册中心的端口与其他节点地址的配置可在启动参数中设置：\n```yaml\nhangu:\n  center:\n    port: 9991\n    #    peer-node-hosts: localhost:9991,localhost:9992\n    peer-node-hosts: localhost:9992\n    thread:\n      core-num: 32\n      max-num: 32\n```\n\n##### 3.3 接入注册中心\n\n- 普通项目\n普通项目直接依赖 hangu-client 模块，pom.xml配置如下：\n\n```xml\n \u003cdependency\u003e\n  \u003cgroupId\u003eorg.hangu.center\u003c/groupId\u003e\n  \u003cartifactId\u003ehangu-client\u003c/artifactId\u003e\n  \u003cversion\u003e1.0-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n启动客户端\n\n```java\nClientProperties  clientProperties = new ClientProperties();\nDiscoverClient discoverClient = CenterClientStarter.start(clientProperties);\n```\n启动客户端使用了 CenterClientStarter 启动器，参数为 ClientProperties\nClientProperties 用于设置注册中心集群地址和一些心跳超时之类的参数，返回值\nDiscoverClient是一个实现了LookupService, RegistryService接口，实现了拉取注册订阅功能\n\n- springboot项目\n\n引入 hangu-register-spring-boot-starter 模块\n\n```xml\n \u003cdependency\u003e\n  \u003cgroupId\u003eorg.hangu.center\u003c/groupId\u003e\n  \u003cartifactId\u003ehangu-register-spring-boot-starter\u003c/artifactId\u003e\n  \u003cversion\u003e1.0-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n\n```\n然后在application.yml中配置集群地址即可（参数对应 ClientProperties 类的属性）\n```yaml\nhangu:\n  center:\n    peer-node-hosts: localhost:9992\n```\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyomea%2Fhangu-register","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyomea%2Fhangu-register","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyomea%2Fhangu-register/lists"}