几种远程调用说明

 

Web Service架构的基本思想,就是尽量把非核心功能交给其他人去做,自己全力开发核心功能

web service即网络服务

Web service有这样几种发展趋势:

* 在使用方式上,RPC和soap的使用在减少,Restful架构占到了主导地位。

* 在数据格式上,XML格式的使用在减少,json等轻量级格式的使用在增多。

* 在设计架构上,越来越多的第三方软件让用户在客户端(即浏览器),直接与云端对话,不再使用第三方的服务器进行中转或处理数据。

 

Web Services 的架构

有两种方法可以查看 web service 的架构:

  • 第一个是去检查每个 web service 所负责的角色
  • 第二个是检查 web service 的协议栈

web service 的角色

web service 架构中主要有三种角色:

服务提供者

它是 web service 的提供者。服务提供者实现了服务并且使它可以通过互联网进行访问。

服务请求者

它是 web service 的消费者。请求者通过开启一个网络连接并发送一个 XML 请求来使用一个已有的 web service。

服务注册

这是一个在逻辑上集中起来的的一系列服务的目录。这个注册提供了一个开发者可以发布新服务或者查找现有服务的中心地带。它因此充当了一个为公司和他们的服务进行集中结算的场所。

web service 协议栈

查看 web service 架构的第二个选择是检查 web service 协议栈。协议栈还在进行完善中,但目前已经具备四个主要的层。

服务传输层

这一层负责应用之间的消息传输。目前,该层包括了超文本传输协议(HTTP)、简单邮件传输协议(SMTP)、文件传输协议(FTP)、以及一些新兴协议,比如块可扩展交换协议(BEEP)。

XML 消息层

这一层负责将消息编码到一个通用的 XML 格式,这样消息就可以被另一端所解读。目前,这一层包括 XML-RPC 和 SOAP。

服务描述层

这一层负责将公共接口描述为一个特定的 web service。目前,服务描述通过 web service 描述语言(WSDL)来处理。

服务发现层

这一层负责集中服务到一个通用的注册中心,并提供简单的发布/发现功能。目前,服务发现通过通用描述、发现与集成(UDDI)来处理。
随着 web service 的发展,可能会加入更多的层,每一层也可能加入更多的技术。
后续章节将讨论 web service 的组件。

关于服务传输层的一点说明

web service 协议栈的最底层是服务传输层。这一层负责两台计算机之间 XML 消息的实际传输。

超文本传输协议(HTTP)

HTTP 是目前进行服务传输最受欢迎的选择。HTTP 简单、稳定,并且部署广泛。此外,大多数防火墙允许 HTTP 通信。这样就允许 XML-RPC 或者 SOAP 消息冒充做 HTTP 消息。如果你想对远程应用进行集成的话这样很好,但是这样也确实会带来很多安全问题。

块可扩展交换协议(BEEP)

这是一个有望取代 HTTP 的协议。BEEP 是互联网工程任务组(IETF)准备建立的一个新协议。BEEP 直接建立在 TCP 层并包含许多内置功能,包括一个初始的握手协议、身份验证、安全以及错误处理。使用 BEEP,我们可以为各种应用程序创建新协议,包括即时通讯、文件传输、内容整合以及网络管理。
SOAP 并不依赖于任何特定的传输协议。事实上,你可以通过 HTTP,SMTP,或者 FTP 来使用 SOAP。因此,一个有前途的想法就是在 BEEP 之上使用 SOAP。

 

RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

计算途径 :RMI为采用Java对象的分布式计算(可将代理和业务逻辑等属性移动到网络中最合适的地方。如果您要扩展Java在系统中的使用,RMI将使您充分利用其强大功能)

运行平台: 使用Java远程消息交换协议JRMP(用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信)

性能优越 :允许您使用Java编写分布式对象

连接方便 :用Java本机方法接口JNI与现

 

 Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据

 基于Hessian的项目开发时,应当注意以下几点:

 JAVA服务器端必须具备以下几点:

·包含Hessian的jar包

·设计一个接口,用来给客户端调用

·实现该接口的功能

·配置web.xml,配好相应的servlet

·由于使用二进制RPC协议传输数据,对象必须进行序列化,实现Serializable 接口

·对于复杂对象可以使用Map的方法传递

 

 客户端必须具备以下几点:

·java客户端包含Hessian.jar的包。

·具有和服务器端结构一样的接口。包括命名空间都最好一样

·利用HessianProxyFactory调用远程接口

 

 服务器端:
载入hessian.jar包
创建接口:
package app.demo;
public interface BasicAPI {
  public void setGreeting(String greeting);
  public String hello();
  public User getUser();
}

实现接口:
package app.demo;
public class BasicService implements BasicAPI {
  private String _greeting = "Hello, world";
  public void setGreeting(String greeting){
    _greeting = greeting;
    System.out.println("set greeting success:"+_greeting);
  }
  public String hello(){
    return _greeting;
  }
  public User getUser() {
    return new User("prance", "meshow");
  }
}

