《高性能的RTC服务器OpenFire》—第一章部署与源码调试

前言

OpenFire是什么,以及它能做什么?或许这是许多开发人员最关心的一个话题。简单来说,OpenFire是一个采用纯Java语言编写(核心架构使用Mina构建)的开源RTC(Real-Time Communications,实时协作)服务器。它采用XMPP协议进行分布式通信,该协议的前身其实就是基于Jabber协议,只不过XMPP对其进行了部分扩展。说到底XMPP协议无非就是一个基于TCP/IP协议的扩展协议,它采用XML的方式进行数据传输,以此满足体系结构的中立

当大家对OpenFire有一个大致的认识和了解后,我们再来探讨OpenFire能做什么。即时通信(IM,Instant Messenger)相信大家都应该听说过,比如我们常用的QQ、微信、米聊等等都是IM系统。那么这和OpenFire有什么关系呢?OpenFire既然是RTC服务器,自然开发人员就可以利用它构件一个具备高性能的即时通信服务器。OpenFire的性能如何呢?经过笔者和同事对其进行压力测试后发现,一台主流的8/16G服务器,在不集群(cluster)的情况下,使用多个Connection Manager(连接管理器)对OpenFire进行连接负载均衡,并对OpenFire做了一定的优化后,其完全可以承受住约10-20万左右的并发操作,如果session中不存储集合对象,抗住30-40万左右的高并发操作也不是没有可能。假设OpenFire无法满足你的应用需求时,开发人员完全可以对OpenFire的源码进行二次开发,使用插件的方式对其功能进行扩充,这一切都是OpenFire带给你的实惠。

当然,如果你仍然觉得OpenFire的性能还是无法满足于你的需求时,假设你具备扎实的NIO或者AIO编程经验,笔者完全支持并赞成你自己研发一个通信服务器,如果你做不到,那么请耐心并仔细的研究如何优化OpenFire的运行性能。要是想达到微信那种过亿用户连接数,千万级并发量,从理论上来说整体的系统架构必然非常复杂,这个时候架构师需要考虑的问题太多,比如:服务器之间如何集群?如何实现模块化部署?如何构建分布式缓存?海量数据如何处理?缓冲区如何构建?容灾或容错策略如何解决?带着这些疑问,笔者希望大家在工作或者是闲暇之余,耐心的思考下。

目录

一、配置OpenFire服务器

二、使用Spark+OpenFire的组合构建

三、使用Smack API与OpenFire建立连接通信

四、调试OpenFire源码

一、配置OpenFire服务器

所谓工欲善其事,必先利其器。我们在配置或二次开发OpenFire服务器之前,首先应该去官网下载OpenFire相关的一些构件和程序。大家可以登录http://www.igniterealtime.org/downloads/index.jsp站点进行下载,笔者本文所有示例均使用OpenFire3.2.8的最新版本,为了避免和本文示例不一致,建议大家下载和本文一致的OpenFire版本,如图1-1所示。

图1-1 OpenFire下载页面

笔者上述红框部分都是大家需要进行下载的,其中包括OpenFire服务器以及源码、Spark和Smack。Spark是利用Smack API进行与OpenFire服务器通信的客户端程序,而Smack就是提供给开发人员使用的基于XMPP协议的API。当成功下载好OpenFire服务器后,我们首先将其解压,然后在openfile/bin目录下找到openfire.exe,双击即可启动OpenFire服务器,如图1-2所示。

图1-2 启动OpenFire服务器

当成功启动OpenFire的服务器后,我们输入:http://127.0.0.1:9090进入OpenFire服务器的管理页面。OpenFire管理页面的端口为9090,缺省账号和密码都是admin。如果是第一次登录OpenFire服务器的管理页面,我们则需要配置一些初始信息,当成功配置好后,我们便可以完成登录,如图1-3所示。

图1-3 OpenFire的管理页面

OpenFire的管理页面包含5个菜单选项,分别是服务器基本信息配置选项、用户组管理选项、会话管理选项、分组聊天选项和插件选项。其中服务器基本信息配置选项主要包含了OpenFire的一些常规配置,比如端口的配置、系统属性设置、缓存设置、数据库设置(OpenFire提供了自带的嵌入式数据库)等等。而用户组管理选项可以用来管理注册用户。会话管理选项则用于管理客户端连接。分组聊天选项则用于管理会话组。而插件选项主要是用于添加开发人员对OpenFire服务器管理页面的功能扩充。

二、使用Spark+OpenFire的组合构建

Spark其实就是利用Smack API进行与OpenFire服务器通信的客户端程序。当成功下载好Spark后,大家首先需要进行安装,然后注册登录用户,最后便可完成登录,添加用户进行会话。其实OpenFire+Spark也是官方推荐的最佳组合,Spark主要是采用Swing进行开发,页面也比较漂亮。如果是企业局域网使用,完全可以无需修改Spark和OpenFire的源码,直接构建通信雏形即可,如图2-1所示。

