Apache CXF框架是一个开源的Web Services框架,它来源于两个开源项目--ObjectWeb Celtix(ESB产品)和Codehaus XFire(SOAP堆栈软件)

Apache CXF提供了对JAX-WS规范的全面支持,一方面提供了对多种绑定(Binding) 数据绑定(DataBinding)

传输协议(Transport)以及数据格式(Format)的支持,另一方面可以根据实际项目的需要,采用代码优先或者

文档优先来轻松实现Web Services的发布和使用


Apache CXF的基本特征

Web Services标准(WS-*规范)的支持,Apache CXF支持多种Web Services标准,包括

SOAP,WSDL,WSI Basic Profile, WS-Addressing,WS-Policy,WS-ReliableMessaging

WS-Security,WS-SecureConversation等


支持多种传输协议和协议绑定,数据绑定,数据格式

协议绑定:SOAP REST/HTTP  XML

数据绑定:JAXB,Aegis,XMLBeans,SDO,JiBX

格式:XML,JSON,FastInfoSet

传输协议:HTTP,Servlet,JMS和Local(即JVM内部消息机制),还有其他通过Apache CXF的Camel

传输协议,如SMTP/POP3,TCP和jabber等


SOA的定义:是一种面向服务的架构模式,根据需求,通过网络对松散耦合的应用进行分布式部署,组合,使用

面向服务的体系结构是一个组件模型,他将应用程序的不同功能单元称为服务。


SOA的优点:

(1)灵活性,开放性和可扩展性

(2)明确开发人员角色

(3)支持多种访问类型:SOA可以支持多种访问类型,包括智能手机,智能终端等新型访问渠道

(4)松散耦合,更易维护

(5)更好的伸缩性

(6)更高的可用性,服务提供者可以在SOA集群环境中灵活部署,服务使用者可以被转接到可用的服务例程上


WSDL 可描述Web服务的三个基本属性:

1,服务所提供的操作(方法) 2,和服务交互的数据格式以及协议  3,协议相关的地址,如URL


SOAP是基于XML的简易协议,在HTTP上进行信息交换,SOAP用户访问网络服务的协议,简易对象访问协议

SOAP是一种用户发送消息的格式,SOAP可以绕过防火墙,SOAP消息必须使用SOAP Encoding命名空间

SOAP消息不能包含DTD引用,SOAP消息不能包含XML指令

SOAP包括的元素:Envelope,Header,Body,Fault

SOAP消息必须拥有与命名空间Soap-envelope相关联的一个Envelope元素,不使用会发生错误

SOAP的encodingStyle属性用于定义在文档中使用的数据类型,此属性可以出现在任何SOAP元素中,会被应用到

该元素的所有子元素上,默认编码是SOAP:encodingStyle='URI'

SOAP Header元素包含头部信息,包含有关的应用程序专用信息(如认证,支付)如果Header元素被提供,必须是Envelope元素的第一个子元素

Head中包含三个属性:actor,mustUnderstand和encodingStyle,这些被定义在SOAP头部的属性可以定义容器如何对

SOAP消息进行处理。mustUnderstand=1表示接受者必须认可此元素

SOAP Body元素:包含实际的SOAP消息,SOAP在默认的命名空间中定义了Body元素内部的一个元素,即SOAP

的Fault元素

SOAP的消息是XML格式的,并且封装成符合HTTP协议的消息,因此,他符合任何路由器,防火墙或代理服务器的要求

SOAP与编程语言无关,客户端传送一个合适的参数给一个实际的远端服务器,SOAP没有对象模型,应用程序可以绑定

在任何对象模型中

UDDI是一个针对Web服务供应商和使用者的应用,用户可以在UBR(UDDI Business Registry)中定位那些需要的服务

UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息

UDDI Registry是所有提供公共UDDI注册服务的站点的统称,UDDI Registry是一个逻辑上的统一体,在物理上

