《Red5 用户参考手册》之九:Red5 核心技术第二章 将 Red5 部署到 Tomcat

官方最新《Red5 用户参考手册》全套下载地址
         前言
        本文档介绍了如何将 Red5 作为一个应用程序存档(WAR)部署到 Tomcat。标准的 Red5 的部署由一个独立的 Java 程序组成,这个 Java 程序嵌入了一个可以作为一个系统服务运行的 J2EE 容器(Jetty 或 Tomcat),而 WAR 版本的则运行在一个 J2EE 容器下。
         部署
        Tomcat 的 war deployer 会定期对 webapps 目录进行 war 扫描。如果发现了一个还没有被部署的 war,deployer 会将 war 文件展开到一个基于 war 的文件名的目录。比如一个名为 myapp.war 的 war 会被展开到一个名为 myapp 的目录,取决于你安装的 Tomcat 目录这个完整路径会类似于 C:\Tomcat- 6.0.14\webapps\myapp。
        Red5 服务会被打包成一个名为 ROOT.war 的文件,这个文件名对于大多数 J2EE 应用服务有着特殊的内涵,通常是默认的或者根 web 上下文。根 web 上下文负责不包含路径成分的服务请求。带有路径成分的 url 类似于  http://www.example.com/myapp,根 web 应用 url 类似于 http://www.example.com/。一个额外的配置文件,上下文描述符,位于每个 web 上下文的 META-INF 目录下。不使用 HTTP 访问的应用不需要 web / servlet 上下文。根 war 文件包含了几乎一个独立的服务应有的所有文件,除了嵌入的服务类和选择配置文件。
         上下文描述符
        一个上下文 XML 描述符是一个 XML 数据片段,包含有一个有效的上下文元素,这个元素通常会在 Tomcat 服务的主配置文件里找到(conf/server.xml)。对于一个给定的主机,上下文描述符定位于 $CATALINA_HOME/conf/[enginename]/[hostname]/。请注意当此文件名不依赖于 webapp 名时,当 deployer 从包含在 war 离得 context.xml 文件里创建描述符时,它们的名字会与 web 应用程序的名字相匹配。
        上下文描述符允许定义上下文的所有方面和配置参数,例如命名资源和会话管理器配置。应该注意的是定义在上下文元素中的 docBase 既可以指向 .WAR 又可以指向由 .WAR 展开创建的目录。
         Red5 配置

        Red5 的配置可以是 web.xml 中的几个上下文参数,一个上下文文件,一个 bean 的 ref 文件,也可以是一个 Spring 为每个应用的上下文文件。仅仅使用 AMF 与 Red5 进行沟通的 Web 应用不需要服务应用上下文里的配置项。根据 Web 应用类加载器的工作方式,由 Spring 管理的应用上下文只适用于包含在根 war 里的应用。此外,Red5 使用一个叫做域的上下文副本,域用作上下文、处理程序、服务核心实例和一些其他对象的容器。域类似于 FMS 中的程序模型。初始入口点或为 Red5 启动 servlet 的是 WarLoaderServlet,它像以下所示作为一个 servlet 监听器被定义在 web.xml。幸运的是这个 servlet 取代了一个标准的 Red5 服务里的独立的类。

[html]  view plain copy print ?
  1. <listener>   
  2.   <listener-class>org.red5.server.war.WarLoaderServlet</listener-class>   
  3. </listener>  

        这一监听器负责根据接收到的上下文初始化和消亡容器事件来启动和停止 Red5。war 加载器类似于 Spring 的 ContextLoaderListener servlet,但却是专门为 Red5 定制。
         Spring 上下文
        Red5 使用两种类型的上下文,"默认" 和 "web",可能仅有一个默认上下文,但可以同时有多个 web 上下文。
         默认的上下文
        默认的上下文是全局应用上下文的代名词,负责提供顶级或者全局级的对象和资源。这一级别的 Spring bean 是通过定位在 ROOT 的 classes 目录(比如. C:\Tomcat-6.0.14\webapps\ROOT\WEB-INF\classes)的 defaultContext.xml 和 beanRefContext.xml 进行配置。bean ref 文件定义了作为一个 org.springframework.context.support.ClassPathXmlApplicationContext 实例的 default.context bean。其他两个配置文件 red5-common.xml 和 red5-core.xml 用于构造默认的上下文,这些文件来自同名的独立配置文件,主要区别是服务器嵌入部分已被删除。

        默认上下文通过 parentContextKey 参数在 web.xml 进行指定:

