easy-im:一款基于netty的即时通讯系统

介绍

easy-im是面向开发者的一款轻量级、开箱即用的即时通讯系统,帮助开发者快速搭建消息推送等功能。 基于easy-im,你可以快速实现以下功能:

+ 聊天软件

+ IoT消息推送

基本用法-单机版(v1分支)

项目分为easy-im-client、easy-im-server、easy-im-common三个模块。

服务端: 执行mvn package后生成easy-im-server.tar.gz,解压后至./lib目录执行命令: java -jar -Dport=8888 easy-im-server-1.0-SNAPSHOT.jar,即可启动服务端,其中port是服务端口。

客户端: 执行mvn package后生成easy-im-client.tar.gz,解压后至./lib目录执行命令: java -jar -Duserid=110 -Dusername=zhangsan -Dhost=127.0.0.1 -Dport=8888 easy-im-client-1.0-SNAPSHOT.jar。 其中userid为用户id,username为用户名,host为服务端ip,port为服务端端口,其中userid要保持唯一性。

用法: 客户端启动后,在命令行输入命令,命令格式为 command::content ,命令以英文双冒号为分隔符,现已支持如下命令:

+ 单聊 sendToUser::userId::msg

+ 群聊 sendToGroup::groupId::msg

+ 发起群聊 createGroup::userId1,userId2,userId3...

+ 广播 broadcast::msg

后续计划加入更多命令,如:

+ 退出群聊 quitGroup::groupId

+ 加入群聊 joinGroup::groupId

+ 查询所有在线用户 getAllUsers

+ 查询群聊中在线用户 getGroupUsers::groupId


计划中-集群版(v2分支)

打算将服务端做成可无限扩展的架构,使之满足高并发的需求。具体分为以下几个步骤:

增加路由层: 所有发送的消息由路由层转发给响应的服务端,服务端再由长连接转发至客户端,以此解决发送端与接收端不在同一台服务器上,无法通讯的问题

增加存储介质: 将所有群组关系、客户端与服务器的对应关系、用户信息等存储起来,可以用redis或者MySQL,也可存储历史消息

增加服务治理: 服务端如果要无限扩展,必须通过服务注册、服务发现的机制,可以通过zookeeper,或者eureka实现

架构图如下:

交互步骤:
1. 启动server,将server注册到注册中心
2. 启动路由层(route),到注册中心获取可用的server列表
3. 启动client,到route获取一个server信息(route层实现选择策略,默认轮循)
4. client与server建立长连接,并将server与client的对应关系存储至Redis或MySQL
注:
1. route层采用http对外提供无状态的服务,可以采用nginx无限扩展
2. server注册至注册中心,也可以无限扩展,用以实现百万连接
3. client之间互聊时,需发送消息至route,route到redis中查找对应的server,再将消息通过server转发至对方的client,以实现两个client不在同一台server时互聊

目前集群版(v2分支)正在计划中,欢迎有兴趣的同学共同参与,共同进步。


联系作者

  • 微信公众号

转载于:https://juejin.im/post/5c4dbfe6f265da61141cf2fa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值