则是以分布式系统的架构实施的,而不同站点之间采用P2P架构实施的,因此访问其中任何一个站点就等于访问了UDDI Registry

在UDDI Operator Site上进行发布则必须使用该UDDI Operator Site自身的用户,进行权限认证

目录服务的实现:Apache jUDDI,Ruddi,OpenUDDI 服务认证

UDDI 并不像 WSDL 和 SOAP 一样深入人心,因为很多时候,使用者知道 Web 服务的位置(通常位于公司的企业内部网中)

SOA的相关规范

JAX-RPC规范:Web Services的原始规范,JAX-RPC1.0最初的设计是为了支持使用XML的远程过程调用(即RMI)

该规范选择了在现有RMI接口上对JAX-RPC进行建模,之后开始了进行JAX-RPC2.0规范的开发(也就是JAX-WS2.0)

JAX-RPC客户机调用模型:包含三个不同的从客户机调用服务端点的模型,

1,基于存根的模型(静态存根),创建服务存根,来自java服务端点接口和来自服务的WSDL描述

可以从服务端点接口生成一个存根类,一个生成了的存根类是实现stub接口和服务端点接口所必须的

2,动态代理,运行时客户机使用javax.xml.rpc.Service接口来创建动态服务代理存根客户,客户机能够推算出关于WSDL和要调用的服务信息

它使用ServiceFactory类来创建服务获取代理

3,动态调用接口,DII客户机在运行时可以使用查找服务信息的服务代理程序发现这个信息,服务代理程序能够采用

各种服务发现机制(注册表,UDDI)

JAX-WS规范:该技术提供了完整的Web Services堆栈,允许开发者可以选择RPC-oriented或者message-oriented

来实现自己的Web Services。该规范是一组XML Web Services的Java API,简化使用java构造WebServices和

Web Services客户机的工作的技术,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码

服务端发布服务,在客户端用户可以通过JAX-WS的API创建一个代理(用本地对象替代远程的服务)来实现对于远程服务器端

的调用,通过Web Services所提供的互操作环境,开发人员可以用JAX-WS规范轻松实现java平台与其他编程环境的互操作

JAX-WS包括了JAXB和SAAJ,而且JAX-WS提供了将传统java对象类转换为Web Services的Annontation库,加速了开发工作

通过WSDL定义的任何复杂类型都通过遵循JAXB规范定义来映射为java类,

JAX-WS2.0事实上是对JAX-RPC1.0规范的扩展,

JAX-WS2.0和以往的JAX-RPC相比,主要特定包括:

1,新的API和新的编程模型,新的API主要包含在javax.xml.ws包中,包括服务器端和客户端的一些核心类,新的编程模型

包括增强的Handler Framework,异步调用和Provider/Dispatch动态编程模型

2,采用注释来描述Web Services,不再依赖部署过去的Web Services描述文件

3,通过JAXB2.0完成xml数据和java对象的绑定,改变了JAX-RPC1.0里同时存在两套binding机制的不便

4,解决了SOAP消息里传输二进制附件的问题,同时对消息传输也进行了优化

5,代码优先,契约优先

JAX-RS规范:REST并不是一种标准,而是一种架构的风格,是基于HTTP的URI,这是基于SOAP,WSDL的Web Services的更为简单

更为容易的替代方案,创建资源Post方法,检索资源GET方法,更新PUT方法,删除DELETE方法

JAX-RS使用POJO编程模式和基于标注的配置,并集成了JAXB,从而缩短REST的开发时间

,JAX-RS位于javax.ws.rs包中,具体实现可以由第三方提供,如Sun的实现Jersery和Apache的实现CXF

REST无状态,满足性能要求,负载均衡和故障转移,URI并不只是斜杠分割的字符串,而是具有在节点上

连接在一起的上级和下级分支的树,使用XML,JSON格式进行传输

JAXB规范:非常方便的方法将XML模式映射到java代码的表示形式,从而支持数据绑定功能,JAXB清除了

