{"id":19699126,"url":"https://github.com/oikomi/fishchatserver2","last_synced_at":"2025-04-05T11:12:11.592Z","repository":{"id":57486525,"uuid":"60144029","full_name":"oikomi/FishChatServer2","owner":"oikomi","description":"FishChatServer2","archived":false,"fork":false,"pushed_at":"2017-02-27T08:16:51.000Z","size":84926,"stargazers_count":534,"open_issues_count":7,"forks_count":169,"subscribers_count":62,"default_branch":"master","last_synced_at":"2025-04-05T11:11:33.353Z","etag":null,"topics":["docker","golang","im","kubernetes"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oikomi.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":"2016-06-01T03:56:36.000Z","updated_at":"2025-02-26T11:34:12.000Z","dependencies_parsed_at":"2022-09-01T21:02:24.040Z","dependency_job_id":null,"html_url":"https://github.com/oikomi/FishChatServer2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oikomi%2FFishChatServer2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oikomi%2FFishChatServer2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oikomi%2FFishChatServer2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oikomi%2FFishChatServer2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oikomi","download_url":"https://codeload.github.com/oikomi/FishChatServer2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247325694,"owners_count":20920714,"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":["docker","golang","im","kubernetes"],"created_at":"2024-11-11T20:01:22.294Z","updated_at":"2025-04-05T11:12:06.575Z","avatar_url":"https://github.com/oikomi.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FishChatServer2\n\n[![Build Status](https://travis-ci.org/oikomi/FishChatServer2.svg?branch=master)](https://travis-ci.org/oikomi/FishChatServer2)\n[![Go Report Card](https://goreportcard.com/badge/github.com/oikomi/FishChatServer2)](https://goreportcard.com/report/github.com/oikomi/FishChatServer2)\n\n目录\n=================\n* [1说明](#1说明)\n* [2特性](#2特性)\n* [3架构](#3架构)\n* [4协议](#4协议)\n* [5数据模型](#5数据模型)\n* [6服务说明](#6服务说明)\n* [7依赖](#7依赖)\n* [8部署](#8部署)\n    * [8.1普通部署](#8.1普通部署)\n    * [8.2容器部署](#8.2容器部署)\n* [9测试](#9测试)\n* [10监控](#10监控)\n\n\n1说明\n======\n吸取了第一版的经验以及我们商业版的探索. 第二版我更多的思考在不要过多的实现轮子, 这个版本将很多业务无关的代码去掉, 并且尽量靠拢`微服务`.\n部署方式可以支持：\n\u003e * 普通部署\n\u003e * 容器部署 (Kubernetes + Docker)\n\n\n2特性\n======\n\n\n**[⬆ 回到顶部](#目录)**\n\n3架构\n======\n\n![](./doc/architecture.png)\n\n### 3.1聊天设计方案\n\n这里简单陈述一下消息的设计思路, 如下\n\n![](./doc/msg.png)\n\n其中:\n\n1 消息是通过版本号维护的, 是一个递增的int64整数, 由`idgen`提供服务, 每个用户都有一个独立的自增id\n\n2 新消息到达, 服务端只负责发送给客户端一个轻量级的notify通知\n\n3 客户端收到notify后, 发起同步请求\n\n\n### 3.2存储方案\n\n其中最关键的是HBase存储, 所有的消息通过Kafka消费后将插入HBase中, 消息存储的时候会带上递增的版本号. 这样客户端带上一个版本号来请求消息的时候, \n将只返回大于此版本号的消息列表.\n\n\n**[⬆ 回到顶部](#目录)**\n\n4协议\n======\n在`protocol`目录下\n\n* external 是对外的协议，采用`protobuf`实现\n* rpc 是服务内部的调用，采用`grpc`\n\n**[⬆ 回到顶部](#目录)**\n\n5数据模型\n======\n在`doc/db`目录下\n\n\n**[⬆ 回到顶部](#目录)**\n\n6服务说明\n======\n进入server目录下\n\n```shell\naccess\ngateway\nlogic\nmanager\nnotify\nregister\n```\n\n**[⬆ 回到顶部](#目录)**\n\n7依赖\n======\n\n### 7.1系统环境\n```shell\ngolang \u003e= 1.4\njdk \u003e= 1.8 (数据处理很多服务用java编写)\n```\n\n```shell\ngo get -u -d github.com/golang/glog\ngo get -u -d github.com/coreos/etcd\ngo get -u -d github.com/Shopify/sarama\ngo get -u -d github.com/wvanbergen/kafka/consumergroup\ngo get -u -d github.com/tsuna/gohbase\ngo get -u -d github.com/garyburd/redigo/redis\ngo get -u -d github.com/BurntSushi/toml\ngo get -u -d gopkg.in/olivere/elastic.v5\ngo get -u -d gopkg.in/mgo.v2\ngo get -u -d github.com/go-sql-driver/mysql\ngo get -u -d github.com/satori/go.uuid\n```\n\n\n### 7.2第三方依赖\n\n```shell\netcd 3.0以上版本\nredis \nMysql\nkafka\nHBase\nElasticSearch(可选)\n```\n\n**[⬆ 回到顶部](#目录)**\n\n8部署\n======\n\n### 8.1普通部署\n\n为了方便, 我们在单机上进行部署 (实际部署的时候, 每个服务角色都可以自由水平扩展)\n\n#### 8.1.1依赖安装\n\n* kafka安装 : http://kafka.apache.org/quickstart (默认启动即可)\n\n安装完成之后创建两个topic:\n\n```shell\np2p topic:\nbin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic logic_producer_p2p\n\ngroup topic:\nbin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic logic_producer_group\n\n```\n\n* HBase安装 : \n\n安装完成之后创建:\n\n```shell\ncreate 'im', 'user', 'msg'\n```\n\n* redis安装 : 采用默认安装即可\n\n* mysql安装 : 采用默认安装即可\n\n* etcd安装 : 需要3.0以上版本, 采用默认安装即可\n\n#### 8.1.2server安装\n\n进入server下面的各个目录 运行 `go build`, 然后启动服务即可(因为服务做了`服务发现`, 所以对启动顺序没有要求), 这里为了简单, 每个服务我们只启动一个, 当然启动任意个都是支持的.\n\n* gateway安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd server/gateway \n➜  gateway git:(master) ✗ go build\n➜  gateway git:(master) ✗ ./gateway \n```\n\n* access安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd server/access \n➜  access git:(master) ✗ go build\n➜  access git:(master) ✗ ./access \n```\n\n* logic安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd server/logic \n➜  logic git:(master) ✗ go build\n➜  logic git:(master) ✗ ./logic \n```\n\n\n* register安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd server/register \n➜  register git:(master) ✗ go build\n➜  register git:(master) ✗ ./register \n```\n\n* notify安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd server/notify\n➜  notify git:(master) ✗ go build\n➜  notify git:(master) ✗ ./notify\n```\n\n* manager安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd server/manager \n➜  manager git:(master) ✗ go build\n➜  manager git:(master) ✗ ./manager \n```\n\n#### 8.1.3job安装\n\n* msg-job安装(Java)\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd jobs/msg-job\n➜  msg-job git:(master) ✗ mvn clean package  -Dmaven.test.skip=true\n➜  msg-job git:(master) ✗ java -jar  msg-job-core/target/msg-job-core-1.0-SNAPSHOT.jar\n```\n\n#### 8.1.4中间件服务安装\n\n* idgen安装\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd service/idgen \n➜  idgen git:(master) ✗ go build\n➜  idgen git:(master) ✗ ./idgen \n```\n\n\n### 8.2容器部署\n\n部署完全采用`Kubernetes + Docker`\n\n所以第一步需要搭建`Kubernetes`和`Docker`, 幸运的是现在网络上已经有大量的资料了, 这块我就不多写了.\n\n**[⬆ 回到顶部](#目录)**\n\n\n9测试\n======\n### 9.1点对点聊天测试\n进入client/p2p目录, 用户可以启动两个以上的进程, 两两之间互相聊天\n\n```shell\n➜  FishChatServer2 git:(master) ✗ cd client/p2p \n➜  p2p git:(master) ✗ go build\n➜  p2p git:(master) ✗ ./p2p \n输入我的id :321\n输入对方的id :收到点对点消息: 返回码[0], 对方ID[321], 消息内容[hello]\n```\n\n### 9.2群聊测试\n\n\n**[⬆ 回到顶部](#目录)**\n\n10监控\n======\n\n**[⬆ 回到顶部](#目录)**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foikomi%2Ffishchatserver2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foikomi%2Ffishchatserver2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foikomi%2Ffishchatserver2/lists"}