在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:CookIM开源软件地址:https://gitee.com/cookeem/CookIM开源软件介绍:CookIM - 一个基于akka的分布式websocket聊天程序
目录###演示 PC演示手机演示演示地址以Docker-Compose方式启动CookIM集群启动集群进入CookIM所在目录,运行以下命令,以docker-compose方式启动CookIM集群,该集群启动了三个容器:mongo、cookim1、cookim2 $ git clone https://github.com/cookeem/CookIM.git$ cd CookIM$ sudo docker-compose up -dCreating mongoCreating cookim1Creating cookim2 成功启动集群后,浏览器分别访问以下网址,对应不同的CookIM服务 增加节点可以通过修改docker-compose.yml文件增加CookIM服务节点,例如增加第三个节点cookim3: cookim3: image: cookeem/cookim container_name: cookim3 hostname: cookim3 environment: HOST_NAME: cookim3 WEB_PORT: 8080 AKKA_PORT: 2551 SEED_NODES: cookim1:2551 MONGO_URI: mongodb://mongo:27017/local ports: - "8082:8080" depends_on: - mongo - cookim1 调试容器查看cookim1容器日志输出 $ sudo docker logs -f cookim1 进入cookim1容器进行调试 $ sudo docker exec -ti cookim1 bash 停止集群$ sudo docker-compose stop$ sudo docker-compose rm -f 运行本地运行需求
获取源代码git clone https://github.com/cookeem/CookIM.gitcd CookIM 配置与打包配置文件位于 mongodb { dbname = "cookim" uri = "mongodb://mongo:27017/local"} 对CookIM进行打包fatjar,打包后文件位于 sbt clean assembly 启动CookIM服务CookIM的数据保存在MongoDB中,启动CookIM前务必先启动MongoDB a. 调试方式启动服务: $ sbt "run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551" b. 打包编译: $ sbt assembly c. 产品方式启动服务: $ java -classpath "target/scala-2.11/CookIM-assembly-0.2.4-SNAPSHOT.jar" com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551 以上命令启动了一个监听8080端口的WEB服务,akka system的监听端口为2551 参数说明: -a -h [-m ] [-n] -s -w-a,--akka-port akka cluster node port-h,--host-name current web service external host name-m,--mongo-uri mongodb connection uri, example:mongodb://localhost:27017/local-n,--nat is nat network or in docker-s,--seed-nodes akka cluster seed nodes, seperate withcomma, example:localhost:2551,localhost:2552-w,--web-port web service port 打开浏览器,访问以下网址8080启动另一个CookIM服务打开另外一个终端,启动另一个CookIM服务,测试服务间的消息通讯功能。 a. 调试方式启动服务: $ sbt "run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551" b. 产品方式启动服务: $ java -classpath "target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar" com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551 以上命令启动了一个监听8081端口的WEB服务,akka system的监听端口为2552 打开浏览器,访问以下网址8081该演示启动了两个CookIM服务,访问地址分别为8080端口以及8081端口,用户通过两个浏览器分别访问不同的的CookIM服务,用户在浏览器中通过websocket发送消息到akka集群,akka集群通过分布式的消息订阅与发布,把消息推送到集群中相应的节点,实现消息在不同服务间的分布式通讯。 架构整体服务架构CookIM服务由三部分组成,基础原理如下:
akka stream websocket graph
MongoDB数据库说明
*login(登录邮箱)nickname(昵称)password(密码SHA1)gender(性别:未知:0,男生:1,女生:2)avatar(头像,绝对路径,/upload/avatar/201610/26/xxxx.JPG)lastLogin(最后登录时间,timstamp)loginCount(登录次数)sessionsStatus(用户相关的会话状态列表) [{sessionid: 会话id, newCount: 未读的新消息数量}]friends(用户的好友列表:[好友uuid])dateline(注册时间,timstamp)
*createuid(创建者的uid)*ouid(接收者的uid,只有当私聊的时候才有效)sessionIcon(会话的icon,对于群聊有效)sessionType(会话类型:0:私聊,1:群聊)publicType(可见类型:0:不公开邀请才能加入,1:公开)sessionName(群描述)dateline(创建日期,timestamp)usersStatus(会话对应的用户uuid数组) [{uid: 用户uuid, online: 是否在线(true:在线,false:离线}]lastMsgid(最新发送的消息id)lastUpdate(最后更新时间,timstamp)
*uid(消息发送者的uid)*sessionid(所在的会话id)msgType(消息类型:)content(消息内容)fileInfo(文件内容) { filePath(文件路径) fileName(文件名) fileType(文件mimetype) fileSize(文件大小) fileThumb(缩略图) }*dateline(创建日期,timestamp)
*id(唯一标识)*uid(在线用户uid)dateline(更新时间戳)
noticeType:通知类型("joinFriend", "removeFriend", "inviteSession")senduid:操作方uid*recvuid:接收方uidsessionid:对应的sessionidisRead:是否已读(0:未读,1:已读)dateline(更新时间戳) 消息类型有两个websocket信道:ws-push和ws-chat
/ws-push channel 上行消息,用于订阅推送消息:{ userToken: "xxx" }下行消息:acceptMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "accept", content: "xxx", dateline: "xxx" }rejectMsg: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "reject", content: "xxx", dateline: "xxx" }keepAlive: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "keepalive", content: "", dateline: "xxx" }textMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "text", content: "xxx", dateline: "xxx" }fileMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "file", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx", dateline: "xxx" }onlineMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "online", content: "xxx", dateline: "xxx" }offlineMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "offline", content: "xxx", dateline: "xxx" }joinSessionMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "join", content: "xxx", dateline: "xxx" }leaveSessionMsg:{ uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "leave", content: "xxx", dateline: "xxx" }noticeMsg: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "xxx", sessionIcon: "xxx", msgType: "system", content: "xxx", dateline: "xxx" }下行到浏览器消息格式:pushMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "xxx", content: "xxx", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx", dateline: "xxx" }
/ws-chat channel上行消息:onlineMsg: { userToken: "xxx", sessionToken: "xxx", msgType:"online", content:"" }textMsg: { userToken: "xxx", sessionToken: "xxx", msgType:"text", content:"xxx" }fileMsg: { userToken: "xxx", sessionToken: "xxx", msgType:"file", fileName:"xxx", fileSize: 999, fileType: "xxx" }<#BinaryInfo#>binary_file_array_buffer下行消息: rejectMsg: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "reject", content: "xxx", dateline: "xxx" }keepAlive: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "keepalive", content: "", dateline: "xxx" }textMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "text", content: "xxx", dateline: "xxx" }fileMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "file", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx", dateline: "xxx" }onlineMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "online", content: "xxx", dateline: "xxx" }offlineMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "offline", content: "xxx", dateline: "xxx" }joinSessionMsg:{ uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "join", content: "xxx", dateline: "xxx" }leaveSessionMsg:{ uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "leave", content: "xxx", dateline: "xxx" }noticeMsg: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "xxx", sessionIcon: "xxx", msgType: "system", content: "xxx", dateline: "xxx" }下行到浏览器消息格式:chatMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", msgType: "xxx", content: "xxx", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx", dateline: "xxx" } ChangeLog0.1.0-SNAPSHOT0.2.0-SNAPSHOT
0.2.4-SNAPSHOT
|
请发表评论