将SOAP消息中的XML模式消息转换为java代码的工作,因而开发人员不必全面了解XML和SOAP解析

SAAJ提供了标准的方法来处理SOAP消息中包含的XML附件

Apache CXF的核心架构是以Bus为中心,整合前端编程模型(Frontend)组件,消息(Message),拦截器(Interceptors)

服务模型(Service Model)组件,数据绑定(Data Bindings)组件,传输协议(Transport)组件等为一个组合体,并实现动态的加载

和统一其他组件的功能。

Apache CXF主要由以下组件构成:

总线Bus组件:CXF架构的主干,类似于SPring的ApplicationContext,对其进行扩展可容纳自己的资源,或者替换现有的资源,在运行时将组件串联起来,BusFactory负责

Bus的创建,默认BusFactory是SpringBusFactory(默认Bus实现),在构造过程中,SpringBusFactory会搜索META-INF/cxf(包含在CXF的jar中)下的所有bean配置文件

根据这些配置文件构建一个ApplicationContext,开发者也可以提供自己的配置文件来定义Bus

前端编程模型组件:前端编程为CXF提供创建服务的编程模型,当前主要的前端就是JAX-WS

消息和拦截器组件:CXF建立在一个通用的消息层之上,主要是由消息,拦截器和拦截器链组成,拦截器的主要方法有两个:handleMessage和HandleFault,分别对应消息

处理和错误处理,注意两点:拦截器不是线程安全的,不建议在拦截器中使用实例变量,这点跟Servlet中的Filter的处理是一样的,不要调用下一个拦截器的handleMessage或

handleFault,这个工作由InterceptorChain来完成。

服务模型组件:CXF的服务通过服务模型表示,主要有两部分:ServiceInfo和服务本身,ServiceInfo作用类似WSDL,包含接口信息,绑定,端点(Endpoint)等信息,服务

则包含了ServiceInfo,数据绑定,拦截器和服务属性等信息,可使用java类和WSDL来创建服务,一般由前端负责服务的创建,它通过ServiceFactory来完成

数据绑定组件:传输过程中映射的具体格式和协议方法,主要的两个类时Binding和BingdingFactory,后者创建前者

WSDL绑定组件:

传输协议组件:CXF提供了传输协议抽象,两个对象:Conduit和Destination,前者是消息发送的基础,后者对应消息接收,还可以给Conduit和Destination注册

MessageObserver,以便在消息发送和接收时获得通知。

Apache CXF注释组件:

Apache CXF使用Spring的依赖注入来实现配置,装载Spring的配置文件并把各个组件关联组合到一起,默认Bus实现基于Spring模式,采用插件来装配其他组件,如Message

组件,Interceptors组件,Transport组件,Data Bindings组件,Frontend组件,Service Model组件,Binding组件和WS-Support组件,而Bus是根据拦截器原理实现的

META-INF/cxf目录下有bean配置i文件,cxf.xml(仅仅配置CXF的核心内容)cxf-extension.xml(配置CXF的扩展内容),cxf-property-editors.xml

Bus接口通过工厂模式由SpringBusFactory来创建,Bus的实现类是CXFBusImpl,SpringBusFactory继承抽象类BusFactory,采用Spring的依赖注入方式进行定义,具体表现

在cxf.xml定义文件有一行配置文件 id="cxf"....., ExtensionManagerBus类来继承CXFBusImpl类,可以实现Bus的扩展性

CXFBusImpl是Bus的一个默认实现类,其注入到DestinationFactoryManager,ConduitFactoryManager等中,主要职责是提供不同的扩展访问,Bus可能负责CXF内部的联系


CXF的前端应用简介:Apache CXF的前端应用(Frontends)就是Apache CXF作为Web Services的消费者,通过采用客户端模式来调用后台的Web Services服务

