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进行开发。html

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的要求。java

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

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

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

笔者使用版本:apache-karaf-4.0.7数据库

1.Karaf路径解读apache

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

相关文章
相关标签/搜索