Karaf(OSGi)+CXF荆棘之路

吐槽:不断的JAVA新技术学习中,幸得笔者同事xunhua是大神,真的是大神级那种,一路抱大腿走过荆棘之路,真的可以用荆棘来形容Karaf(OSGi)+ CXF的学习难度,因为国内教程少之又少,国外官方文档尽管齐备但通篇阅读并实战成形,对于我这种JAVA小白简直就是在开荒一样...满路荆棘。笔者JAVA很菜,文章仅供自己复习使用,不专业之处请见谅。
前言:最近因公司软件遭受Struts漏洞攻击,多个系统均被影响,公司高层决定去Struts化,故而寻求JAVA里冷门技术来避规热门框架容易被发现漏洞而遭受攻击的风险,这个决策是很明智的,但冷门技术也意味着更少的文档帮助,需要更深厚的开发功底才能驾驭。提到Struts就得说说早点笔者刚毕业那会(2012年)学的是J2EE,Servlet,JSP这些今天看来较原生的技术,SSH(Struts+Spring+Hibernate)那会才流行起来,短短4年发展,如今(2016年)听说流行风向已经转到SpringMVC+Mybatis去了,由此可见JAVA不断学习成本还是蛮高的。现在公司让用Karaf(OSGi)+ CXF的框架,未来OSGi也许某天也会成为主流的吧,本文主要讲解如何简单使用Karaf+CXF进行开发。

Karaf及OSGi:
关于这两个东西究竟是啥,理论的东西就不多谈了,因为国内国外能看到教程通篇理论到底比比皆是,各种神吹上天愿景无限展望的文章多如牛毛,但能落到实处的却少之又少,简单点OSGi是种标准而Karaf是实现了这种标准的JAVA Container。
这里谈的是Karaf不是Kafka,两个技术名词长得很像却是两码事...看错文章的朋友请打住。
Karaf:
简单来说,以笔者的理解Karaf是类似于Tomcat的Java Container,但Karaf比Tomcat更 为强大,它能以模块化加载管理,比如你需要Spring模块来运行Spring的程序或是如我们需要CXF模块来运行我们的CXF程序,你都是完全可定制化的,Karaf提供了强大的命令行操作功能,如果学习过Linux的朋友运用起来肯定不会觉得陌生。
OSGi:
这个东西比较扯淡,有兴趣的朋友自行补脑吧,推荐一篇较好的博文:
http://www.cnblogs.com/jingmo...
笔者也没有深度解读,因为笔者一直都是重实用轻理论的程序员,因为技术更新换代太快了,不得不再次感叹JAVA技术学习的成本问题。
OSGi目前理解看来是热部署的一种实现,热部署简单来说就是从整站到部分的更新,早些年的网站升级更新需要停掉服务器才能进行,哪怕你只修复后端一个小小的登录bug,随着系统愈趋于庞大的时候,一个大的系统集群将由许多网站集成,关闭某个站点往往会影响到其他系统,比如笔者所呆的公司每次一个系统升级都能影响到十来个其他系统,开发完到正式上线总是需要不断的和其他组进行维护时间确认再确认,因为这十来个系统里他们也在不断的迭代更新中,很可能会因为你关闭1小时而没有通知到位造成整个系统瘫痪(这种事还是经常发生的),OSGi则是以最小量进行开发和部署的,比如一个程序里有登录和注册两个功能,那么开发时登录和注册这两个功能将分别开发及打包,也就是打包出来login.jar及reg.jar两个包,而这两个包又组成web.jar这个程序,在使用OSGi的JAVA Container(笔者此处仅介绍Karaf,据说还有个Camel)进行更新时,如果本次更新只是涉及Login.jar的部分,那么我们只需要把Login.jar部分打包放到Karaf里,Karaf会自动帮你先暂停Login这块的功能,但此时Reg的功能是不受影响的,快速更新完Login之后将继续服务,整个过程不会需要整站暂停,因为你的开发针对局部,更新也是局部的,如果某次更新都涉及了Login和Reg,那么我们需要打包Web到Karaf,Karaf会自动处理,而与Web同级别的其他网站比如Web—2将不受Web-1的过度影响,一般遇到此类需要整站更新的部分多半都还是会通知其他别人,同步进行的好,使用OSGi的好处在笔者看来,修复Bug更快速,毕竟一个大的版本都需要更新的时候,说明这个版本还不能达到release的要求。

CXF:
一个SOA框架,至于要分出个什么不同来,真的不太清楚,在笔者认为类似于.NET里的WCF
百度百科貌似要写得更容易让人明白一点:http://baike.baidu.com/link?u...

Maven:
打包工具,如之前提到的我们只希望打包出login.jar、reg.jar这类最小的单元,而如何让login.jar和reg.jar组成web.jar这些都是需要Maven去配置管理引用关系的。笔者又篇关于Maven的文章,记录了笔者学习Maven遇到的坑。

基本技术介绍完毕,进入正题:

笔者使用版本:apache-karaf-4.0.7

1.Karaf路径解读

clipboard.png

其实同linux的路径很相似:
/bin 存放了一些服务器操作的脚本,要启动karaf的话,双击karaf.bat即可(切忌不是start.bat)
/data 存放karaf运行中的日志、部署之后的bundle等,其中/cache即为真正运行的bundle缓存程序,每一个bundle下都会有bundle.info文件标注出部署前引用的源文件出处
/demos 官方给出的项目使用案例
/deploy 部署源文件,将打包后的jar文件拖进此文件夹,karaf即会开始自动部署到/data文件夹下
/etc karaf的环境变量文件夹,其中.properties为karaf的配置文件,.cfg为程序配置文件,比如你的数据库连接bundle需要从配置文件中读取数据库地址信息,则需要在该文件夹下创建对应的cfg文件,并在Activator中进行读取,将再后面进行详细解读

2./etc文件夹下的奥义
这个文件夹下存放了大量的配置文件,搞懂这些配置文件便是把karaf玩上更高水平的必经之路,但是对于匮乏的帮助文档而言,实在是不小的一笔学习成本。

1.config.properties
根据config.properties的开篇注释,这个文件列出了karaf的默认参数设置,可以修改custom.properties来复写这个文件
其中值得提出的是karaf.framework=felix属性,在OSGi框架中有四大金刚Knopflerfish, Apache Felix, Equinox, Spring DM,
这里可以切换框架,karaf支持Apache Felix及Equinox,eclipse上所使用的也是Felix框架,所以有心的朋友可以去探索下。
关于karaf调用的java版本则是默认使用system的JAVA_HOME配置,需要更改java版本则需要赚到/bin目录下的setenv.bat中进行修改

2.org.ops4j.pax.web.cfg
该配置文件主要设定了http的访问端口,因为笔者用CXF,而karaf的多端口技术,据xunhua说实现起来较难,建议是两份karaf的copy,
修改此处为不同的端口来实现较容易些:org.osgi.service.http.port = 8181

3.Activator启动入口
这个东西有点像.NET里的global.asax文件,这个类实现了BundleActivator接口,而这个接口提供了两个常用函数Start及Stop分别对应bundle启动时调用及bundle
停止时调用,这使得我们可以在bundle的生命周期中去做一些事,比如在start时去读取数据库的配置文件。
你可以在你的工程内编写多个不同实现BundleActivator接口的Activator类用于不同场景的调用,但在配置时,生效的只能指定一个,而这个指定则在maven的pom.xml配置文件中。
在plugin标签下指定bundle-Activator属性所对应的类。

clipboard.png

你可能感兴趣的:(java,cxf,osgi)