图2-1 Spark通信客户端

三、使用Smack API与OpenFire建立连接通信

很多时候,我们往往需要开发自己的基于XMPP协议的客户端与OpenFire进行通信,这时候我们则不会再使用Spark了。客户端可以是桌面应用,也可以是移动应用,但无论是那种客户端,使用的协议都是基于XMPP的,所以充分利用Smack API完全开发出与OpenFire服务器通信的客户端程序。

当成功下载好Smack后,我们首先应该对其进行解压,然后将所需构件导入至项目中即可。本章我们首先编写一个简单的连接示例,让大家更好的理解如何使用Smack API。

使用Smack API连接示例:

  1. import org.jivesoftware.smack.Connection;
  2. import org.jivesoftware.smack.ConnectionConfiguration;
  3. import org.jivesoftware.smack.XMPPConnection;
  4. import org.jivesoftware.smack.XMPPException;
  5. public class ConnectionTest {
  6. /**
  7. * @param args
  8. *
  9. * @author JohnGao
  10. */
  11. public static void main(String[] args) {
  12. /* 定义连接信息 */
  13. ConnectionConfiguration config = new ConnectionConfiguration(
  14. "127.0.0.1", 5222);
  15. /* 使用SASL验证 */
  16. config.setSASLAuthenticationEnabled(true);
  17. Connection conn = new XMPPConnection(config);
  18. try {
  19. /* 尝试连接服务器 */
  20. conn.connect();
  21. /* 尝试登陆服务器 */
  22. conn.login("JohnGao", "ll.520GG");
  23. } catch (XMPPException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

通过上述程序示例我们可以看出,Connection抽象类为Smack连接OpenFire的核心构件,其实现为XMPPConnection类型。XMPPConnection的构造可以包含一个ConnectionConfiguration实例,ConnectionConfiguration主要用于配置一些连接信息,并提供有setSASLAuthenticationEnabled(boolean)方法实现SASL验证机制,“true”为使用,反之为“false”。而Connection提供的connect()方法则用于与OpenFire服务器建立会话,只有成功建立会话机制后,才可以使用login()方法进行登录验证。

关于Smack API的其他使用方式,比如如何通信,如何建立分组会话,笔者则留在后续章节进行讲解。

四、调试OpenFire源码

前面几个章节的内容笔者已经详细讲解了如何使用Spark+OpenFire构建通信服务架构。但很多时候我们不可能只使用OpenFire提供的基础服务,如果当OpenFire无法满足我们的应用需求时,我们则需要对其源码进行二次开发,也就是扩充插件。当然在开始正式讲解如何进行源码的二次开发之前,我们首先来看看如何调试OpenFire的源码,这是比较重要的。

当成功下载好OpenFire的源码后,我们首先需要将其解压。然后我们构建好一个普通的Java工程,把OpenFire的源码部署进来即可,如图4-1所示。

图4-1 部署OpenFire源代码

当成功部署好OpenFire的源码后,大家应该会发现,部分源码是无法通过编译的。这是由3个原因造成的,第一是缺少OpenFire的外围构件(需要coherence.jar、coherence-work.jar、tangosol.jar)、二是代码语意错误、三是类库冲突。我们首先来解决构件问题,我们首先将所缺构件添加至build/lib目录下,然后选中这些构件并利用IDE工具的Build Path->Add Build Path选项,在项目的classpath环境中指向构件引用。接着我们来解决类库冲突问题,删除冲突类库,如图4-2所示。

图4-2 删除冲突类库

当成功删除冲突类库后,我们还需要对代码语意错误进行修复。当一切工作都准备好后,我们则可以通过ant进行源码编译。当然接下来我们还需要配置最重要的运行方式,选择IDE工具的Run AS-> Run Configurations选项,在Main选项中配置项目启动参数,如图4-3所示。

图4-3 配置项目的启动参数

成功配置好项目的启动参数后,我们接下来在Arguments选项中配置虚拟机的相关参数(-DopenfireHome="${workspace_loc:项目名称}/target/openfire"),如图4-4所示。

图4-4 配置虚拟机的相关参数

当成功配置好虚拟机的相关参数后,我们接下来还需要在ClassPath选项中配置一些项目环境,将项目中src目录下的i18n和resources包通过IDE的Advanced->Add Folders选项添加至User Entries中,如图4-5所示。

图4-5 ClassPath选项配置

当成功配置好ClassPath选项后,我们最后还需要在Common选项中配置启动项即可完成OpenFire运行方式的配置,如图4-6所示。

图4-6 启动项配置

如果成功启动项目后,IDE工具的控制台则会输出如下信息:

  1. Openfire 3.8.2 [Sep 20, 2013 2:13:12 AM]
  2. Admin console listening at http://127.0.0.1:9090

当我们使用http://127.0.0.1:9090进行访问OpenFire的管理页面时,可能会提示无法加载到admin-sidebar.xml和openfire_i18n_en.properties配置文件。那么我们最后只需要将这2个配置文件添加至项目的bin目录下即可,如图4-7所示。

图4-7 在项目bin目录中添加缺失文件

高性能的RTC服务器OpenFire的更多相关文章

  1. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  2. Netty开发实现高性能的RPC服务器

    Netty开发实现高性能的RPC服务器 RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协 ...

  3. Nginx:轻量级高性能的Web服务器

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  4. 关于搭建一个高性能网站的服务器的架设思路以及nginx测试的并发

    对于高性能网站的架设,主要就是请求量大,那我们该如何进行支撑? 考虑到下面的几个方面: 1.要减少请求,那对于开发人员来说,网站的css文件进行合并,背景图片也要合并,一般都是请求一张比较大的图片,然 ...

  5. IOS Socket 05-XMPP开始&安装服务器openfire&安装配置客户端

    1. 即时通讯技术简介(IM) 即时通讯技术(IM-Instant Messageing)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方 ...

  6. Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)

    XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊 ...

  7. XMPP 服务器 Openfire 的 Emoji 支持问题(进行部分修改)

    当前最新版3.9.3已经可以支持Emoji  ----------------------------------------------------------------------------- ...

  8. 高性能高并发服务器架构设计探究——以flamigo服务器代码为例

    这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序. 所谓高性能就是服务器能流畅地处理各个客户端的连接并尽量低延迟地应答客户端的请求:所谓高并发,指的是服务器可以同时 ...

  9. Tomcat结合Apache、Nginx实现高性能的web服务器

    一.Tomcat为什么需要与apache.nginx一起结合使用? Tomcat虽然是一个servlet和jsp容器,但是它也是一个轻量级的web服务器.它既可以处理动态内容,也可以处理静态内容.不过 ...

  10. 三、Reids(高性能)key-value服务器知识整合

    一.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 知识链接:https://www.runoob.com/redis/redis-backup.html ht ...

随机推荐

  1. docker REPOSITORY 改名

    创建新的名称: docker tag oldname:tag newname:tag 删除旧的名称: docker rmi oldname:tag

  2. win10子系统docker搭建gitlab Server

    心血来潮想搞一套cicd玩玩,结果开始就掉坑里了. 遇到问题 不会写文,所以语言组织比较差,将就看着吧!就当记录一下这个坑以后没准还能用的上. 参照https://blog.csdn.net/Mono ...

  3. ext 库及 pb_ds 在 OI 中的应用

    ext 库在 OI 中的应用 写一个帖子,防止以后忘了. pb_ds 部分 pb_ds 万能头 #include<bits/extc++.h> 来包含 ext 库中所有的头文件(例如 pb ...

  4. Http状态码502常见原因及排错思路

    Http状态码502常见原因及排错思路 502表示Bad Gateway.当Nginx返回502错误时,通常表示Nginx作为代理服务器无法从上游服务器(如:我们的后端服务器地址)获取有效的响应.导致 ...

  5. Python打包工具之pyinstaller

    前言: 近期使用PySimpleGUI开发了一款开发者工具X-助手工具,意打造成平常开发助手,无论是图片还是网址的处理等等都需要这一个工具即可,无需在网上找各个网站去找解决方案, 对于GUI的打包工具 ...

  6. [Cnblogs.Architecture][v20.5.1] 使用 AddLongToJsonConverter() 将 long 序列化为 string

    场景 浏览器的 JSON 反序列化无法完整将 long 类型转换为 number,最后一位会被四舍五入. 因此需要将 long 类型转为 string 发送到前端. 适用版本 v20.5.1 使用方法 ...

  7. 物联网CC2530按键单双击分别控制两灯

    (1)确定思路单击和双击的效果分别是怎样的(此文章采用简单的延时函数不涉及中断).首先可以定义一个普通延时delay和一个标志位count变量,这里需有个延时阈值咱们直接可以宏定义B值(这里需要注意宏 ...

  8. 下列哪个选项是对MTU的正确计算方式?

    A.   IP数据包头部 + TCP数据报头部 + 数据 B.   MAC头 + IP头 + TCP头 + 数据 C.   MAC头 + IP头 + TCP头 + 数据 + FCS D.   前同步码 ...

  9. Fiddler模拟网络超时

    前情 最近在优化接口请求错误的报错提示,希望尽可能的能从提示语知道当前错误大致原因,于是我需要模拟各种错误请求的状况. 问题 网络超时是很常见的接口请求错误情况,在没有服务端配合的情况下,我需要怎样来 ...

  10. SpringBoot 整合Swagger2 踩坑记录

    SpringBoot 整合Swagger2 踩坑记录 Failed to start bean 'documentationPluginsBootstrapper'; nested exception ...