`
gao_xianglong
  • 浏览: 467808 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

 

《高性能的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连接示例:

import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;

public class ConnectionTest {

	/**
	 * @param args
	 * 
	 * @author JohnGao
	 */
	public static void main(String[] args) {
		/* 定义连接信息 */
		ConnectionConfiguration config = new ConnectionConfiguration(
				"127.0.0.1", 5222);

		/* 使用SASL验证 */
		config.setSASLAuthenticationEnabled(true);
		Connection conn = new XMPPConnection(config);
		try {
			/* 尝试连接服务器 */
			conn.connect();

			/* 尝试登陆服务器 */
			conn.login("JohnGao", "ll.520GG");
		} catch (XMPPException e) {
			e.printStackTrace();
		}
	}
}

 

通过上述程序示例我们可以看出,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工具的控制台则会输出如下信息:

Openfire 3.8.2 [Sep 20, 2013 2:13:12 AM]
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目录中添加缺失文件

 

至此本章的内容到此结束了,由于时间仓库,本文可能存在诸多不尽人意的地方,希望各位体谅

10
4
分享到:
评论
8 楼 zm9913 2014-12-31  
有下一章吗?
7 楼 nba 2014-02-12  
6 楼 liweifeng2007 2014-01-02  
Mark!Thank
5 楼 laozhou 2013-12-12  
性能方面呢。
4 楼 gao_xianglong 2013-09-22  
osacar 写道
期待下一章

3 楼 gao_xianglong 2013-09-22  
laizhaoshi 写道
博主辛苦了

2 楼 osacar 2013-09-22  
期待下一章
1 楼 laizhaoshi 2013-09-22  
博主辛苦了

相关推荐

    嵌入式 linux RTC 应用测试源码

    2. **RTC初始化**:在`rtc_test`程序中,首先需要打开RTC设备文件,通常通过`open()`函数实现,然后通过`ioctl()`函数与RTC设备交互,获取或设置RTC的时间和报警设置。 3. **时间读取和设置**:`rtc_ioctl`调用通常...

    delphi 三层框架开发首选 RTC 2012Q3源码版

    2. **数据绑定**:RTC支持双向数据绑定,允许用户界面与服务器端数据模型之间直接交互。这一特性使得UI更新和数据同步变得简单而直观。 3. **安全性**:RTC 2012Q3强化了安全机制,包括数据加密、身份验证和授权,...

    RTC—实时时钟,rtc实时通信,C,C++源码.zip

    C和C++源码提供了深入理解RTC工作原理的机会,可以帮助开发者优化性能,减少延迟,提高通信质量。例如,通过查看编解码器的源码,可以了解如何调整编码参数以适应不同的网络环境;通过分析网络传输部分,可以学习...

    openfire tar包

    Openfire是一款基于开源Apache许可证的实时协作(RTC)服务器,它提供了一种高效且安全的方式来实现即时通讯(IM)和在线会议。Openfire的核心技术是基于XMPP(Extensible Messaging and Presence Protocol),这是...

    RTC V6.3.2 源码版

    RTC(Real Thin Client)是一款知名的三层开发控件包,它专为快速构建高效、可靠的分布式应用程序而设计。RTC V6.3.2 源码版提供了完整的源代码,允许开发者深入理解其内部机制,并根据实际需求进行定制化开发。这款...

    RTC5 Driver_Rtc4_RTC4demo_RTC5_RTC5驱动_RTC5驱动_源码.zip

    RTC5 Driver是针对嵌入式系统中实时时钟(RTC,Real-Time Clock)的一种软件驱动程序,主要用于管理和控制硬件RTC模块。RTC4和RTC5可能是RTC芯片的不同版本或型号,而RTC4demo可能是针对RTC4芯片的一个演示或示例...

    openfire简介.pdf

    Openfire是一款由NetNease公司开发的实时协作(RTC)服务器,它采用Java语言编写,完全开源,基于XMPP(Jabber)协议。Openfire不仅遵循基本的XMPP协议(RFC3920),更进一步实现了XMPP-IM(RFC3921)协议,这使得它...

    RTC_V6_STM32F103_stm32rtc_源码

    在"RTC_V6_STM32F103_stm32rtc_源码"项目中,开发者已经实现了使用STM32F103的RTC功能,并且结合了串口通信,能够进行数据的采集和发送。 RTC模块在STM32F103中的工作原理: 1. RTC模块由电源供电,即使在主电源...

    RTC(RealThinClient) XE8 可用源码

    - **组件使用**:RTC SDK会提供一系列的控件和组件,如RTCClient、RTCSocket等,开发者可以直接拖放到界面上,与服务器进行通信。 - **自定义逻辑**:通过源码,开发者可以深入理解RTC的工作原理,并根据需求定制...

    IBM RTC的安装与设置

    "IBM RTC的安装与设置" 在本文中,我们将详细介绍 IBM Rational Team Concert(RTC)的安装和设置过程。这篇文章将指导您如何安装和设置 RTC,并创建一个 Project Area 和 Team Area,定义视图,并了解 Jazz 平台的...

    rtc1339驱动

    开发者可以通过打印日志、使用GDB(GNU Debugger)进行源码级调试,以及通过`i2c-tools`等工具进行I2C通信的检查,确保驱动正确地与RTC1339芯片通信并功能正常。 7. 压缩包子文件“rtc-1339”:这个文件很可能是RTC...

    基于ARM的RTC应用程序源码

    总的来说,这个基于ARM的RTC应用程序源码实例是学习Linux下RTC编程的一个很好的起点,它涵盖了从用户空间与内核交互、读写RTC时间到构建和部署在ARM平台上的实际操作。对于想要深入了解嵌入式系统时间管理或在ARM...

    STM32驱动RTC6705的源码

    STM32驱动RTC6705的源码分析与实现 STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计,包括各种实时时钟(RTC)应用。RTC6705是一款高效能、低功耗的实时时钟模块,它能够提供精确的时间保持...

    安卓Android源码——AdXmpp(Openfire+asmack+spark).zip

    《安卓Android源码解析——AdXmpp集成Openfire、asmack与spark》 在移动开发领域,尤其是在Android平台上,实时通信(Real-Time Communication, RTC)技术的应用越来越广泛,例如聊天应用、在线协作工具等。AdXmpp...

    RTC6659E-DataSheet_rtc6659datesheet_rtc6659_RTC6705原理图_RTC6659E-

    RTC6659E是一款高性能的实时时钟模块,它具有高精度的温度补偿晶振,能够在宽温范围内提供稳定的时钟信号。其主要特点包括低功耗运行、内置电池备份、以及多种报警和中断功能。RTC6659E的数据手册会详细介绍其工作...

    Android项目源码基于RTMP和RTC混合引擎的在线视频连麦互动直播

    RTMP可以处理大量的并发观众,而RTC则提供更高质量的音视频交互,尤其适合主播与少数观众间的私密互动。 **项目结构** 一个典型的Android直播项目通常包括以下几个关键部分: 1. **UI界面**:包括主播端和观众端的...

    rtc DS1302 源码和 datasheet

    本资源包含与DS1302 RTC相关的源码和数据手册,DS1302是一款低功耗、串行接口的实时时钟芯片。 DS1302是一款广泛使用的RTC,其特性包括: 1. **低功耗**:DS1302设计有低电流消耗模式,适合电池供电的应用。 2. **...

    libjingle连接openfire

    总的来说,libjingle0.6.14连接Openfire是一种将灵活的客户端库与强大的服务器平台相结合的方式,实现了跨平台、安全且高效的实时通信解决方案。尽管这个版本相对陈旧,但其基本原理和架构仍然对现代RTC应用有着重要...

    基于STM32F407驱动片外RTC时钟电路-嵌入式源码

    STM32F407是意法半导体公司(STMicroelectronics)推出的一款高性能、低功耗的微控制器,广泛应用于各种嵌入式应用。本知识点将围绕STM32F407如何通过I2C接口驱动片外RTC时钟电路进行详细讲解。 首先,STM32F407...

Global site tag (gtag.js) - Google Analytics