Apache CXF的前端应用有5中实现模式:JAX-WS前端模式,JAX-RS前端模式,动态客户端技术,Provider和Dispatch接口方式,简化前端模式,其中JAX-WS前端模式和

简化前端模式都是支持SOAP协议的Web Services,JAX-WS前端模式有两种实现方式,一种代码优先,一种协议优先


CXF的前端应用(Frontends简介)

Apache CXF的前端应用(Frontends)就是Apache CXF作为Web Services的消费者,通过采用客户端模式来

调用后台的Web Services服务,前端模式有5种实现模式:

1,JAX-WS前端模式

2,JAX-RS前端模式

3,动态客户端技术,动态代理实现

4,Provider和Dispatch接口方式:消息模式(MESSAGE,消息包头和消息内封装的信息,完整的Envelope的结构),负载模式(PAYLOAD,消息的正文,只有soap body节点内容

CXF框架中,通常会把JAXB转为SOAP格式的消息,然后返回SOAP格式的消息也通过JAXB转成真正的返回值,这养的弊端是将JAXB转为SOAP消息

会花费一定的时间,所以我们使用Dispatch/Provider技术使我们客户端和服务端都直接对SOAP消息操作,实践参考http://www.tuicool.com/articles/EviQv2

5,简化前端模式:通过反射,服务端使用Endpoint实现或者采用Apache CXF本身的JaxWsServerFactoryBean服务端来实现

客户端使用Apache CXF本身的DynamicClientFactory客户端来实现或者采用Apache CXF的JaxWsDynamicClientFactory客户端来实现,客户端通过获取

org.apache.cxf.endpoint.ClientImpl,再使用反射调用服务端的实现,这样也不需要生成客户端的stub相关代码。


CXF数据绑定:由于数据绑定对许多文档细节进行了抽象,因此在内存中处理文档性能会好,数据绑定通常所需要

的内存比文档模型方法(如DOM或JDOM)要少,由于不需要遍历文档结构以获取数据,因此以数据绑定方法访问程序内的数据要

比用文档模型方法快。

1,JAXB数据绑定 2,Aegis数据绑定 3,MTOM使用(对两者的性能优化) 4,XMLBeans的使用

数据绑定的术语:DTD,Schema格式,Marshalling编组,Unmarshalling解组,Round-tripping往返

JAXB与java对象序列化相比,JAXB也有局限性,在使用java对象序列化时,Button的所有数据被直接存储到序列化文件中

在进行图形恢复的时候,文件中的序列化数据直接就转换成Button对象了,而JAXB中间会多一层,根据XML中的数据生成

JAXB持有的MyButton对象,再通过MyButton对象中数据去初始化Button对象,这种间接的数据传递所带来的负面影响是

使用JAXB的系统会产生大量传递数据的中间对象,虽然java虚拟机会自动回收,可能会降低系统的性能。


Apache CXF框架的配置管理包括配置,BUS配置(拦截器可以通过代码或配置文件加入到Bus总线中),Feature列表和JMX管理

Apache CXF的调试工具包括:Eclipse IDE,Tcpmon,WSMonitor,SOAP UI, Wireshark

Apache CXF实现RESTful服务:为现代Web体系结构进行建模的一组约束,应用于HTTP和URI规范,REST不是协议,而是一种体系结构风格


REST的基本设计原则:

系统中每一个对象资源都可以通过一个唯一的URI来进行寻址,比如定义目录结构式的URI,访问类型包括(XML或者JSON)

具体表现形式取决于访问资源的客户端,客户端与服务提供者使用一种内容协商的机制(请求头与MIME类型)来选择合适的数据格式

REST的四个基本设计原则:显示的使用HTTP方法,无状态,公开目录结构式的URI,传输XML JSON格式类型的数据

有状态的服务需要大量的预先考虑,以高效的存储会话数据和支持整个java EE容器集群中的会话数据同步,会话同步增加了开销

服务器端:生成响应,指明是否可缓存,以减少针对重复资源的请求数量或通过完全消除某些请求来改善性能,服务器通过包括Cache-Control和Last-Modified (日期值)Http

客户端应用程序:使用Cache-Control响应Header确定是否缓存资源(创建资源的本地副本),还读取Last-Modified响应Header

并在If-Modified-Since Header中发回日期值,以向服务器询问资源是否更改,

公开目录结构式的URI:定义目录式的URI,此类URI具有层次结构,其根为单个路径,从根开始分支的是分开,主要的服务子路径

URI并不只是斜杠隔开的字符串,具有在节点上连接在一起的下级和上级分支树

传输XML,JSON或同时传输两者:


Apache CXF的RESTful实现方式:

JAX-RS方式(Apache CXF框架支持JAX-RS(符合JSR-311),该规范定义了Java开发RESTful服务的方式和方法),JAX-WS Provider&Dispatch方式和HTTP绑定方式

1. JAX-RS方式:规范引入根资源,资源的方法,子资源,子资源定位器,消息正文的阅读器(MessageBodyReader)和消息正文写作器(MessageBodyWriter)的内容

JAX-RS规范的MessageBodyReader和MessageBodyWriter实现了在不同数据格式上读取和写入的数据绑定

符合JAX-RS规范实现支持的数据格式包括:支持JAXB注释的Bean类,JAXP源对象,InputStreams等,也可以兼容

Apache CXF支持的JAXB,XBeans,Aegis和SDO等数据绑定

客户端API支持三种模式:基于代理的模式,以HTTP为中心的模式和以XML为中心的模式

Multiparts可以映射为StreamSource,InputStream,数据源或自定义java类型被多种方式来处理,Apache CXF核心运行包提供了

基于Apache CXF框架的JAX-RS绑定来处理附件

XSLT和XPATH技术在处理复杂数据或检索复杂的XML文档方面具有强大功能

复杂查询:使用查询参数“beans”提供了一种方法来捕捉搜索,通过枚举,如名称/值来完成表达式的查询

如“?name=CXF&version=2.3”可捕捉一个包含setname方法和setVersion方法的Bean,JAX-RS也支持另一种高级检索查询

如自由项查询语言(FIQL)

根据不同的HTTP Accept或Accept语言值和请求方法,使用浏览器来测试一个给定的HTTP资源会做出不同的反应

Apache CXF框架也支持用_type来定义参数的查询(/resource?_type=xml),重写请求方法也很简单(/resource?_method=post)

Apache CXF通过jaxrs-server或jaxrs-client标签来定义日志记录

Apache CXF框架的JAX-RS过滤器和拦截器

支持的特征:包括安全的JAX-RS服务,SecurityManager和IllegalAccessExcpetions,采用像Tomcat的容器和Spring安全框架来进行用户认证处理

例如注册一个自定义调用或RequestHandle过滤器,提取用户名密码,也可以修改Tomcat的catalina.policy权限

重定向:配置CXFServlet或使用Apache CXF框架的JAX-RS RequestDispatcherver,Apache CXF可以重定向请求或响应到其他Servlet资源

服务列表和WADL支持:Apache CXF框架的JAX-RS支持WADL,Apache CXF框架的JAX-RS服务端点可以列在服务器列表页面

用户可以检查WADL文件

JAX-RS的服务:JAX-RS框架的服务可以通过Spring编程方式配置,也可以使用CXFnonSpringJAXRSServlet进行配置

匹配请求URI:

JAX-RS和Spring AOP:Apache CXF框架的JAX-RS采用基于Spring的AOP拦截器

Apache CXF与分布式OSGi集成

其他功能:支持JMS传输,单向调用HTTP和JMS等


Apache CXF 的RESTful实现方式:三种:1,JAX-RS(httpclient,webclient) 2,JAX-WS Provider & Dispatch, HTTP绑定方式(http-binding)


Apache CXF 对于javascript的支持


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