首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

Golang 写的即时通讯服务器 gim

2019-12-31

gim是一个即时通讯服务器,代码悉数运用golang完结。主要功能

1.离线音讯同步

2.多事务接入

3.单用户多设备同时在线

4.单聊,群聊,以及超大群谈天场景 5.支撑服务水平扩展

数据库:Mysql+Redis

组件:grpc+jsoniter+zap

1.首要装置MySQL,Redis

2.创立数据库gim,履行sql/create_table.sql,完结初始化表的创立 3.下载代码到你本地 4.修正conf/conf.go装备文件,使之和你本地装备共同

5.别离切换到app的connect和logic目录下,履行go run main.go,发动衔接层服务器和逻辑层服务器

6.切换到test目录下,发动测验脚本

7.运用public/util/aes.go的GetToken获取token

8.运用rpc接口发送音讯

1.首要生成私钥和公钥 2.在app表里依据你的私钥添加一条app记载

3.将app_id和公钥保存到事务服务器

4.将用户经过LogicClientExtServer.AddUser接口添加到IM服务器 5.经过LogicClientExtServer.RegisterDevice接口初始化设备,获取设备id 6.将app_id,user_id,device_id用公钥经过公钥加密,生成token,相应库的代码在public/util/aes.go

7.接下来运用这个token,app就可以和IM服务器交互

├─ app # 服务发动进口
│ ├── conn # 衔接层发动进口
│ └── logic # 逻辑层发动进口
├─ conf # 装备
├─ conn # 衔接层服务代码
├─ ligic # 逻辑层服务代码
├─ public # 衔接层和逻辑层公共代码
├─ sql # 数据库建表句子
├─ test # 测验脚本
├─ docs # 项目文档

遵从TLV的协议格局,一个音讯包分为三部分,音讯类型,音讯包内容长度,音讯内容。

这儿为了削减内存分配,拆出来的包的内存复用读缓存区内存。

拆包流程:

1.首要从体系缓存区读取字节流到buffer

2.依据包头的length字段,检查报的value字段的长度是否大于等于length

3.假如大于,回来一个完整包,重复过程2

4.假如小于,将buffer的有效字节前移,重复过程1

1.connect

保持与客户端的TCP长衔接,心跳,以及TCP拆包粘包,音讯编解码 2.logic

音讯转发逻辑,设备信息,用户信息,群组信息的操作

用户的音讯保护一个自增的序列号,当客户端TCP衔接断开从头树立衔接时,首要要做TCP长衔接的登录,然后用客户端本地现已同步的最大的序列号做音讯同步,这样就可以确保离线音讯的不丢掉。

当用户发送音讯时,除了将音讯发送意图用户

在DB中,每个用户只保护一个自己的音讯列表,可是用户的每个设备各自保护自己的同步序列号,设备运用自己的同步序列号在音讯列表中做音讯同步

单聊和一般群组选用写分散,超级大群运用读分散。

读分散和写分散的选型。

首要解释一下,什么是读分散,什么是写分散

简介:群组成员发送音讯时,也是先树立一个会话,都将这个音讯写入这个会话中,同步离线音讯时,需求同步这个会话的未同步音讯

长处:每个音讯只需求写入数据库一次就行,削减数据库拜访次数,节约数据库空间

缺陷:一个用户有n个群组,客户端每次同步音讯时,要上传n个序列号,服务器要对这n个群组别离做音讯同步

简介:便是每个用户保持一个音讯列表,当有其他用户给这个用户发送音讯时,给这个用户的音讯列表刺进一条音讯即可

长处:每个用户只需求保护一个序列号和音讯列表

缺陷:一个群组有多少人,就要刺进多少条音讯,当群组成员很多时,DB的压力会增大

1.支撑离线音讯同步

2.群组成员越多,DB压力越大

1.DB压力不会跟着群组成员的人数的添加而添加

2.不支撑离线音讯同步

https://github.com/alberliu/gim

热门文章

随机推荐

推荐文章