[html]  view plain copy print ?
  1. <context-param>   
  2.   <param-name>parentContextKey</param-name>   
  3.   <param-value>default.context</param-value>   
  4. </context-param>  

        这一参数用于 ContextLoader 对父上下文的定位,而由全局资源进行对自己的定位。上下文加载器用于 WarLoaderServlet 初始化 web 上下文。

        对应于全局上下文的域是全局域,它是由 web.xml 通过 globalScope 参数进行指定的:

[html]  view plain copy print ?
  1. <context-param>   
  2.   <param-name>globalScope</param-name>   
  3.   <param-value>default</param-value>   
  4. </context-param>   

         Web 上下文

        Web 上下文的定义(文件)是 Spring 配置文件中使用 -web.xml 后缀指定的。如果你的应用名为 oflaDemo 那么它的配置文件将被命名为 oflaDemo-web.xml。不要把 Spring web 上下文文件和 J2EE 上下文描述符混淆了,Spring web 上下文文件仅仅用于 Red5 web 上下文,之后才被 Tomcat 所用。每个 web 上下文都必须具有一个相应的配置文件,这些配置文件使用 ant- 格式的参数在 web.xml 中进行配置:

[html]  view plain copy print ?
  1. <context-param>   
  2.   <param-name>contextConfigLocation</param-name>   
  3.   <param-value>WEB-INF/classes/*-web.xml</param-value>   
  4. </context-param>  

        上下文配置文件定义了用于通知应用关于加入/离开的客户端并提供客户端可以调用的方法的资源。另外,配置文件指定了类的域层次结构。每个上下文配置至少要包含有三个条目 - 上下文、域和处理程序。对于这一规则的唯一例外是根 web 应用,因为它没有处理程序,在这种情况下就要使用全局处理程序了。

                * 上下文 - 每个上下文必须分给一个唯一的名字,因为所有的上下文都存在于一个单独的 Spring 应用上下文里。根 web 上下文命名为 web.context,额外上下文在此基础上使用其 web 应用名进行加缀。比如 oflaDemo 将会被命名为 web.context.oflaDemo。一个定义在 web 上下文文件里的上下文可以像下面这样配置:

[html]  view plain copy print ?
  1. <bean id="web.context" class="org.red5.server.Context">   
  2.   <property name="scopeResolver" ref="red5.scopeResolver" />   
  3.   <property name="clientRegistry" ref="global.clientRegistry" />   
  4.   <property name="serviceInvoker" ref="global.serviceInvoker" />   
  5.   <property name="mappingStrategy" ref="global.mappingStrategy" />   
  6. </bean>   

                *   - 每个应用至少需要一个链接处理应用到上下文和服务器的域。域可以用于创建一棵树,通过这棵树客户端可以连接到每个域并在这个域中共享对象(比如共享的对象或者实时流)。你可以把域看做是 room 或实例。根域名为 web.scope,附加域应该遵循上下文的命名约束。oflaDemo 的域可以被命名为 web.scope.oflaDemo,这样它就不会与其他上下文冲突了。
                * 每个域 bean 具有以下属性:
                        1. server - 这个指的是 red5.server
                        2. parent - 当前域的父域通常是 global.scope
                        3. context - 当前域的上下文,根域使用 web.context,oflaDemo 使用 web.context.oflaDemo
                        4. handler - 当前域的处理程序,类似于 FMS 中的 main.asc
                        5. contextPath - 连接到当前域所用的路径
                        6. virtualHosts - 一个使用逗号隔开的当前域监听的主机名或者 ip 地址列表。在 war 版本中我们并不控制到主机名,这个是由 Tomcat 完成的。

        根域的定义类似于此:

[html]  view plain copy print ?
  1. <bean id="web.scope" class="org.red5.server.WebScope" init-method="register">   
  2.   <property name="server" ref="red5.server" />   
  3.   <property name="parent" ref="global.scope" />   
  4.   <property name="context" ref="web.context" />   
  5.   <property name="handler" ref="global.handler" />   
  6.   <property name="contextPath" value="/" />   
  7.   <property name="virtualHosts" value="*,localhost, localhost:8080" />   
  8. </bean>  

        contextPath 类似于 J2EE 上下文文件中为每个 web 应用定义的 docBase。docBase 用于使用 HTTP 定位资源,而 contextPath 用于通过 RTMP 寻找资源。你的应用可以在此配置路径后添加额外元素来动态创建额外的域。动态创建的域都是用同一个处理应用,但它们具有自己的属性、共享对象和实时流。

                * 处理程序 - 每个上下文需要一个域来提供连接对象调用的方法。所有的处理程序都要实现 org.red5.server.api.IScopeHandler,但你也可以实现附加接口对共享对象和实时流的访问进行控制。org.red5.server.adapter.ApplicationAdapter 是一个由 Red5 提供的实现例子,它可以用作你的基类。关于这个类的附加详细介绍请参阅其文档。oflaDemo 的域处理程序应用示例:

[html]  view plain copy print ?
  1. <bean id="web.handler.oflaDemo"   
  2. class="org.red5.server.webapp.oflaDemo.Application"/>  

        id 属性由 oflaDemo 域的定义引用到:

[html]  view plain copy print ?
  1. <bean id="web.scope.oflaDemo" class="org.red5.server.WebScope" init-   
  2.   method="register">   
  3.   <property name="server" ref="red5.server" />   
  4.   <property name="parent" ref="global.scope" />   
  5.   <property name="context" ref="web.context.oflaDemo" />   
  6.   <property name="handler" ref="web.handler.oflaDemo" />   
  7.   <property name="contextPath" value="/oflaDemo" />   
  8.   <property name="virtualHosts" value="*,localhost, localhost:8080" />   
  9. </bean>  

        如果你并不需要一些特殊的服务端的逻辑处理,你可以使用由 Red5 提供的默认处理程序:

[html]  view plain copy print ?
  1. <bean id="web.handler" class="org.red5.server.adapter.ApplicationAdapter" />  

         附加应用

        附加应用指的是访问 Red5 的 ROOT web 应用之外的 web 应用。无论这些应用是否共存于同一个 JVM 实例,它们仅仅通过 RTMP 或者 AMF 隧道 servlet 访问 Red5。隧道 servlet 用于每个需要和 Red5 进行 AMF 交流的应用,配置在 web.xml 中,举例如下:

[html]  view plain copy print ?
  1. <servlet>   
  2.   <servlet-name>gateway</servlet-name>   
  3.   <servlet-class>org.red5.server.net.servlet.AMFTunnelServlet</servlet-class>   
  4. </servlet>   
  5.       
  6. <servlet-mapping>   
  7.   <servlet-name>gateway</servlet-name>   
  8.   <url-pattern></servlet-mapping>   
  9. </servlet-mapping>  

        隧道 servlet 类必须在应用执行的 classpath 中。除了隧道 servlet 之外 org.red5.server.net.servlet.ServletUtils 类也是必须的,连同以下库 jar:

[plain]  view plain copy print ?
  1. commons-codec-1.3.jar   
  2. commons-httpclient-3.0.1.jar   
  3. commons-logging-1.1.jar   
  4. log4j-1.2.14.jar   
  5. mina-core-1.1.2.jar   

        这些 jar 应该放在你的应用的 WEB-INF/lib 目录下,例如:

[plain]  view plain copy print ?
  1. C:\Tomcat-6.0.14\webapps\myapp\WEB-INF\lib  

         创建并部署你的应用
        在下面一节中,将包括两个应用程序。第一个是一个 web 应用,它通过 AMF 或者 RTMP 和 Red5 进行交互,它有自己的处理程序,被称为 "RemoteApp"。第二个含有一通过 RTMP 和 Red5 进行交互的 SWF 文件,这个应用被叫做 "LocalApp"。支持 Java 的 IDE 都可以创建这些应用,推荐使用 Eclipse。示例中的 SWF 文件由 Flex AS3 创建。
         远程应用
        本示例提供了创建一个远程 Red5 应用所需的最小配置。以下资源会被创建:
                * J2EE web 应用
                * 客户端 SWF
                * Red5 处理程序类
                * Spring web 上下文
         步骤
                1. 在你的 IDE 里创建一个名为 RemoteApp 的 web 应用。
                2. 拿到一个 red5.jar 文件,这个可以从  http://red5.googlecode.com/files/red5.jar  直接下载,也可以使用 ant jar 构建于源代码。如果你为自己的域处理程序扩展了 ApplicationAdapter 就需要这个库。
                3. 拿到一个 red5-remoting.jar 文件,这个可以使用 ant remotejar 对源代码进行自行构建得到,也可以直接从  http://red5.googlecode.com/files/red5-remoting.jar  下载得到。这个库提供了 AMF 隧道 servlet.
                4. 将这些库 jar 文件放在你的项目库目录下,并把它们添加到你的 classpath。
                5. 编译 Java 和 Flex 源代码。
                6. 在 Tomcat webapps 目录下创建一个名为 RemoteApp 的目录,比如 C:\Tomcat-6.0.14\webapps\RemoteApp。
                7. 将 web 目录下的内容拷贝到 RemoteApp 目录下。
                8. 将 bin 目录下的 RemoteApp.swf 拷贝到 webapps\RemoteApp 目录。
                9. 将 lib 目录及其内容拷贝到 WEB-INF 目录,不包括 red5.jar 文件。
                10. 将 bin 目录下的所有示例目录和 RemoteApp-web.xml 文件拷贝到 ROOT 下的 classes 目录,比如 C:\Tomcat- 6.0.14\webapps\ROOT\WEB-INF\classes。
                11. 重启 tomcat。
                12. 打开浏览器并访问 http://localhost:8080/RemoteApp/RemoteApp.html。
                13. 点击 RTMP 或 HTTP 连接按钮。测试成功的话你会看到服务器返回的 Hello World。
         本地应用
        一个完全驻留在 ROOT web 应用里的示例程序。本示例由一个 Spring web 上下文、处理程序类和一个客户端 SWF 组成。
         步骤
                1. 在你的 IDE 里创建一个名为 LocalApp 的 web 应用程序。
                2. 拿到一个 red5.jar 文件,这个可以从  http://red5.googlecode.com/files/red5.jar  直接下载,也可以使用 ant jar 构建于源代码。如果你为自己的域处理程序扩展了 ApplicationAdapter 就需要这个库。
                3. 在你的项目的库目录下找到库 jar 并将其添加到你的 classpath。
                4. 编译 Java 和 Flex 源代码。
                5. 将 bin 目录下的 LocalApp.html 和 LocalApp.swf 文件拷贝到 ROOT 目录,比如 C:\Tomcat-6.0.14\webapps\ROOT。
                6. 将 bin 目录下的所有示例目录和 LocalApp-web.xml 文件拷贝到 ROOT 下的 classes 目录,比如 C:\Tomcat- 6.0.14\webapps\ROOT\WEB-INF\classes。
                7. 重启 Tomcat。
                8. 打开浏览器访问 http://localhost:8080/LocalApp.html。
                9. 点击连接按钮。测试成功的话你会看到服务器返回的 Hello World。
         示例源代码
        示例源代码可以使用 svn 从以下链接下载: https://red5.googlecode.com/svn/java/example/trunk/
         额外的 web 配置

        log4j - logging 配置文件和 Spring logging 启动 servlet 的路径如下所示。这些应该定义在 war 加载器 servlet 之前,这样子 logging 就可以在 Red5 加载之前初始化了。

[html]  view plain copy print ?
  1. <context-param>   
  2.   <param-name>log4jConfigLocation</param-name>   
  3.   <param-value>/WEB-INF/log4j.properties</param-value>   
  4. </context-param>   
  5. <listener>   
  6.   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   
  7. </listener>  

        AMF gateway - 这个 servlet 提供了和服务器应用交互所用的 AMF。

[html]  view plain copy print ?
  1. <servlet>   
  2.   <servlet-name>gateway</servlet-name>   
  3.   <servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>   
  4.   <load-on-startup>1</load-on-startup>   
  5. </servlet>   
  6. <servlet-mapping>   
  7.   <servlet-name>gateway</servlet-name>   
  8.   <url-pattern>/gateway</url-pattern>   
  9. </servlet-mapping>  

        RTMPT - 这个 servlet 实现了通过 HTTP 隧道的 RTMP,这是通常用来绕过防火墙的问题。

[html]  view plain copy print ?
  1. <servlet>   
  2.   <servlet-name>rtmpt</servlet-name>   
  3.   <servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class>   
  4.   <load-on-startup>2</load-on-startup>   
  5. </servlet>   
  6. <servlet-mapping>   
  7.   <servlet-name>rtmpt</servlet-name>   
  8.   <url-pattern>/open/*</url-pattern>   
  9. </servlet-mapping>   
  10. <servlet-mapping>   
  11.   <servlet-name>rtmpt</servlet-name>   
  12.   <url-pattern>/idle/*</url-pattern>   
  13. </servlet-mapping>   
  14. <servlet-mapping>   
  15.   <servlet-name>rtmpt</servlet-name>   
  16.   <url-pattern>/send/*</url-pattern>   
  17. </servlet-mapping>   
  18. <servlet-mapping>   
  19.   <servlet-name>rtmpt</servlet-name>   
  20.   <url-pattern>/close/*</url-pattern>   
  21. </servlet-mapping>  

        Security - 以下定义用于防止敏感信息的检索。

[html]  view plain copy print ?
  1. <security-constraint>   
  2.   <web-resource-collection>   
  3.     <web-resource-name>Forbidden</web-resource-name>   
  4.     <url-pattern>/WEB-INF/*</url-pattern>   
  5.   </web-resource-collection>   
  6.   <auth-constraint />   
  7. </security-constraint>   
  8. <security-constraint>   
  9.   <web-resource-collection>   
  10.     <web-resource-name>Forbidden</web-resource-name>   
  11.     <url-pattern>/persistence/*</url-pattern>   
  12.   </web-resource-collection>   
  13.   <auth-constraint />   
  14. </security-constraint>   
  15. <security-constraint>   
  16.   <web-resource-collection>   
  17.     <web-resource-name>Forbidden</web-resource-name>   
  18.     <url-pattern>/streams/*</url-pattern>   
  19.   </web-resource-collection>   
  20.   <auth-constraint />   
  21. </security-constraint>  

         故障排除
        如果你在部署的时候碰到了一些问题,或者如果你的应用启动不了,请在发布一个 bug 之前执行以下步骤。目录中的例子使用一个典型的基于 Windows 的路径结构。
                1. 关掉 Tomcat 服务器。

                2. 找到你的 Tomcat 安装目录。

[plain]  view plain copy print ?
  1. C:\Program Files\Apache\Tomcat  

                3. 删除 work 目录。

[plain]  view plain copy print ?
  1. C:\Program Files\Apache\Tomcat\work  

                4. 删除 conf 目录下的 Catalina 目录。

[plain]  view plain copy print ?
  1. C:\Program Files\Apache\Tomcat\conf\Catalina  

                5. 删除扩展的 war 目录,如果有的话。

[plain]  view plain copy print ?
  1. C:\Program Files\Apache\Tomcat\webapps\ROOT   
  2. C:\Program Files\Apache\Tomcat\webapps\echo   
  3. C:\Program Files\Apache\Tomcat\webapps\SOSample  

                6. 请确认你的 WAR 文件放到了 webapps 目录下。

[plain]  view plain copy print ?
  1. C:\Program Files\Apache\Tomcat\webapps\ROOT.war   
  2. C:\Program Files\Apache\Tomcat\webapps\echo.war   
  3. C:\Program Files\Apache\Tomcat\webapps\SOSample.war  

                7. 重启 Tomcat。
        如果还有错误,搜集以下信息并在你快速搜索没有人经历过同样问题之后 Trac 发布一个问题。
                1. Java 版本。
                2. Tomcat 版本。
                3. 操作系统。
                4. Red5 版本(0.8, Trunk, Revision 2283, 等...)。
         定义
         AMF
        一个基于 SOAP(Simple Object Access Protocol)协议的二进制格式。主要用于在 Adobe Flash 应用和 数据库之间交互数据,它使用远程过程调用。每个 AMF 信息包含有一个 body,body 包含有用一个 ActionScript 对象表示的错误或者返回。
         Ant
        软件构建过程自动化的软件工具。它类似于 make,但是使用 Java 写的,要求 Java 平台,最适合于构建 Java 项目。
         AS3
        一个基于 ECMAScript 的脚本语言,主要用于使用 Adobe Flash Player 平台的网站或软件的开发。
         Flex
        软件开发包和一个 IDE,是最初由 Macromedia 公司在 2004 年 3 月发布的,基于其专有的 Macromedia Flash 平台,它是涵盖了支持 RIA(Rich Internet Applications)的开发和部署的一系列技术组合。
         RTMP
        实时流传输协议是一个由 Adobe 系统开发的用于 Adobe Flash 服务器将流化的音频、视频和数据通过网络传输到 Adobe Flash Player 客户端的专有协议。RTMP 可用于远程过程调用。RTMP 维护了一个和终端的持续的连接并允许实时交互。其他 RPC 服务是由异步的单一的客户端/服务器请求/返回模型,因此并不需要实时交互。
         RTMPT
        使用 HTTP 通道的 RTMP。
         SWF
        由来自 Adobe 的 Flash 软件制作的专有的矢量图形文件格式。为了在 web 上轻量发布,SWF 文件可以包含动画或者具有不同程度的交互性和功能的 applet。SWF 有时也用于创建动画显示图形和 DVD 电影菜单以及电视广告。
         Tomcat
        一个 web 容器,或者由 Apache 软件基金会(ASF)开发的应用服务器。Tomcat 实现了由 Sun Microsystems 定义的 servlet 和 JavaServer Pages(JSP),提供了一个运行在 web 服务器的 Java 代码的运行环境。它提供了用于配置和管理的工具,它也可以通过修改配置文件(通常是 XML 格式的)进行配置。Tomcat 包括它自己的内部 HTTP 服务器。
         参考
                * Red5 -  http://red5.org
                * Apache Tomcat -  http://tomcat.apache.org
                * Wikipedia -  http://en.wikipedia.org
原文链接: http://trac.red5.org/wiki/Documentation/UsersReferenceManual/Red5CoreTechnologies/02-Deploying-To-Tomcat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值