WS-Policy
解决的问题
我们知道在SOA架构中,最重要的基石就是Service,而业务上对于服务约束来自于业务的契约Contract,那么我们如何在服务的实现过程中体现相应的contract约束呢?
对于SOA规范中标准化的Web Service来讲,体现这些约束的标准就是WS-Policy,而其他的规范像WS-Addressing,WS-RM,WS-Security都可以看做WS-Policy的特例。
另外在SOA的实践中提出的新的Service Governance的概念,Service Governance中就包含了对Policy的管理。Policy的管理包含两个部分内容:一是要在设计和运行时规定服务策略(Service Policy)的定义,交换和强制执行的方式和方法;二是要有基于标准(比如 WS-*)和组织内部规章。那么我就可以看到WS-Policy在SOA项目实施过程中,或者说在SOA的管控(governance)领域实际的应用意义。
WS-Policy相对于WS-Addressing要稍微复杂一些。除了配置的工作外,如果开发者要实现自己特定的Policy,还需要实现某些Inteceptor接口来完成指定的操作。
WS-Policy
中重要的概念
断言(Assertion
)
它是策略(Policy)的基本组成单元,每个断言可以通过它们的限定名 ( QName) 来识别。断言可以是一个简单的字符串或带多个子元素和属性的复杂对象。断言是要表示服务行为的个性化要求、能力或其他特性。例如,可以创建一个断言,定义这样一个安全要求:必须使用受信任的X.509证书签名SOAP消息主体。
替代(Alternative
)
替代只是对于断言的另外形式的表现,或者说是断言的组合形式。
标准化(Normalization
)
标准化的目的是为了进行融合(Merge)和交集(Intersection)的操作,把策略简化为标准格式。
融合(Merge
)
融合是将多个子策略组合在一起形成一个单一策略的过程。
交集(Intersection
)
交集是比较用于公用替代的 2 个 Web 服务策略的过程。只有双方至少对一个策略替代达成一致,才会产生交集。
WS-Policy
的应用
Weblogic
Weblogic中也提供了对WS-Policy的支持,支持需要程序员在开发时使用@policy声明来关联WS-Policy使用的文件,管理员不能通过控制台的配置来关联WS-Policy使用的文件,但是可以关联其他与WS-Policy相关的文件。
Weblogic 10 中对于WS-Policy配置的文档:
http://e-docs.bea.com/wls/docs100/ConsoleHelp/taskhelp/webservices/ConfigureWSPolicyFile.html
CXF
Weblogic对WS-Policy支持相对于CXF开源框架来说,还不够完整和全面。CXF的WS-Policy框架提供了一个允许CXF用户和开发者使用WS-policy应用架构和API。CXF支持规范的版本是1.5。框架是由一个
核心运行环境(
Core
)和允许开发人员插入自己定义的断言的
API组成的。
核心运行环境(Core
)
从不同源文件(WSDL,外部文档)中获取Polices信息
对实施的Policy(策略)的服务,端点,操作和消息对象的计算
通过拦截器对某个特定的Message实施的策略的运行状态的监管
对于一个替代的实施策略的支持性验证
CXF中对策略的操作,比如融合(Merge)和标准化,是基于Apache Neethi完成的。
API包含两大类型的接口:AssertionBuilder和PolicyInterceptorProvider。
AssertionBuilder
AssertionBuilder的概念来源于Neethi,为了不依赖于AXIS对象模型,它做了一些简单的改变,并扩展了一些对域定义的特定的比较操作和交集操作的支持。
AssertionBuilder的实现会动态的加载并自动的注册在AsserionBuilderRegistry的注册表中,这个注册表是Bus的扩展。目前,CXF支持如下的AssertionBuilder和Assertion实现:
{http://schemas.xmlsoap.org/ws/2005/02/rm/policy}RMAssertion
{http://www.w3.org/2007/01/addressing/metadata}Addressing
{http://www.w3.org/2007/01/addressing/metadata}AnonymousResponses
{http://www.w3.org/2007/01/addressing/metadata}NonAnonymousResponses
{http://cxf.apache.org/transports/http/configuration}client
{http://cxf.apache.org/transports/http/configuration}server
以上的类型都基于通用的Assertion的实现(PrimitiveAssertion, NestedPrimitiveAssertion, JaxbAssertion) ),开发者可以参数化或者扩展他们自己的Assertion。
PolicyInterceptorProvider
这个API用来自动的在运行环境下使拦截器按照要求支持域定义的断言,借此可以很好的简化拦截器的配置。
publicinterface PolicyInterceptorProvider extends InterceptorProvider {
// return the schema types of the asssertions that can be supported
Collection<QName> getAssertionTypes()
}
目前,CXF支持PolicyInterceptorProvider实现下列类型的断言
{http://schemas.xmlsoap.org/ws/2005/02/rm/policy}RMAssertion
{http://www.w3.org/2007/01/addressing/metadata}Addressing
{http://www.w3.org/2007/01/addressing/metadata}AnonymousResponses
{http://www.w3.org/2007/01/addressing/metadata}NonAnonymousResponses
另外CXF框架提供了一个在Policy附件中改进域表达式(在策略范围内描述策略主题的xml elements)
CXF
中
WS-Policy
的例子
安装完CXF,在cxf目录下有个samples/ws-Policy的目录,按照readme.txt指导编译执行就可以了。CXF配置WS-Policy是比较简单的,下面是配置文件设计Policy的段落:
……
<cxf:bus>
<cxf:features>
<p:policies/>
</cxf:features>
</cxf:bus>
<p:externalAttachment location="addr-external.xml"/>
……
PolicyAttachment文件addr-external.xml中定义了如下内容:
<attachments xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsp:PolicyAttachment>
<wsp:AppliesTo>
<wsa:EndpointReference>
<wsa:Address>http://localhost:9000/SoapContext/SoapPort</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wsp:Policy>
<wsam:Addressing xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata">
<wsp:Policy/>
</wsam:Addressing>
</wsp:Policy>
</wsp:PolicyAttachment>
</attachments>
需要注意的是CXF的例子中并没有提供开发WS-Policy API的例子。这也是开源工具的缺憾之一吧。
在有兴趣专研的朋友,也可以看看CXF的源代码研究一下,加深对WS-Policy的理解。