感谢ICELEE大佬做的SOA复习笔记!
需求拉动
Internet环境下的企业交互
异构系统的集成与互操作
频繁变化的互操作与集成需求
技术推动
结构化设计
面向对象
面向构件
到面向服务
协同—交互—异构—分布式环境—可能频繁变化
只要满足了这些条件之一,就可以应用SOA
“发布-查询-绑定”模式
角色:服务提供者、服务注册中心、服务客户端
服务提供者到服务注册中心进行服务注册
WSDL:Web服务描述语言
客户端到注册中心发现想要的服务
UDDI:统一描述、发现和集成协议
客户端与服务提供者进行绑定调用
SOAP:简单对象访问协议
企业服务总线(Enterprise Service Bus)是一个整合应用和服务的灵活的连接基础组织,支持实现多个服务的编排。
ESB在请求者和服务之间实现了:
功能部分由下至上分为可操作系统层、企业组件层、服务层、业务流程编排层和表示层
SOMA:Service-Oriented Modeling & Analysis (SOMA)
通过面向服务的建模、分析和设计技术与活动,构造SOA应用
各个阶段:
建立业务模型
识别对象
识别服务
设计服务(接口,内部)
设计服务编排
用编程语言实现服务
SOA系统的配置与运行
SOMA的核心是:识别、设计和实现服务(services)、用来支持服务的构件(components)、以及服务之间形成的协同(choreography)。
Web Service就是一个向外界暴露出接口的能够通过网络进行远程调用的应用程序。
Web Service的实质是一套标准,它定义了应用程序如何在Web上实现互操作。
Web服务的核心标准:
简易对象访问协议(Simple Object Access Protocol)
基于XML
SOAP 是一种通信协议,用于应用程序之间的通信,是一种用于发送消息的格式,被设计用来通过因特网进行通信。独立于语言、独立于平台、简单易扩展。
SOAP是一个普通的XML文档,包含下列元素:
必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息:如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。
必需的 Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
"1.0"?>
"http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
...
...
"http://www.w3school.com.cn/prices">
Apples
"http://www.w3school.com.cn/prices">
1.90
...
网络服务描述语言(Web Service Description Language)
这种文档可描述某个 Web service,它可规定服务的位置,以及此服务提供的操作(或方法)
<definitions namespace = “http://… ”>
<types> //定义服务使用的任何复杂数据类型 type>
<message> //调用者和服务之间传递的一条消息,要用到前面定义的数据类型 message>
<portType> //定义服务提供什么操作,要用到前面定义的消息
<operation>//定义了输入与输出operation>
portType>
<binding> //定义服务如何被调用
//将一个抽象的portType映射到一组具体的协议(SOAP或者HTTP)、消息传递样式(RPC或者document)以及编码样式
binding>
<service> //描述服务位于哪里 service>
definitions>
WSDL规范:
服务接口:消息、操作、端口类型
服务实现:绑定、服务、端口
UDDI是统一描述、发现和集成(Universal Description, Discovery, and Integration)的缩写。它是一个基于XML的跨平台的描述规范,可以使世界范围内的企业在网络上发布自己提供的服务。
如何开发自己的web服务?
在Eclipse下使用Axis2插件,将写好的类的class文件打包成web service,生成arr文件,然后发布到axis2,就可以访问到了。
如何调用web service?
使用axis2插件,通过WSDL文件生成代理类,导入相关jar包,编写测试类:
publicclass Client {
public static void main(String[] args) throws RemoteException {
// TODO Auto-generated method stub
MyServiceStub myServiceStub=new MyServiceStub();//初始化桩模块
SayHello sayHello=new SayHello();//初始化SayHello的方法
sayHello.setName("SOA");//传入参数
SayHelloResponse sayHelloResponse=myServiceStub.sayHello(sayHello);//调用sayhello方法传给服务的响应
System.out.println(sayHelloResponse.get_return());
}
}
Representational State Transfer 表象化状态转变
REST是一种设计风格。它不是一种标准或协议,也不是一种技术,而是一种思想。
使用URI定位资源;
客户端和服务器之间,传递这种资源的某种表现层;
客户端通过四个HTTP动词,对服务器端资源进行操作, 实现”表现层状态转化”。
REST特征:
MVC偏重于解决服务器端的逻辑分层问题,以及客户端是逻辑分层的延伸问题。但是MVC很难实现跨语言解耦。
REST风格偏重于统一接口,具体实现可以跨平台和跨语言。REST使用纯HTML作为客户端,没有服务器端和客户端的耦合。
RPC风格的开发关注于服务器-客户端之间的方法调用,是面向方法调用过程的,而REST是面向资源状态的。
安全性与幂等性
POST与PUT方法的区别:
POST一般用于添加资源,PUT用于更新资源
若都用于添加资源的时候,POST无需指定被添加资源的URI,而是由服务器指定。PUT则需指定资源的URI。
REST使用URI实现资源定位
资源地址相同,但HTTP方法不同的两个方法是两个不同的REST接口。HTTP方法和资源地址结合在一起才可以完成对资源的定位。
@QueryParam
url体现为?key=value的形式
@Path("/testapi")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
return "Hello World!" ;
}
@GET
@Path("/student")
@Produces("text/plain;charset=UTF-8")
public String sayHelloToUTF8(@QueryParam("username") String username) {
return "Hello " + username;
}
}
url:/testapi/student?username=ice
@PathParam
url里面没有问号,参数由正则表达式匹配出来
@Path("/testapi")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
return "Hello World!" ;
}
@GET
@Path("/{param}")
@Produces("text/plain;charset=UTF-8")
public String sayHelloToUTF8(@PathParam("param") String username) {
return "Hello " + username;
}
@GET
@PATH("{from:\\d+}-{to:\\d+}")
@Produces(MediaType.TEXT_PLAIN)
public String getByCondition(@PathParam("from") Integer from,@PathParam("to") Integer to){
return "from:"+from+" to"+to;
}
}
url:/testapi/ice
上面两种可以同时混合使用
@FormParam
@Path("form-rs")
public class FormResourse{
public static final String USER = "user";
public static final String PW = "password";
@POST
public String info(@FormParam(FormResouce.USER) final String user,
@FormParam(FormResource.PW) final String password){
return user +" : " +password;
}
}
@CookieParam
@Consumer
@Consumer用于定义方法的请求实体的数据类型,只用于JAX-RS2.0匹配请求处理的方法,不做内容协商使用。如果匹配不到,服务器会返回HTTP状态码415(Unsurpported Media Type)
例如:@Consumer({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Produces
@Produces 表示类或者方法返回的MIME数据类型。
例如:@Produces({MediaType.APPLICATION_JSON})
可填写字符串:
业务流程执行语言(Business Process Execution Language, BPEL, 发音为’bipple’或’bee-pell’),也叫业务过程执行语言,是一种基于XML的,用来描写业务流程的编程语言,被描写的业务流程的每个单一步骤则由Web服务来实现。
BPEL是基于Web服务的,并且依赖于WSDL。
一个BPEL流程可以发布为一个WSDL定义的服务,并像其它Web服务一样被调用。而且,BPEL希望一个Web服务合成所包含的全部外部Web服务,都是用WSDL服务契约定义的,这令BPEL流程可以调用其它BPEL流程,甚至可以递归的调用自己。
BPEL包含的范围
BPEL关键元素:
部分关键元素之间的关系:
伙伴
伙伴链接
企业服务总线(Enterprise Service Bus, ESB)是构建面向服务体系架构的中枢神经系统,它主要提供服务或应用的接入,服务或应用间消息的路由,消息的转换,以及保障消息安全可靠地传递等功能,从而在实现服务或异构系统间可靠交互的同时,保持它们的松散耦合关系。
核心功能: