WebRTC项目框架及工程组件配置

引言

该文主要对WebRTC项目业务部分涉及的框架、工程组件、组件间的依赖关系、配置文件等进行一个不完全地整理,以方便后续开发与部署。

SSH框架

系统在框架选型方面采用了Web框架SSH(Struts2-Spring-Hibernate),它是目前甚为流行的一种Web应用程序开源集成框架,用于扩展性强、易于维护、灵活复用的多层Web应用程序。SSH框架层次结构图如下图所示:

ssh

Struts2

处于表示层,负责细化项目的层次结构、MVC模式的剥离和控制业务逻辑,是系统整体的基础架构。

Spring

处于业务层,通过引入控制反转(Inversion of Control,IoC)的面向对象法则,借助依赖注入(Dependency Injection,DI)和注解(Annotation)作为实现,削减程序的耦合度,另一方面Spring还负责查找、定位、创建和管理对象及对象间的依赖关系。

Hibernate

处于持久层,通过对象关系映射,对JDBC(Java Database Connectivity)对象进行了轻量级封装,开发者可使用面向对象思想操纵数据库。

MVC设计模式

软件实现层面,系统采用MVC(Model-View-Controller)分层设计模式实现,即分为Model(模型层)存储持久数据,Controller(控制层)操作业务流程,View(视图层)主管界面交互,具体如下图所示:

mvc

用户通过浏览器与视图层的JSP页面交互,然后通过Struts中的Action组件进行业务处理、数据校验、页面定向等。Manager层封装了对数据库表的底层操作,提供若干名称具象、明确的方法供Action层调用。通常情况下,Manager层和DAO层与数据库表一一对应,并由Manager层调用DAO层操作数据库,DAO层主要负责数据持久工作,结合Hibernate组件、配置文件和HQL(Hibernate Query Language)语言,以面向对象思想实现CRUD(Create-Retrieve-Update-Delete)操作,Model层存储对应数据库表的实体类,是DAO层的操作单位。

工程组件图

为了使系统内部各功能模块间的耦合性更低,职责划分更加明确,我们进一步将系统拆分为了若干的工程组件。组件划分使得系统各功能间的依赖性与耦合性较小,组件间仅由接口连接,当某一组件发生运行错误时,不会连同造成其它组件崩溃,用户仍可使用剩余的功能。组件及其依赖关系如下:

zujiantu

上图中组件的具体功能如下表所示:

组件缩写组件全称组件功能
WMSWarehouse Management System登录管理系统
WCLWebRTC ClientWebRTC门户客户端
ACLAuto/Arti(Switchboard) Client总机门户客户端
WCSWebRTC Communication ServerWebRTC消息中转服务器
WCSGWebRTC Conference Signaling GatewayWebRTC会议信令网关
XMSExtended Media Server扩展媒体服务器
CONTContact通讯录客户端
ENPREnterprise企业管理客户端
AUTOSAuto Switchboard自动总机后端
ARTISArti Switchboard人工总机后端
CMCommon ModelsManager/DAO/Model层实现
CUCommon Utils通用的底层框架与工具

部署配置

系统的开发调试用到的工具包括Eclipse+Maven+Jetty+Nginx+MySQL,下面逐一对每项的配置进行说明:

1 JDK配置

出于一些兼容性考虑,本系统采用的JDK版本为jdk1.7.0_79(安装JDK和配置环境变量的过程本文不作赘述)。JDK安装完成后还有两步配置,一是将jdk1.7.0_79引入到项目中(而不使用默认的jre),二是把项目的Java编译器级别调至1.7。

1) 引入jdk1.7.0_79至工作空间

进入Project-Properties,依次按照下图过程配置:

jdk1

jdk2 jdk3 jdk4 jdk5

最后点击Finish即可引入(截图时工作空间已经引入了jdk1.7.0_79,所以无法Finish)。

2) 调整Java编译器级别至1.7

进入Project-Properties调整:

comple

2 服务器配置

Web服务器采用Jetty作为Servlet的解析容器,由于项目仍处于开发调试阶段,所以我们采用在Eclipse中安装内置Jetty插件的方法。安装方法大体两种,一种直接在Eclipse中写入run-jetty-run插件的云端下载路径自动化安装,另一种是下载好run-jetty-run安装包手动配置(run-jetty-run下载地址)。由于国内上外网速度很慢,推荐用第二种方式,就是稍微麻烦一点。具体流程可以参照如下两篇博文:

eclipse 安装jetty插件

eclipse jee配置jetty的两种方法

安装完成后对工程右键Run As-Run Jetty即可进入如下界面(或通过Run-Run Configurations打开该配置窗口):jetty注意:本系统采用的是Jetty 7.5.1.v20110908,要选这个版本,否则会找不到某些类。

3 组件配置

由于工程组件较多,每个组件运行在不同端口上的不同Jetty容器中(出于负载均衡、服务器崩溃考虑),各自也包含了若干配置文件。下表列举出了每个组件的运行端口号、Context上下文、配置文件信息(*表示需要将该文件中localhost字段改成部署服务器的IP):

组件Context运行端口配置文件
WMS/Jetty-8067app.properties*
WCL/WCLnewJetty-8066app.properties*
persistence.xml*
ACL/ACLJetty-8069app.properties*
persistence.xml*
WCS/wcsJetty-8588app.properties
persistence.xml*
CONT/ContactsJetty-8087app.properties*
ENPR/EnterpriseJetty-8088app.properties*
AUTOScom.webrtc.arti.core.ServiceJava Applicationapp.properties*
persistence.xml*
ARTIScom.webrtc.auto.core.ServiceJava Applicationapp.properties*
persistence.xml*
CM--persistence.xml*
CU---

4 数据库配置

数据库采用MySQL 5.1,安装过程及配置过程参见如下博文:

经验分享:mysql 5.1.51 安装教程详解

然后启动MySQL服务。通过Navicat可视化工具建立:

  • 本地连接:IP为localhost(或服务器IP),用户名为root,密码为123456;
  • 两个数据库:conf_server(会议服务数据库)和wms(业务服务数据库)
  • 导入SQL文件:选择utf-8编码格式,分别向2)中两个数据库运行conf_server.sql和wms.sql文件。

5 Maven配置

采用Maven对jar包进行统一管理,进行的步骤有两个:

1) 导入Maven仓库

由于外网速度慢,我们直接用系统的Maven仓库文件夹.m2覆盖至C:\Users\{用户名}\.m2下。只要覆盖好了,右键工程Run As即能看到Maven的相关操作了。

2) Maven操作

Maven提供了若干操作对jar包进行管理,我们主要用到的是Maven clean与Maven install。由于CM和CU是两个最底层的工程,其它有些工程会依赖于他们,我们优先对它们执行Maven clean操作,清除上次的Maven执行结果;再执行Maven install操作,将工程依赖的jar包安装至本地仓库.m2(Maven会自己检查jar包是否存在,若不存在则要安装)。Maven install后若控制台出现SUCCESS则表明安装成功,若出现FAILED,则多半是因为远端的jar包已经更新,而我们本地的版本太老,需要同步更新,这时我们先用Maven clean清除一下,再右键工程Maven-Update Project如下图进行更新:

mavenupdate

注意此时该工程的JDK版本和Java编译器级别会还原,我们需要再次对该工程的JDK和Java编译器级别进行修改(直接右键工程Properties,对Java Build和Java Compiler进行修改即可)。最后我们再次Maven install即可SUCCESS。

按照上述流程,对剩下的其它所有工程再次执行Maven clean和Maven install。

6 Nginx配置

项目采用Nginx作为反向代理服务器,总控这些运行在不同端口上的服务器,通过识别URL前缀的不同,分别转向至相应Jetty端口上的服务。其配置文件中的内容如下:

server {
    listen       8888;
    server_name  localhost;

    location / {
        proxy_pass http://localhost:8066;
        proxy_set_header Host $host:8888;
    }	

    location /ACL {
        proxy_pass http://localhost:8069;
        proxy_set_header Host $host:8888;
    }

    location /Enterprise {
        proxy_pass http://localhost:8088;
        proxy_set_header Host $host:8888;
    }

    location /Contacts {
        proxy_pass http://localhost:8087;
        proxy_set_header Host $host:8888;
    }

    location /http-bind {
        proxy_pass http://10.109.247.137:7070;
        proxy_set_header Host $host;
        proxy_read_timeout 120;
        proxy_send_timeout 120;
        proxy_connect_timeout 120;
        
        proxy_buffer_size           8k;
        proxy_buffers               8 32k;
        proxy_busy_buffers_size     64k;
    }
}

7 启动

工程的启动顺序只有一点需要说明:因为WCS是一个中转的信令服务器,所以如果要运行AUTOS(自动总机)与ARTIS(人工总机)这两个客户端(相对于WCS是客户端,相对于用户是服务端),则需要先把WCS启动,再启动AUTOS和ARTIS才行。其他工程的启动顺序没有要求,任意启动即可。

结语

关于WebRTC项目的配置就整理到这里啦。但愿下次再要配置项目的时候,项目组的小伙伴们都能够很快回忆起来~~

Leave a Comment.