• 1. Web Services 实现原理马殿富 北航计算机学院 2006-06
  • 2. 主要内容SOA体系结构的总体实现 应用服务器XServices实现 工作流建模工具实现 工作流引擎平台WSWF实现 UDDI注册中心实现 文法元语言及WSDLClass描述
  • 3. SOA 面向服务的软件体系结构的实现监控管理工具服务请求者 WSClient客户端开发工具服务开发工具工作流引擎 WSWFTransa ,WSRFRliableHTTP 1.1XService XLinkerWSWSWSWS服务提供者 WS XLinker服务注册中心 UDDI门户 WS Portal服务开发者 WSDesigner系统管理人员 WSMT工作流建模工具流程开发人员 WSWD服务提供者 WS XService绑定发现发布监控开发发现绑定绑定监控开发发现
  • 4. Web 服务开发生命周期开发 开发和测试 Web 服务实现、定义服务接口描述和定义服务实现描述。 通过创建新的 Web 服务、把现有的应用程序变成 Web 服务 由其它 Web 服务和应用程序组成新的 Web 服务提供 Web 服务的实现。 部署 向服务请求者或服务注册中心发布服务接口和服务实现的定义 Web 服务的可执行文件部署到执行环境 运行 调用 Web 服务 Web 服务完全部署、可操作并且服务提供者可以通过网络访问服务 管理 持续的管理和经营 Web 服务应用程序。安全性、可用性、性能、服务质量和业务流程
  • 5. Web Services计算环境体系结构:Service Portal电子商务应用电子政务应用 …针对外部系统的接口规范实现Web服务工作流系统Web服务运行环境Web服务 部署工具Web服务 开发资源消息服务命名服务事件服务安全服务监控服务 系统服务系统管理工具其他…ASP 应用Web服务信息门户目录服务安全处理体系互联网Web服务应用
  • 6. WebSASE平台构成根据Web Service Stack,完整实现各个层次的软件和环境服务集成 和展现层 BPEL & WSRP服务定位、 发现和发布层 UDDI服务描述层 WSDL消息处理层 SOAP/WSRM/WSA网络通讯层 HTTP/SMTP/…安全 WS-Security管理 WSDM 服务质量 QoS工作流引擎平台 WSWF 工作流可视化建模工具 WSWD 信息门户 WSPortal统一服务描述 发现和集成服务器 UDDIServer应用服务器 XService 安全 WS-Security管理 WSMT服务质量 WS-QoS事务处理 中间件 WSTP可靠消息 处理中间件 WSRMXLinker网络通讯 组件 HTTP1.1/HTTPS/SMTPWSRuntime
  • 7. 面向服务视图规范描述资源与协议变换 实现自动服务部署和调用ContentJAVA2WSDLWSDL2JAVAUDDI资源服务运行时客户端(人)客户端(机器)发布发现与定位发现与定位操作浏览器AJAX
  • 8. SOAP rpcSOAP文档内容 soap:envelope> 5
  • 9. 服务调用提供者前置机SOAP消息HTTPHTTPWSDL2JAVASOAP消息Class OperationXML Message服务描述CONTEXTXML2JAVAXML Message
  • 10. Web服务应用服务器XServices传输上下文输入对象池传输上下文输出对象池消息上下文输出对象池消息上下文输入对象池服务对象输出对象池服务对象输入对象池HTTP/HTTPS协议处理SMTP协议处理适配器.NET适配器CORBA适配器EJB适配器Java适配器C++适配器WSAR日志管理服务管理用户管理事务安全存储管理系统存储 服务上下文池消息上下文消息上下文服务对象服务上下文传 输 层消 息 层服 务 层服务适配QoS可靠消息处理寻址协议处理SOAP消息处理SOAP报文解析公共服务
  • 11. 可靠消息Reliable Messaging (RM):可靠的消息传输,处理WS-Reliability中定义的与传输无关的SOAP特征集合,这些特征使得WS-Reliability协议支持了诸如有保证的传输,重复消息删除和消息有序化传输的服务质量特征。 Reliable Messaging Processor (RMP):可靠消息处理器,一个SOAP处理器和提供处理可靠消息传输能力的其它架构。
  • 12. 可靠消息(续1)Sending RMP:发送方定义的发送方可靠消息处理器,消息从一个RMP传输到另一个RMP,其中,源头RMP,作为发送方RMP。 The Sending Party:发送方。 The Receiving Party:接收方。 Receiving RMP:接收方定义的接收方可靠消息处理器,消息从一个RMP传输到另一个RMP,其中,目的RMP,作为接收方RMP。 P2PRMP:一个既作为Sending RMP,又作为Receiving RMP的可靠消息处理器RMP。 Reliable Message:可靠消息,一个带有头部的SOAP消息。 Payload:负载,生产者和消费者为了进行可靠传输,各自分别提供的消息数据的子集。 Producer (or Payload Producer):生产者(或负载生产者),一个制造用于发送的消息的负载的抽象组件,一个生产者的例子是,一个可以调用RMP发送一个负载的应用组件。
  • 13. 可靠消息(续2)Consumer (Payload Consumer):消费者(或负载消费者),一个用于经过Receiving RMP处理后,消费收到的消息负载的抽象组件。一个消费者的例子是:一个用于存储收到的负载的队列设备 Deliver:交付,一个抽象的操作,负载从Receiving RMP交付到Consumer。 Submit: 递交,一个抽象的操作,把负载从Producer递交给Sending RMP。 Respond: 响应,一个抽象的操作,把负载从Consumer传递到Receiving RMP。 Notify: 通知,一个抽象的操作,把负载从Sending RMP通知给Producer. RMP Operations:RMP的操作,Deliver, Submit, Respond and Notify被称为RMP的操作。这些抽象的操作,控制着负载数据在RMP和用户组件之间的传递。一个RMP不是必需要实现一个RMP操作,但是它必须被支持或可以被调用。
  • 14. 可靠消息(续3)Message Identifier: 消息标识符,一个消息头部值或则消息头部值的集合,用于唯一定义一个可靠消息,这个标识符仅仅对这里定义的可靠性特征有意义。 Duplicate Message: 重复的消息,一个与已经存在的另一个消息具有相同Message Identifier的消息。 Message Delivery: 消息交付,对于一个可靠消息的Deliver Operation操作完成。 Acknowledgment Indication: 确认指示,一个用于表示先前的消息已经被Receiving RMP交付的指示。一个确认指示表明确认消息已经被成功地交付,即,消息满足所有建立在交付过程中的所有可靠性特征。 Reliable Messaging Fault Indication (RM Fault): 可靠消息传递的错误指示,一个用于表示先前的消息在Receiving RMP无法正确处理,遇到了错误的条件。它用于通知Sending RMP,相关的消息在Receiving RMP执行Deliver operation的时候失败。 Reliable Messaging Reply (RM-Reply): 可靠消息应答,一个指示,或者是一个相关的先前消息的Acknowledgment Indication,或者是一个先前相关的消息的Fault Indication。 SOAP MEP:SOAP Message Exchange Pattern,SOAP消息交换模式,分为两种SOAP One-way MEP和SOAP Request-response MEP。
  • 15. 可靠消息(续4)SOAP One-way MEP:Sending RMP,在底层协议(如HTTP GET or POST)上,初始化一个SOAP信封;返回响应不包含SOAP信封,尽管是一个非SOAP响应(如HTTP错误代码)返回。 SOAP Request-response MEP:Sending RMP,在底层协议上,初始化一个SOAP信封;Receiving RMP,在响应和请求连接建立一段时间以后,返回一个带有SOAP信封(称之为响应)的消息。 Response, Callback and Poll RM-Reply Patterns: 三种RM-Reply的模式。 Response RM-Reply Pattern:响应RM-Reply模式, Sending RMP,以一个SOAP请求-响应消息交换模式的请求实例,发送一个可靠消息; Receiving RMP,在同一个SOAP消息交换模式实例中,发送一个RM-Reply响应消息。
  • 16. 可靠消息(续5)Callback RM-Reply Pattern:回调RM-Reply模式, Sending RMP,以生产者-消费者交换方式,在一个SOAP MEP实例中,发送一个可靠消息,这个消息可以是双向或单向的; Receiving RMP,发送RM-Reply,除非当RM-Reply绑定一个可靠消息时,必须以单向方式返回这个RM-Reply。 Poll RM-Reply Pattern:轮询RM-Reply模式,又分为 Synchronous Poll RM-Reply Pattern,同步轮询模式 和 Asynchronous Poll RM-Reply Pattern,异步轮询模式。
  • 17. 可靠消息(续6)Synchronous Poll RM-Reply Pattern:同步轮询RM-Reply模式, Sending RMP,以生产者-消费者交换方式,在一个SOAP MEP实例中,发送一个可靠消息,这个消息可以是双向或单向的; Sending RMP,在一个新的SOAP MEP实例中,发送一个带有PollRequest元素的消息,这相当于一个确认的请求; 这个消息不能包括一个有效负载;Sending RMP,必须使用一个双向实例的请求; Receiving RMP,使用带有PollRequest的同一个SOAP实例,发送一个带有RM-Reply响应消息。
  • 18. 可靠消息(续7)Asynchronous Poll RM-Reply Pattern:异步轮询RM-Reply模式 Sending RMP,以生产者-消费者交换方式,在一个SOAP MEP实例中,发送一个可靠消息,这个消息可以是双向或单向的; Sending RMP,在一个新的SOAP MEP实例中,发送一个带有PollRequest元素的消息,这相当于一个确认的请求; 这个消息不能包括一个有效负载; Sending RMP,必须使用一个单向实例的请求; Receiving RMP,在一个SOAP单向实例中返回带有RM-Reply的消息。
  • 19. 可靠消息(续8)PollRequest Message: 轮询请求消息,一个从Sending RMP到Receiving RMP的可靠消息,它用来对先前已经发送的可靠消息请求RM-Reply。 Intermediary: 中介,在Sending RMP和Receiving RMP之间的一个SOAP节点。 Group:组,一个可靠消息总是属于一个组,一个组里可以有一个或多个可靠消息,一个可靠消息包括一个标识符,这个标识符在组内唯一,同时可靠消息也包括一个组标识符group ID,这个标识符全局唯一,如果一个组内只有一个消息,则可靠消息中不包括Sequence Number(序列号),如果一个组内包括多个可靠消息,那么消息中将包括Sequence Number。
  • 20. 可靠消息(续9)RM Agreement and Features:可靠性特征描述了发送方和接收方之间交换消息时双方所协商使用的规范。 可靠性特征分为两个方面 The QoS(Quality of service)contract,服务质量,用于表示Producer和Sending RMP之间的规范,用于表示Consumer和Receiving RMP之间的规范。 The protocol contract,协议特征,用于表示Sending RMP和Receiving RMP关于时间参数等细节规范。 可靠性特征分为两个级别 消息范围:期满时间(ExpiryTime,date/time类型),应答模式(ReplyPattern,包括Response,Callback,Poll)。 组范围:有序的交付(OrderedDelivery,支持/不支持),有保证的交付(GuaranteedDelivery,支持/不支持),无重复的交付(NoDuplicateDelivery,支持/不支持),组期满时间(GroupExpiryTime,data/time类型)和组最大等待持续时间(GroupMaxIdleDuration,秒的时间间隔)。
  • 21. WSDL 元素库WSDL元素注册表索引表WSIL代理UDDI代理WSDL编辑器绘图子系统建模工具用户界面子系统对话框对话框对话框属性框系统 总控 模块 建模工程元模型及其对象表示生成器框架BPEL 生成器WSFL 生成器其他 生成器元模型的 序列化与反序列化其他 生成器*.awp*.wsar*.process*.process*.wsfl*.bpel*.wsdl*.wsdl*.wsdlWSDL 注册表 查看器图形化流程中间表示语言Web Service工作流建模
  • 22. 工 作 流 栈 1工 作 流 栈 2工 作 流 栈 3工 作 流 栈 nWorkflow contextMessageContext 可靠消息……传输层:HTTP 等
  • 23. Web服务工作流引擎平台WSWF可靠消息处理寻址协议处理SOAP消息处理SOAP报文解析传输层BAR日志管理流程管理用户管理事务安全存储管理系统存储消息上下文流程上下文工 作 流 引 擎流程线程池------------activityactivityactivityProcess消 息 层消息上下文输出对象池消息上下文输入对象池流程上下文对象池监控管理流程触发事务处理------------activityactivityactivityProcess流程执行线程弹栈压栈Process实例活动处理-----------activityactivity-1activity-n-----------activity事务消息远程服务返回流程 实例管 理 消 息远 程 服 务 调 用流 程 返 回 消 息公 共 服 务 层工作流引擎管理模块管 理 返 回 消 息activityactivity-1----------activity-n
  • 24. Web Services事务处理消息 解析器消息 处理器协调者 上下文参与者 资源消息 解析器消息 处理器参与者 上下文客户端协调者参与者两阶段提交 控制器参与者 代理Web Services Runtime 容器ACT 管理控制台用户 界面控 制 台 配 置插件注册库工作区事务监控 管理插件
  • 25. UDDI 服务注册中心 数据统一访问层UDDI API DispatchLDAP v3身 份 认 证 适 配 器SOAP EngineADO.NETOracleSQL ServerLDAP Server…ADO.NETXML2DBDB2XMLWS HandlerUDDI Request HandlerWeb Service ContainerWeb ContainerASP.net InterfaceWeb ServiceClient APIWeb 策 略 管 理 系 统 运 行 管 理 服 务 订 阅 监 听 器
  • 26. 面向文法编程—文法元语言 XML文法为G=,其中, V={$Str|Str是字符串}; T={sequence,switch,choice,case,,!, func,t,S} {1,2,3,4,5} {<,>,(,)} {+,-,λ,σ,δ,θ,τ};
  • 27. 面向文法编程—文法元语言S=$元素文法; P是如下文法规则: $元素文法::= $元素类|$元素类$元素文法 $元素类::= $sequence元素|$switch元素|$func元素| $t元素|$元素
  • 28. 面向文法编程—文法元语言$sequence元素::= $元素 $ switch元素::= $case元素 $func元素::= $函数元素 $t元素::= 字符串 $元素::= <元素名 $状态属性>$元素类 $case元素::= <$case元素名 $case属性 $状态属性>$元素类 $case元素名::=sequence|switch|func|t|元素名
  • 29. 面向文法编程—文法元语言$状态属性::= |$状态="$状态函数" $状态::= S|S$状态下标 $状态下标:: =1|2|3|4|5 $case属性::= case ="$case属性值"|case ="$case元素名" $case属性值::= |!|$元素名|$属性值 $状态函数::= +函数|-函数|λ函数|σ函数|δ函数|θ函数|τ函数
  • 30. WSDLClass import org.act.metaset.*; <端口类型集合 S="S"/> …… 
  • 31. Schema类型集合
  • 32. complexType类型序列 <φ元素 case="φ"> φ
  • 33. element类型序列 <φ元素 case="φ"> φ
  • 34. complexType类定义 <关键字> public class <类名> σ(S1,"complexType", "name") extends javax {; };
  • 35. complexType类定义体
  • 36. complexType变量序列 <φ元素 case="φ"> φ
  • 37. complexType变量 private σ(S1,"element","type") σ(S1,"element","name") ;;
  • 38. complexType操作定义
  • 39. complexType初始化类操作定义0 <关键字> public <操作名> σ(S1,"complexType","name") ( ) {; };
  • 40. complexType初始化类操作定义 <关键字> public <操作名> σ(S1,"complexType","name") ( ) {; };
  • 41. complexType初始化操作参数序列 <φ元素 case="φ"> φ <操作参数 S1="δ(S1)"> <参数类型> σ(S1,"element","type") <参数名> σ(S1,"element","name")
  • 42. complexType初始化操作参数序列2 <φ元素 case="φ"> φ <操作参数 S1="δ(S1)"> , <参数类型> σ(S1,"element","type") <参数名> σ(S1,"element","name")
  • 43. complexType初始化变量序列 <φ元素 case="φ"> φ
  • 44. complexType初始化变量 τ("this.",σ(S1,"element","name")) = σ(S1,"element","name") ;;
  • 45. set操作集定义 <φ元素 case="φ"> φ
  • 46. set操作定义 <关键字> public <操作名> τ("set",σ(S1,"element","name")) ( <类型> σ(S1,"element","type") <变量> σ(S1,"element","name") ) {; τ("this.",σ(S1,"element","name")) = σ(S1,"element","name") ; };
  • 47. get操作集定义 <φ元素 case="φ"> φ
  • 48. get操作定义 <关键字> public <操作类型> σ(S1,"element","type") <操作名> τ("get",σ(S1,"element","name")) ( ) {; return τ("this.",σ(S1,"element","name")) };
  • 49. serializer操作定义 <关键字> public <操作类型> ServicesSet <操作名> serializer ( Boolean use ) {; ServicesSet serialValue; serialValue.add(""); return serialValue; };
  • 50. serial变量集 <φ元素 case="φ"> φ
  • 51. serial变量 variable.add(""," σ(S1, "element", "name") "); if(use){ variable.add(" σ(S1, "element", "name") ","type", " σ(S1, "element", "type") " ); }; serialValue.add("\", variable);
  • 52. serialXSD类型 variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") ); variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") );
  • 53. variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") ); variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") ); variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") );
  • 54. variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") ); variable.add(" σ(S1, "element", "name") ","_value", τ(σ(S1, "element", "name"),".toString( )") ); variable.add(" σ(S1, "element", "name") ","_value", σ(S1, "element", "name") );
  • 55. variable.add(" σ(S1, "element", "name") ", τ(σ(S1,"element","name"), ".serializer(use)") );
  • 56. deserializer操作定义 <关键字> public <操作类型> void <操作名> deserializer ( ServicesSet deserialValue ) {; return; };
  • 57. deserial变量集 <φ元素 case="φ"> φ
  • 58. deserial变量 element=deserialValue.filter(" τ(".\\",σ(S1,"element","name")) ").car(); strValue=element.getValue();
  • 59. deserialXSD类型 strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toBoolean( )); strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toByte( ));
  • 60. strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toShort( )); strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toInt( ));
  • 61. strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toLong( )); strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toFloat( )); strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue.toDouble( ));
  • 62. strValue= deserialValue.selector(" τ("*\",σ(S1,"element","name")) ", "_value"); τ(σ(S1,"element","name"),τ(".set",σ(S1,"element","name"))) (strValue); τ(σ(S1,"element","name"),".deserializer") ( deserialValue.filter(" τ("*\",σ(S1,"element","name")) ") );