一、Ejabberd简介
众所周知,Ejabberd是一个采用Erlang/OTP【一次性口令】写的开源即时通讯服务器,支持跨平台、分布式、容错性且基于开放标准的实时通讯系统,其也是一个功能丰富的XMPP服务器,适合小规模和超大规模部署。
一般我们在正式项目中都需要去集成IM【即时消息】功能。IM即时通讯是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;因此现目前市面上有很多第三方可以提供IM服务,如环信、融云等。但是其都有使用限制的地方
如果要实现IM:
1、如果要节省开支不使用第三方而自己开发区实现一套IM,那涉及到的东西比较多,开发难度不小。
2、另一种方案是采用XMPP,XMPP的优点是由很多的开源实现,比如服务端的ejabberd、Openfire【实时协作服务器。免费开源,基于可拓展通讯和表示协议XMPP】、iOS以及安卓端的开源库都可以使用,而且传输安全、扩展性强【环信也是基于XMPP】,但是也有缺点,比如不能传输二进制数据以及流量消耗比较大等。
二、即时通讯服务器介绍
2.1、分类
1、Jabber
Jabber 作为有名的即时通讯服务器,能够让用户自己假设即时通讯服务器,可以在Internet上应用,也可以在局域网中应用。
Jabber是一个基于XMPP协议的IM应用。
2、Jabberd
Jabberd 是一个XMPP 的即时聊天服务器,是新一代的 Jabberd 项目
3、XMPP
XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,用于即时消息(IM)以及在线现场探测,组建服务器之间的准即时操作。是一种在两个地点间传递小型结构化数据的协议。在此基础上,XMPP协议已经被用来构建大规模即时通信系统、游戏平台、协作空间及语音和视频会议系统。
这个协议的作用是使得互联网用户向互联网上的其他任何人发送即时消息,即时其操作系统和浏览器不同。
XMPP的技术来自于Jabber,其实它是Jabber的核心协定,所以经常XMPP经常被误认为是Jabber协议。
如微信、陌陌均采用了XMPP协议
XMPP有众多系统:发布-订阅服务、多人聊天、表单检索与处理、服务发现、实时数据传输、隐私处理及远程过程调用等。
大多数社交媒体(Facebook和Twitter)也采用了XMPP协议。
XMPP聊天原理:
XMPP是基于xml类型进行消息传递的。所有的消息传递类型都是xmpp类型的。
(1)发送消息类型:
<message type="chat" to="110095@domain" id="d851f47818db46b58abf4e982327ab36"><request xmlns="urn:xmpp:receipts"></request><body>{
"messageId" : "d851f47818db46b58abf4e982327ab36", //messageid
"content" : "你好", //消息内容
"fromUserName" : "张三", //发送人
"isSecret" : 0, //单聊是否是密聊消息 0:正常聊天 1:密聊
"timeLen" : 0,
"isAt" : 0, //群聊是否@人
"timeSend" : 1522034423, //发送时间
"type" : 1 //消息类型
}</body></message>
(2)接收消息类型:
<message xmlns="jabber:client" id="cdc6007ca03b401f8c9e4a2ccb75d8d5" type="chat" to="111751@domain" from="109965@domain/resource"><request xmlns="urn:xmpp:receipts"></request><body>{
"messageId" : "cdc6007ca03b401f8c9e4a2ccb75d8d5",
"content" : "天津",
"fromUserName" : "李四",
"isSecret" : 0,
"timeLen" : 0,
"isAt" : 0,
"timeSend" : 1522034878,
"type" : 1
}</body></message>
(3)发送回执消息类型:
<message to="109965@domain/resource" type="chat"><received xmlns="urn:xmpp:receipts" id="cdc6007ca03b401f8c9e4a2ccb75d8d5"/></message>
(4)接收回执消息类型:
<message xmlns="jabber:client" type="chat" to="111751@domain/resource" from="109965@domain/resource"><received xmlns="urn:xmpp:receipts" id="626b61f461eb485fa99177b69512273e"></received></message>
实现流程:
客户端A给客户端B发送一条消息,消息先从客户端A传到服务器,服务器通过判断客户端B是否在线,如果在线的就直接把消息推送给客户端B,客户端B收到消息以后,则发送后回执,服务器收到回执以后再推给客户端A。
如果客户端B不在线,则消息在服务器端保存,服务器发送回回执告诉客户端A发送消息成功,等客户端B上线以后再把消息推送给客户端B。
常见问题解决:
问题:如果客户端A给B推送消息时,客户端B正好此时进入后台。由于后台心跳检测还没有检测到B已经离线,这个时候服务器会把消息推送给客户端B,并且服务器没有保存这条消息。而此时客户端B已经进入后台,无法接收到消息,也就无法发送回执。会造成客户端A发送消息失败。
解决方法:服务器每次收到客户端A都会发送的消息,都会由服务器发送回执告诉A已经发送成功。客户端首先保存聊天信息,再客户端B是否在线。如果在线,则发送消息,接受回执,如果没有收到回执,则当成不在线,保存聊天消息为未发送状态,下次等客户端B连线后推送。
三、Ejabberd主要功能
1、跨平台
Ejabberd可以运行在Windows系统和类Unix系统,如Linux,FreeBSD或BSD等中
2、分布式
可以在 一个集群的机器上运行Ejabberd,并且所有的机器都服务于同一个或一些Jabbe域,当你需要更大容量时,可以增加一个廉价节点到集群中,因此,不需要买一个昂贵的机器来支持上万个并发用户。
3、容错
可以部署一个Ejabberd集群,这样一个正常运行的服务的所有必须信息将被复制到所有节点,这意味着如果其中一个节点崩溃了,其他节点将无终端的继续运行,另外,也可以‘不停机’增加或更换节点。
4、易管理
因为Ejabberd建立于开源的Erlang,所以不需要安装外服数据库、外部的web服务器,而且每个东西都包含在里面,处于开箱即用状态。
5、开放标准
Ejabberd是完全支持XMPP标准的开源Jabber服务器
(1) 完全兼容XMPP;
(2) 基于XML的协议;
(3) 支持的协议很多。
6、模块化
(1) 只装载你想要的模块;
(2) 用自定义模块扩展Ejabberd
7、数据库支持
(1) 支持原生的MySQL;
(2) 支持原生PostgreSQL;
(3) 支持ODBC数据存储;
(4) 支持 SQL Server
四、Ejabberd服务器搭建步骤
注:搭建环境需求
因为要实现即时通讯IM服务,所以首先要搭建一个XMPP服务器,这里采用ejabberd来作为服务器。
由于Ejabberd采用Erlang语言编写,比较适合于高并发的情景。
1、安装Erlang
安装erlang有两种方法:
方法一:
#1、首先下载:http://erlang.org/download/otp_src_20.3.tar.gz
或者采用
wget http://erlang.org/download/otp_src_20.3.tar.gz
#2、然后解压:
tar -xvf otp_src_20.3.tar.gz
#3、准备环境
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
#4、进入目录
cd otp_src_20.3
#5、设置安装规则
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac
#6、编译、安装
make && make install
#7、然后配置环境变量
vim /etc/profile
#加入配置
#set erlang environment
ERL_PATH=/usr/local/erlang/bin
PATH=$ERL_PATH:$PATH
#8、使配置生效:
source /etc/profile
#9、检验是否安装成功:
erl
方法二:安装的是最新版的
#1.先下载rpm包
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
#2.rpm包:
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
#3.安装erlang
sudo yum install erlang
#4.检查
erl
#5.查看安装路径
whereis erlang
执行后查询结果如下:
二、安装ejabberd
1、先下载ejabberd支持的协议
官网下载链接:https://www.process-one.net/en/ejabberd/protocols/
2、根据自己实际情况,下载合适软件(二进制文件)
3、下载完成后,将文件上传至服务器
可采用rz命令 或者 FileZilla 进行上传
上传完成后,默认文件为rw 权限,ejabberd-21.07-linux-x64.run
#修改权限为可执行权限
chmod 755 ejabberd-21.07-linux-x64.run
#然后执行该文件
sh ejabberd-21.07-linux-x64.run
这里执行过程,步骤非常多,一路可以回车
【确定, 需要敲Y的地方Y】
集群配置时可以根据自身需求:这里输入N
ejabberd默认安装在 /opt/ejabberd-21.07 目录下
注:到域名这个地方的时候,建议输入自己服务器的IP地址。
4、启动服务
安装成功后,进入 /opt/ejabberd-21.07/bin/目录下,执行
./start # 执行
执行完成后,然后查看状态
./status # 查看运行状态
注意:stop和start需要等待一小段时间完成,千万不要命令没有执行完就强制退出
如果提示 Failed RPC connection to the node ejabberd@localhost: nodedown
则可以reboot重启系统,或者
ps -ef | grep ejabberd
然后kill 掉进程 重新启动
./start
5、此时,就可以进行访问了
输入你配置的http://IP:5280/admin
即可进入登录页面
6、成功执行后,在bin目录下执行
./ejabberdctl register admin 192.168.10.51 123456
然后就可以在浏览器中输入 http://IP:5280/admin 访问了
输入用户名密码