创建一个实现Serializable的projo类也可以是Bean。
package app.demo;
import java.io.Serializable;
public class User implements Serializable{
  String userName ="snoopy";
  String password ="showme";
  public User(Stringuser, String pwd) {
    this.userName =user;
    this.password= pwd;
  }
  public String getUserName() {
    return userName;
  }
  public String getPassword() {
    return password;
  }
}

配置web.xml:
<?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>app.demo.BasicService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
编辑一个简单的test.jsp
<%@ pageimport="com.caucho.hessian.client.HessianProxyFactory,
app.demo.BasicAPI"%>
<%@page language="java"%>
<%
HessianProxyFactory factory = newHessianProxyFactory();
String url = ("http://" +request.getServerName() + ":" +request.getServerPort() +
request.getContextPath() + "/hello");
out.println(url);
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class,url);
out.println("Hello: " + basic.hello());
out.println("Hello: " + basic.getUser() .getUserName() );
out.println("Hello: " +basic.getUser().getPassword() );
%>
 将一切配置成功后,将项目发布到web 服务器上去,可以是Tomcat,Rain等等。
客户端:
载入hessian.jar包
创建与服务器端一样的接口,及基础类
public interface BasicAPI{
public void setGreeting(String greeting);
public String hello();
public User getUser();
}
import java.io.Serializable;
public class User implements Serializable{
String userName ="snoopy";
String password ="showme";
public User(Stringuser, String pwd) {
this.userName =user;
this.password= pwd;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
}
调用:
public class BasicClient {
public static void main(String[] args)throwsException{
String url ="http://127.0.0.1:8080/Hessian/hello";
HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);
System.out.println("Hello:" + basic.hello());
System.out.println("Hello:" + basic.getUser().getUserName());
System.out.println("Hello:" + basic.getUser().getPassword());
basic.setGreeting("HelloGreeting");
System.out.println("Hello:" + basic.hello());
}
}
 

 

 JAX-RPC(基于WSDL/SOAP的web service,基于可扩展标记语言XML的远程过程调用的Java应用程序接口)是Java Web服务开发包(WSDP)的应用程序接口(API),WSDP能使Java开发者在Web服务或其他的Web应用程序中包括远程过程调用(RPC)。JAX-RPC致力于要使应用程序或Web服务调用其他应用程序或Web服务变得更加容易。

 通过使用JAX-RPC(Java API for XML-based RPC),已有的Java类或Java应用都能够被重新包装,并以Web Services的形式发布。JAX-RPC提供了将RPC参数(in/out)编码和解码的API,使开发人员可以方便地使用SOAP消息来完成RPC调用。同样,对于那些使用EJB(Enterprise JavaBeans)的商业应用而言,同样可以使用JAX-RPC来包装成Web服务,而这个Web Service的WSDL界面是与原先的EJB的方法是对应一致的。JAX-RPC为用户包装了Web服务的部署和实现,对Web服务的开发人员而言,SOAP/WSDL变得透明,这有利于加速Web服务的开发周期。

 

 JAX-WS规范(是SUM对JAX-RPC的扩展版本)是一组XML web services的JAVA API,JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services

 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。

服务器端:用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。

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

 JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息

 

JAX-RS(Java API for RESTful Web Services)-JSR311

Web Services通常有兩條路可以走,一種是SOAP/WSDL等XML-Based的技術,定義是相對嚴謹的Web services;另外一種會是比較輕量級的以JSON為傳遞資料的格式,而通常也會設計成RESTful的Web Services。這兩種技術在Java Community中也分別被定義成標準,分別是JAX-WS(Java API for XML Web Services)-JSR224JAX-RS(Java API for RESTful Web Services)-JSR311,前者在Java EE 5時被納入,後者在Java EE 6被納入

 

CXFApache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成

 

axis全称Apache Extensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。但Axis并不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎(例如Tomcat)的服务器

 

 

 

JMSJava消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API

 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

 

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用

 JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等

伸缩性的架构每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署

 

 JCA(J2EE Connector Architecture, 也缩写为,J2C, J2CA),是J2EE平台上连接传统系统的一个技术规范。JCA1.0提供了出站操作,1.5提供了消息流入和事务流入,以及生命周期管理和工作管理等系统契约。但是由于JCA尚未规定统一的元数据获取方式,开发工具对JCA的支持还很有限。各厂商对JCA的支持也不足,因此JCA在通用性和广泛接受方面存在不足

JCA是J2EE体系架构的一部分,为开发人员提供了一套连接各种异类的企业信息系统(EIS,包括ERP、SCM、CRM等,这些系统可能是历史遗留下来非JAVA语言编写的系统)的体系架构,对于EIS开发商而言,它们只需要开发一套基于JCA的EIS连接适配器,开发人员就能够在任何的J2EE应用服务器中连接并使用它。基于JCA的连接适配器的实现,需要涉及J2EE中的事务管理、安全管理及连接管理等服务组件

 

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一

 JPA包括以下3方面的技术:

 ORM映射元数据---JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

API---用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

查询语言---这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自2277259257.iteye.com/blog/2299699