008年的5.1劳动节,SpringSource发布了策划已久的开源应用服务器-SpringSource Application Platform。总体来说,Spring的Application Platform就是一个根据Rod Johnson自己对于Java企业应用开发的理解,自行制订了一套应用服务器的标准,并且开发了这样一个专用的应用服务器出来。但是Spring的应用服务器也有自己的一些特色,他的底层是基于Eclipse的一个开源项目Equinox的,也就是说是基于OSGi(JSR297标准)的。
轻量级和模块化
Spring应用服务器本质上就是基于Equinox的Spring DMK,这DMK本身是很小的,在DMK上面可以部署各种各样的功能模块来扩展应用服务器的功能,模块化程度非常高,内核本身是很轻量级的。
看Spring Applicaiton Platform自己的文档上面说,如果去掉Tomcat模块的话,启动应用服务器只占15MB内存(能用来干啥?),其实目前Spring应用服务器并没有提供很多功能模块上来,只是一个web模块、一个部署模块和一个管理监控模块。但是计划在2.0版本增加更多的模块、例如群集支持模块、SOA模块等等。
在线的热部署和卸载
得益于Equinox,可以在服务器运行期增加功能模块、部署新的Web应用,或者更新、卸载Web应用,所有的这些操作都可以Online进行。这恐怕是比传统的Java应用服务器最领先的特色了。
库的版本管理和依赖
jar包的版本冲突和依赖是传统Java应用很头疼的一个方面,Spring应用服务器提出了自己的一套库版本管理和库依赖管理的机制,具体的原理我还没有仔细的研究,貌似也是利用了OSGi的功能。
带着对OSGi的热情,最近研究了一下Spring Source Application PlatForm的使用
1. 解压文件到特定目录:unzip springsource-ap-1.0.0.RC1.zip -d /opt
2. 安装环境变量:
??? Linux:export PLATFORM_HOME=/opt/springsource-ap-1.0.0.RC1/
??? Win:PLATFORM_HOME=E:\springsource-ap-1.0.0.RC1
3. 启动服务:
??? Linux:cd $PLATFORM_HOME/bin/startup.sh
??? Win:cd %PLATFORM_HOME%bin\startup.bat
4. 全新启动服务:
??? Linux:cd $PLATFORM_HOME/bin/startup.sh -clean
??? Win:cd %PLATFORM_HOME%bin\startup.bat -clean
5. Debug模式启动服务:
??? Linux:cd $PLATFORM_HOME/bin/startup.sh -debug
??? Linux:cd $PLATFORM_HOME/bin/startup.sh -debug 8001???????? <---------在特定端口启动
??? Linux:cd $PLATFORM_HOME/bin/startup.sh -debug -suspend??????? <------------在Debug代理器监听到以后再启动服务
??? Win:cd $PLATFORM_HOME/bin/startup.bat -debug
??? Win:cd $PLATFORM_HOME/bin/startup.bat -debug 8001???????? <---------在特定端口启动
??? Win:cd $PLATFORM_HOME/bin/startup.bat -debug -suspend??????? <------------在Debug代理器监听到以后再启动服务
6. JMX连接许可
??? Linux:cd $PLATFORM_HOME/bin/startup.sh -jmxremote
??? Linux:cd $PLATFORM_HOME/bin/startup.sh -jmxremote 9009
??? Win:cd $PLATFORM_HOME/bin/startup.bat -jmxremote
??? Win:cd $PLATFORM_HOME/bin/startup.bat -jmxremote 9009
??? 注:在控制台启动jconsole
7. 停止服务:
??? Linux:cd $PLATFORM_HOME/bin/shutdown.sh
??? Linux:cd $PLATFORM_HOME/bin/shutdown.sh -immediate
??? Win:cd $PLATFORM_HOME/bin/shutdown.bat
??? Win:cd $PLATFORM_HOME/bin/shutdown.bat -immediate
8. 后台管理授权:
??? 地址:http://localhost:8080/admin
??? ID: admin
??? Password: springsource
??? 注:改变用户名密码:$PLATFORM_HOME/servlet/conf/tomcat-users.xml
9. 仓库结构:
??? bundles:包含仓库中所有可用的bundle
??? ??? 注:bundles目录被划分成了3个子目录ext, subsystems 和 usr。其中ext和usr被用来存放第三方Bundle,其中ext目录大多用来存放由Springsource提供的第三方Bundle,而通常用户开发的Bundle都会放在usr目录下。
??? libraries:存放library definitions,libraries与安装在仓库中的Bundle有关系。
??? ??? 注:libraries目录被划分成了ext 和 usr 两个子目录,其用法与bundles同
10. 日志文件存放地址:$PLATFORM_HOME/serviceability/logs
11. 应用程序控制台信息存放地址:$PLATFORM_HOME/serviceability/trace
??? 注:其中包含所有目前流行的日志插件生成的日志,甚至是System.out 和System.err
12. Dump服务:
??? 注:当检测到SpringSource Application Platform 中有些代码执行失败,或者线程发生死锁的情况下,Dump服务会记录一个缩影
??? 地址:$PLATFORM_HOME/serviceability/dump
13. 部署与卸载:
??? 部署:
??? ??? 热部署: Linux--------->cp myapp.par $PLATFORM_HOME/pickup
??? ??? 手动部署:http://localhost:8080/admin/web/applications/list.htm
??? ??? 限制:不支持部署fragment bundles
??? 卸载:
??? ??? 热卸载:cd $PLATFORM_HOME/pickup rm myapp.par
??? ??? 手动卸载:http://localhost:8080/admin/web/applications/list.htm
14. 配置:
??? platform.config: 可配置Dump服务、部署与卸载相关信息以及日志文件存放地址
??? servletContainer.config:
15. Platform工程文件
??? 1). 所有的jar都以.par为扩展名
??? ??? a. PAR文件包含application name, version, symbolic name, 以及 description
??? ??? b. PAR文件都拥有自己的边界限制以便防止被其他未授权程序的访问
??? ??? c. PAR文件会对外暴露一些packages
??? ??? d. PAR文件对管理接口可见
??? ??? e. PAR文件能够被批量卸载和重新发布
??? ??? f. PAR文件中拥有多个Bundle应用
??? ??? g. PAR文件中的manifest 定义包含一下信息
??? ??? ??? Application-SymbolicName:由Application-Version组成用来唯一标识一个应用
??? ??? ??? Application-Name:应用名称
??? ??? ??? Application-Version:应用版本
??? ??? ??? Application-Description:表述信息
??? ??? ??? PAR文件MANIFEST.MF 举例:
??? ??? ??? ??? ----------------------------------------------------------------
??? ??? ??? ??? Application-SymbolicName: com.example.shop
??? ??? ??? ??? Application-Version: 1.0
??? ??? ??? ??? Application-Name: Online Shop
??? ??? ??? ??? Application-Description: Example.com's Online Shopping Application
??? ??? ??? ??? ----------------------------------------------------------------
16. Web Modules
??? 一个Web Modules就是一个OSGi的Bundle。
??? 1). 依赖关系是通过关联(reference)而不是直接加载WEB-INF/lib目录下jar文件的方式实现。
??? 2). 依赖关系通过发布签名来进行调用
??? 3). 为了使直接增加的目录变的可控,Web Modules拥有明确定义的metadata
??? 4). Web modules 就是 OSGi Bundle
??? 5). Web modules 基于 Spring-DM
参考资料:
http://robbin.javaeye.com/blog/189825
http://www.springsource.com/
http://www.springsource.com/products/enterprise/edition
?
?
?
?QQ群:9896150 【Java终结者】
?
?
?
?
?