Loading............. 本文檔爲草稿版,持續更新......前端
文檔做者長期從事中間服務件開發,整理所得,有技術見解或其餘交流的可發郵件至yuanqi_07@126.com。java
1、目前流行的WebService框架介紹:git
①Apache Axis2github
Apache Axis2相比Apache Axis1更加有效、更加模塊化、更加面向xml,支持容易插件模塊擴展新功能和特性,例如安全和可靠。Apache Axis2是基於Apache AXIOM,它是一 個高性能、pull-based XML對象模型。Apache Axis2的關鍵特性:web
l 解析xml更快。採用本身的對象模型和StAX (Streaming API for XML)。spring
l 更低的內存佔用。apache
l 支持熱部署。新服務加入到系統,無需重啓服務。編程
l 支持異步webservice、瀏覽器
l 更加靈活。引擎給開發人員提供了充足的自由度可擴展客戶頭信息處理、系統管理、spring-mvc
l 更加穩定性。
l 支持WSDL1.一、WSDL2.0。
l 方便集成其餘組件(Add-ons)。幾個web services已經被集成,包括:WSS4J for security (Apache Rampart), Sandesha for reliable messaging, Kandula which is an encapsulation of WS-Coordination, WS-AtomicTransaction and WS-BusinessActivity.
l 良好的擴展性。
②Apache CXF
Apache CXF是一個開源服務框架。Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,如今已經正式改名爲 Apache CXF 了,如下簡稱爲 CXF。CXF 繼承了Celtix和XFire兩大開源項目的精華,好比:JAX-WS and JAX-RS,主要特性包括:
l 支持Web services標準。包括:SOAP、the WSI Basic Profile、WSDL、WS-Addressing、WS-Policy、WS-ReliableMessaging、WS-Security、WS-SecureConversation和WS-SecurityPolicy.
l 支持不一樣類型前端開發模型。CXF實現了JAX-WS APIs,支持JAX-RS開發。
l 容易使用。CXF設計的簡潔和直觀,具備簡潔APIs迅速的構建基於代碼的服務,Maven插件使得工具集成更加容易、JAX-WS API支持、Spring 2.x XML使得配置更加容易。
l 支持二進制和遺留協議。CXF被設計爲可插拔的架構,在不一樣的傳輸協議結合下,不只支持XML,也支持非XML類型綁定,例如:JSON和CORBA。
③Dubbo
Dubbo是Alibaba開源的分佈式服務框架,它最大的特色是按照分層的方式來架構,使用這種方式可使各個層之間解耦合(或者最大限度地鬆耦合)。
2、概念介紹
①、Web Service也叫XML Web Service WebService是一種能夠接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通信技術。是:經過SOAP在Web上提供的軟件服務,使用WSDL文件進行說明,並經過UDDI進行註冊。
②、SOAP協議:簡單對象訪問協議,簡單對象訪問協議是交換數據的一種協議規範,是一種輕量的、簡單的、基於XML的協議,它被設計成在WEB上交換結構化的和固化的信息。SOAP做爲webService三要素SOAP、WSDL、UUID之一, SOAP用來描述傳遞信息的格式, WSDL 用來描述如何訪問具體的接口, uddi用來管理,分發,查詢webService 。 SOAP 能夠和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。SOAP使用基於XML的數據結構和超文本傳輸協議(HTTP)的組合定義了一個標準的方法使用Internet上各類不一樣操做環境中的分佈式對象。
③、JAX-WS規範是一組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消息。
經過web service所提供的互操做環境,咱們能夠用JAX-WS輕鬆實現JAVA平臺與其餘編程環境(.net等)的互操做。
3、探索Web服務框架發展
①、使用RI發佈WS
RI是Java官方提供的JAX_WS規範的具體實現。
RI下載地址:https://github.com/javaee/metro-jax-ws
Tomcat改造:對tomcat下的config/catalina.properties文件進行配置:在common.loader後靜態引入或動態引入全部lib下的jar包,讓該jar包成爲Tomcat加載啓動時默認加載的jar包。
項目編寫入門:
一、編寫接口及其實現:
接口:
package cn.yq.demo.ws.soap_jaxws.service;
import javax.jws.WebService;
@WebService
public interface UserHiService {
String say(String name);
}
實現:
@WebService(
serviceName="HelloService",
portName="HelloServicePort",
endpointInterface="cn.yq.demo.ws.soap_jaxws.service.UserHiService"
)
public class UserHiserviceImpl implements UserHiService{
@Override
public String say(String name) {
return "你好:"+name;
}
}
二、在WEB-INF下添加sun-jaxws.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" >
<endpoint name="HellloService"
implementation="cn.yq.demo.ws.soap_jaxws.service.impl.UserHiserviceImpl"
url-pattern="/ws/soap/hello"/>
</endpoints>
表示僅發佈一個endpoint。URL表示WSDL的訪問模式。
三、部署啓動Tomcat
打開瀏覽器輸入:http://localhost:8080/applicationName/ws/soap/hello 能夠進入RI WS控制檯。點擊查看具體的WSDL服務描述。
RI是Oracle下的項目,因爲是EJB的擁護者,因此對於Spring的支持並不友善。
②、使用CXF內置的Jetty發佈WS
Jetty 是一個開源的servlet容器,它爲基於Java的web容器,例如JSP和servlet提供運行環境。Jetty是使用Java語言編寫的,它的API以一組JAR包的形式發佈。開發人員能夠將Jetty容器實例化成一個對象,能夠迅速爲一些獨立運行(stand-alone)的Java應用提供網絡和web鏈接。
一、配置Maven,準備環境
配置好Eclipse或IDEA的Maven User配置,指定本身的倉庫配置文件。
用org.apache.maven.archetypes maven-archetype-webapp構建簡單的初始化web項目。建立後,替換項目中的JRE System Library和ServerRuntime,替換好後經過Maven update Project。
配置Maven依賴:
Maven依賴庫查詢地址:http://mvnrepository.com/
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.yq</groupId>
<artifactId>axis_day03</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>axis_day03</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<cxf.version>3.0.4</cxf.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--CXF-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
</dependencies>
<build>
<finalName>axis_day03</finalName>
</build>
</project>
二、接口與實現的編寫同RI。
三、經過JaxWsServerFactory發佈WS
package cn.yq.jax;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import cn.yq.service.HelloService;
import cn.yq.service.impl.HelloServiceImpl;
public class JaxWsServer {
public static void main(String[] args) {
String wsurl = "http://localhost:8080/ws/soap/hello";
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setAddress(wsurl);
factory.setServiceClass(HelloService.class);
factory.setServiceBean(new HelloServiceImpl());
factory.create();
System.out.println("建立成功!SAOP WS");
}
}
四、運行JaxWsServer 類發佈WebService服務。
該種方式僅供探索,不適合開發環境。
③、在Web容器中使用Spring+CXF發佈WS
一、配置Maven依賴:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.yq</groupId>
<artifactId>axis_day04</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<cxf.version>3.0.4</cxf.version>
<spring.version>4.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- CXF -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<finalName>axis_day04</finalName>
</build>
</project>
二、接口與實現的編寫。
接口:
@WebService
public interface HelloService {
String say(String name);
}
實現:
@WebService
@Component
public class HelloServiceImpl implements HelloService{
public String say(String name) {
return "你好:"+name;
}
}
實現好後,讓Spring管理bean。
三、配置web.xml文件:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- CXF -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
以上配置完成兩件事: Spring容器管理的配置與ws服務的處理管理。 全部帶有/ws前綴的請求都將會交給CXFServlet進行處理,也就是用來處理WS請求。
四、配置Spring配置文件:classpath:spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="cn.yq.service.impl"/>
<import resource="spring-cxf.xml"/>
</beans>
五、配置cxf分離配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:endpoint id="helloService" implementor="#helloServiceImpl" address="/soap/hello" />
</beans>
六、發佈啓動Tomcat:
在瀏覽器中輸入http://localhost:8080/applicationName/ws 便可進入CXF控制檯查看servicesList。
④、介紹三種生成WebServici客戶端的方法:
一、CXF提供的WS客戶端
通用動態代理客戶端
package cn.yq.client;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
public class HelloServiceClient {
public static void main(String[] args) {
DynamicClientFactory factory=DynamicClientFactory.newInstance();
String wsdlUrl="http://localhost:8080/axis_day04/ws/soap/hello?wsdl";
Client client=factory.createClient(wsdlUrl);
try {
Object[] results=client.invoke("say", "world");
System.out.println(results[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、基於Spring 的客戶端
使用javaws:client
步驟:
①接口類
package cn.yq.service;
import javax.jws.WebService;
@WebService
public interface HelloServiceImpl {
String say(String name);
}
②配置javaws:client的類型
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client id="helloService" serviceClass="cn.yq.service.HelloService"
address="http://localhost:8080/axis_day04/ws/soap/hello"
/>
</beans>
③客戶端實現類直接調用服務端
package cn.yq.axis_day04_spring_client;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.yq.service.HelloService;
/**
*
* @Path cn.yq.axis_day04_spring_client.App
* @Description TODO
* @date 2018年4月24日下午10:44:35
* @author yuanqi
* @version:1.0
*/
public class App {
private static ApplicationContext context;
public static void main(String[] args) {
context = new ClassPathXmlApplicationContext("spring-client.xml");
HelloService helloService=(HelloService)context.getBean("helloService");
String result=helloService.say("Smith");
System.out.println(result);
}
}
三、用eclipse自帶jdk插件生成客戶端
Eclipse選擇NEW > OTHER> WebServiceClient 輸入wdsl的地址,而後選擇對應要生成客戶端的包下便可。