WebService基于契约编程的基础-WS-Policy学习笔记

来源:互联网 发布:边界标志算法 编辑:程序博客网 时间:2024/05/27 14:15
 
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)
 
CXFWS-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的理解。