{"id":37016472,"url":"https://github.com/yemingfeng/kit-message","last_synced_at":"2026-01-14T01:51:47.342Z","repository":{"id":57735336,"uuid":"384009981","full_name":"yemingfeng/kit-message","owner":"yemingfeng","description":null,"archived":false,"fork":false,"pushed_at":"2021-07-09T04:35:20.000Z","size":44,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-09T01:59:22.504Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/yemingfeng.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":"2021-07-08T05:23:18.000Z","updated_at":"2022-11-06T16:12:38.000Z","dependencies_parsed_at":"2022-08-23T20:30:19.826Z","dependency_job_id":null,"html_url":"https://github.com/yemingfeng/kit-message","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yemingfeng/kit-message","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yemingfeng%2Fkit-message","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yemingfeng%2Fkit-message/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yemingfeng%2Fkit-message/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yemingfeng%2Fkit-message/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yemingfeng","download_url":"https://codeload.github.com/yemingfeng/kit-message/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yemingfeng%2Fkit-message/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408692,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T00:40:43.272Z","status":"ssl_error","status_checked_at":"2026-01-14T00:40:42.636Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2026-01-14T01:51:46.735Z","updated_at":"2026-01-14T01:51:47.334Z","avatar_url":"https://github.com/yemingfeng.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"#### 轻量级 Java 应用消息通知中心\n\n##### 项目地址\n\nhttps://github.com/yemingfeng/kit-message\n\n##### 项目背景\n\n1. 应用集群部署，并且使用了 local cache。当要清除缓存时，通过 rpc / 消息队列清除，只能清除接收到消息的那个节点，无法清除整个应用集群的 local cache 导致，节点\n   2、节点 3 存在脏数据。\n\n![](https://raw.githubusercontent.com/yemingfeng/kit-message/master/img/Selection_014.png)\n\n2. 应用集群部署，存在耗时的计算，为了减少计算资源浪费，某个节点更新后需要通知集群内其他节点更新\n\n![](https://raw.githubusercontent.com/yemingfeng/kit-message/master/img/Selection_015.png)\n\n这里的场景本质是，消息如何广播？ 那么会有人问为什么不使用消息队列？ 因为消息队列无法很**优美**的实现这里的场景。比如说 kafka，使用不同的 consumer_group\n就可以实现，但不优雅。所以开启了 kit-message 这个项目。\n\n##### 技术清单\n\n- java11\n- springboot\n- netty\n- redis\n\n##### 核心逻辑\n\n![](https://raw.githubusercontent.com/yemingfeng/kit-message/master/img/Selection_009.png)\n\n- kit-message-center: 消息中心服务，接收 kit-message-client 订阅消息或者发布消息\n- kit-message-client：一个 Java 的轻量级 client 实现\n- kit-message-producer：基于 kit-message-client 发布消息\n- kit-message-consumer：基于 kit-message-client 订阅消息\n\n##### 快速使用\n\n###### server 启动\n\n本地启动\n\n1. 修改 kit-message-center / application.yml 中 redis 的配置，配置遵循 springboot 规范\n2. mvn clean package\n3. java -jar kit-message-server/target/kit-message-center.jar\n4. server 会监听 8800 端口\n\n###### client 使用\n\n增加依赖\n\n```xml\n\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.yemingfeng\u003c/groupId\u003e\n  \u003cartifactId\u003ekit-message-client\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n发布消息\n\n```java\nMessageProducer messageProducer = new MessageProducer(\"127.0.0.1\", 8800);\nmessageProducer.pub(\"topic1\", \"topic1:\" + i);\nmessageProducer.close();\n```\n\n订阅消息\n\n```java\nMessageConsumer messageConsumer = new MessageConsumer(\"127.0.0.1\", 8800);\nmessageConsumer.sub(\"topic1\", new BiConsumer\u003cString, String\u003e() {\n    @Override\n    public void accept(String topic, String payload) {\n      System.out.println(\"topic1_1:\" + topic + \"\\t\" + payload);\n    }\n});\n```\n\n###### 线上环境部署\n\nkit-message-server 支持集群部署，建议使用 nginx 做转发。\n\n```\nstream {\n    upstream kit-message-server {\n        server server_ip1:8800;\n        server server_ip2:8800; \n    }\n\n    server {\n       listen 8800;\n       proxy_connect_timeout 1s;\n       proxy_timeout 3s;\n       proxy_pass kit-message-server;\n    }\n}\n```\n\n##### Q\u0026A\n\n1. 这个项目使用场景？使用消息队列等中间件不香吗？\n\n答：这个项目是基于服务间消息通知这个场景的。解决问题更加明确，也更加轻量。\n\n2. 为什么不直接封装一个 redis-client 进行消息的收发？而是使用 client/server 的模式？\n\n答：kit-message-server 让项目更加通用，接入更加方便，依赖更少，管理维护成本更低。\n\n欢迎提反馈","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyemingfeng%2Fkit-message","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyemingfeng%2Fkit-message","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyemingfeng%2Fkit-message/lists"}