1. 程式人生 > >WebService之RPC的(Axis2、CXF、Jersey、Hessian)4中實現方式

WebService之RPC的(Axis2、CXF、Jersey、Hessian)4中實現方式

一、什麼是WebService

Web service是一個平臺獨立的,低耦合的,自包含的、基於可程式設計的web的應用程式,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、釋出、發現、協調和配置這些應用程式,用於開發分散式的互操作的應用程式。

Web Service技術, 能使得執行在不同機器上的不同應用無須藉助附加的、專門的第三方軟體或硬體, 就可相互交換資料或整合。依據Web Service規範實施的應用之間, 無論它們所使用的語言、 平臺或內部協議是什麼, 都可以相互交換資料。Web Service是自描述、 自包含的可用網路模組, 可以執行具體的業務功能。Web Service也很容易部署, 因為它們基於一些常規的產業標準以及已有的一些技術,諸如標準通用標記語言下的子集XML、HTTP。Web Service減少了應用介面的花費。Web Service為整個企業甚至多個組織之間的業務流程的整合提供了一個通用機制。

從表面上看,Web service 就是一個應用程式,它向外界暴露出一個能夠通過Web進行呼叫的API。這就是說,你能夠用程式設計的方法通過Web來呼叫這個應用程式。我們把呼叫這個Web service 的應用程式叫做客戶。

二、WebService基本概念

Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是:通過SOAP在Web上提供的軟體服務,使用WSDL檔案進行說明,並通過UDDI進行註冊。

XML:(Extensible Markup Language)擴充套件型可標記語言。面向短期的臨時資料處理、面向全球資訊網絡,是Soap的基礎。

Soap:(Simple Object Access Protocol)簡單物件存取協議。是XML Web Service 的通訊協議。當用戶通過UDDI找到你的WSDL描述文件後,他通過可以SOAP呼叫你建立的Web服務中的一個或多個操作。SOAP是XML文件形式的呼叫方法的規範,它可以支援不同的底層介面,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 檔案是一個 XML 文件,用於說明一組 SOAP 訊息以及如何交換這些訊息。大多數情況下由軟體自動生成和使用。

UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新專案。在使用者能夠呼叫Web服務之前,必須確定這個服務內包含哪些商務方法,找到被呼叫的介面定義,還要在服務端來編制軟體,UDDI是一種根據描述文件來引導系統查詢相應服務的機制。UDDI利用SOAP訊息機制(標準的XML/HTTP)來發布,編輯,瀏覽以及查詢註冊資訊。它採用XML格式來封裝各種不同型別的資料,並且傳送到註冊中心或者由註冊中心來返回需要的資料。

三、應用場景

系統間互動,需要應用系統一方以暴露服務的方式提供給其他系統,來完成一組業務邏輯。Web service平臺需要一套協議來實現分散式應用程式的建立。Web service平臺必須提供一套標準的型別系統,用於溝通不同平臺、程式語言和元件模型中的不同型別系統。在傳統的分散式系統中,基於介面(interface)的平臺提供了一些方法來描述介面、方法和引數(譯註:如COM和COBAR中的IDL語言)。同樣的,Web service平臺也必須提供一種標準來描述Web service,讓客戶可以得到足夠的資訊來呼叫這個Web service。最後,我們還必須有一種方法來對這個Web service進行遠端呼叫。這種方法實際是一種遠端過程呼叫協議(RPC)。為了達到互操作性,這種RPC協議還必須與平臺和程式語言無關。

1.跨防火牆的通訊

如果應用程式有成千上萬的使用者,而且分佈在世界各地,那麼客戶端和伺服器之間的通訊將是一個棘手的問題。因為客戶端和伺服器之間通常會有防火牆或者代理伺服器。在這種情況下,使用DCOM就不是那麼簡單,通常也不便於把客戶端程式釋出到數量如此龐大的每一個使用者手中。傳統的做法是,選擇用瀏覽器作為客戶端,寫下一大堆JSP頁面,把應用程式的中間層暴露給終端使用者。這樣做的結果是開發難度大,程式很難維護。

如果中間層元件換成WebService的話,就可以從使用者介面直接呼叫中間層元件,從而省掉建立JSP頁面的那一步。要呼叫WebService,可以直接使用SOAP這樣的客戶端,也可以使用自己開發的SOAP客戶端,然後把它和應用程式連線起來。不僅縮短了開發週期,還減少了程式碼複雜度,並能夠增強應用程式的可維護性。同時,應用程式也不再需要在每次呼叫中間層元件時,都跳轉到相應的“結果頁”。

2.應用程式整合

企業級的應用程式開發者都知道,企業裡經常都要把用不同語言寫成的、在不同平臺上執行的各種程式整合起來,而這種整合將花費很大的開發力量。應用程式經常需要從執行在IBM主機上的程式中獲取資料;或者把資料傳送到主機或UNIX應用程式中去。即使在同一個平臺上,不同軟體廠商生產的各種軟體也常常需要整合起來。通過WebService,應用程式可以用標準的方法把功能和資料“暴露”出來,供其它應用程式使用。

3.B2B的整合

用WebService整合應用程式,可以使公司內部的商務處理更加自動化。但當交易跨越供應商和客戶、突破公司的界限時會怎麼樣呢?跨公司的商務交易整合通常叫做B2B整合。WebService是B2B整合成功的關鍵。通過WebService,公司可以把關鍵的商務應用“暴露”給指定的供應商和客戶。例如,把電子下單系統和電子發票系統“暴露”出來,客戶就可以以電子的方式傳送訂單,供應商則可以以電子的方式傳送原料採購發票。當然,這並不是一個新的概念,EDI(電子文件交換)早就是這樣了。但是,WebService的實現要比EDI簡單得多,而且WebService執行在Internet上,在世界任何地方都可輕易實現,其執行成本就相對較低。不過,WebService並不像EDI那樣,是文件交換或B2B整合的完整解決方案。WebService只是B2B整合的一個關鍵部分,還需要許多其它的部分才能實現整合。

4.軟體和資料重用

軟體重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是原始碼模組或者類一級的重用,另一種形式是二進位制形式的元件重用。當前,像表格控制元件或使用者介面控制元件這樣的可重用軟體元件,在市場上都佔有很大的份額。但這類軟體的重用有一個很大的限制,就是重用僅限於程式碼,資料不能重用。原因在於,釋出元件甚至原始碼都比較容易,但要釋出資料就沒那麼容易,除非是不會經常變化的靜態資料。

四、基於AXIS2、CXF、Jersey的不同實現方式

用例是基於spring、maven的專案的不同實現方式,和呼叫方式。

1、Axis2與spring整合

1)Axis2依賴包

<properties>
<!--axis2版本指定 -->
<axis2.version>1.6.2</axis2.version>
</properties>
<!--axis2 begin -->
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2</artifactId>
<version>${axis2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-spring</artifactId>
<version>${axis2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>${axis2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-local</artifactId>
<version>${axis2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-xmlbeans</artifactId>
<version>${axis2.version}</version>
</dependency>
<!--axis2 end -->

2) spring-basic.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- spring 元件掃描包配置 -->
<context:component-scan base-package="com.zj.ws" />
</beans>

3)services.xml配置

檔案位置WEB-INF/services/XXX/META-INF/services.xml,其中XXX部分可以隨意取名。配置檔案如下:

<serviceGroup>
<!-- 服務名稱 -->
<service name="myService" >
<description> 
Axis2與 Spring整合 
</description> 
<parameter name="ServiceObjectSupplier"><!-- 固定的不變 --> 
org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier 
</parameter> 
<!-- spring 容器例項化後的bean名稱 -->
<parameter name="SpringBeanName">queryUserResource</parameter><!-- bean名字 --> 
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers> 
</service>
</serviceGroup>

4)web.xml檔案配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 加入Spring支援 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-basic.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--加入Axis2支援 -->
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>

5)服務端程式碼

a.介面:
package com.zj.ws.resource;
import com.zj.ws.message.request.QueryUserRequest;
import com.zj.ws.message.response.QueryUserAxis2Response;
/**
* @Description: 使用者資訊查詢服務介面
* @author Jian Jang
* @version 1.0 2017年9月13日
*/
public interface QueryaUserAxis2Resource {
/**
* 使用者資訊查詢方法
* @param request
* @return
*/
QueryUserAxis2Response queryUsers(QueryUserRequest request);
}
b.實現類:
package com.zj.ws.resource.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import com.zj.ws.message.entity.User;
import com.zj.ws.message.request.QueryUserRequest;
import com.zj.ws.message.response.QueryUserAxis2Response;
import com.zj.ws.resource.QueryaUserAxis2Resource;
/**
* @Description: 使用者資訊查詢服務實現類
* @author Jian Jang
* @version 1.0 2017年9月13日
*/
@Component("queryUserResource")
public class QueryUserResourceImpl implements QueryaUserAxis2Resource {
@Override
public QueryUserAxis2Response queryUsers(QueryUserRequest request) {
System.out.println("request>>>>" + JsonUtils.obj2JsonString(request));
QueryUserAxis2Response response = new QueryUserAxis2Response();
List<User> list = new ArrayList<User>();
User u1 = new User();
u1.setId(2001);
u1.setName("張三");
u1.setAge(22);
u1.setEmail("[email protected]");
u1.setGender("Male");
list.add(u1);
list.add(u1);
list.add(u1);
list.add(u1);
list.add(u1);
response.setCount(5);
response.setRepCode("000000");
response.setRepMsg("查詢成功");
response.setUserList(list.toArray(new User[] {}));
System.out.println("response>>>>" + JsonUtils.obj2JsonString(response));
return response;
}
}
c.服務測試類

服務部署後可在瀏覽器中通過服務地址檢視介面定義資訊

相關推薦

WebServiceRPCAxis2CXFJerseyHessian4實現方式

一、什麼是WebService Web service是一個平臺獨立的,低耦合的,自包含的、基於可程式設計的web的應用程式,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、釋出、發現、協調和配置這些應用程式,用於開發分散式的互操作的應用程式。 Web

【STM庫應用】stm32 TIM 詳解二 脈衝寬度週期測量

昨天已經把這個研究出來了,但是由於該專利申請書,一直沒有時間上傳,今天補上! 今天主要是用TIM3進行PWM的輸入模式,進行對矩形波的脈衝訊號寬度以及其週期進行測量,先來看一幅圖。 圖1 TIM內部邏輯圖 我們先來看看datasheet上是怎麼說的:

[轉]Web APi認證Authentication兩種實現方式【二】十三

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

AD 腳本kixtart運用添加windows共享打印機

windows kixtart 腳本ad 打印機在http://windyma.blog.51cto.com/661702/1967027文章,已做好用戶腳本基礎上 在腳本文件kixtart.kix裏添加如下內容:---------------------------------------IF INGROU

Web APi認證Authentication兩種實現方式【二】十三

基於web 推薦 zed {0} scheme sage https 函數 ges 原文:Web APi之認證(Authentication)兩種實現方式【二】(十三)前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如何合理的利用

字符驅動按鍵一:無腦輪詢法

des gpo first gist 結構體 字符 定義 char v_op 一、添加頭文件 二、構造fileoperation結構體 static struct fileoperations second_drv_fops = {   .o

測試工具Jmeter創建一個簡單測試用例

管理器 view time http ati 測試用例 停止 調度器 until 前面介紹了如何使用badboy錄制jmeter腳本,以及如何導入腳本並進行測試 這裏介紹下手動創建測試用例,主要步驟如下: 1、創建線程組 第一次打開Jmeter只有一個測試計劃,右鍵

java畫圖總結常用方法paint,repaint,update

三,常用方法paint,repaint,update 這個問題的由來是因為,我在編寫java小程式,畫圖的時候,發現我重寫了paint(graphics g)方法,而執行的時候呼叫的是repaint()無參方法。老師說,repaint裡面間接呼叫了paint方法。但是是如何間接呼叫的呢?r

java畫圖總結常用類Graphics,JFrame,JPanel

二,常用類 Graphics,JFrame,JPanel         javax.swing.JFrame;     javax.swing.JPanel; ------------

【學習筆記】資料庫優化索引聚簇索引&非聚簇索引

索引:對資料庫表中一列或多列的值進行排序的一種結構,通過索引可快速訪問資料庫表中的特定資訊,即通過索引對資料列的值進行結構化排序。 其中,索引包含聚簇索引和非聚簇索引 聚簇索引的順序就是資料的物理儲存順序 非聚簇索引的索引順序與資料物理排列順序無關 所以一個表

HTTP請求方法header原來不光只有post和get啊~~

以前一直以為HTTP請求只有POST和GET方法(知識最常用的),後來看一篇簡書,裡面提到還有HEAD方法,再查查資料發現不止這3個。。。 據RFC2616標準(現行的HTTP/1.1)得知,通常有以下8種方法:OPTIONS、GET、HEAD、POST、PUT、DELET

Java實現RPC服務物件使用註解並自動注入

使用到的技術: 註解和反射機制 包掃描以及jar包掃描 CGlib動態代理 類似於spring框架的控制反轉依賴自動注入技術 目錄結構: RPCclass註解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementTy

HTML+CSS的兩欄三欄布局以及垂直居中的實現方式

外邊距 add round relative pla tran 樣式 lex 代碼 1.兩欄布局(左固定,右適應) 先寫出初始樣式和結構。 <div class="container"> <div class="left">Lorem ip

轉載--我的AI轉型路與AI我見非985211的奮鬥路程與視角

前言 我是一名傳統網頁(PHP+ruby)和應用開發(Android)轉型AI相關開發的碼農。在非985211高校出身的情況下,我前期自己買書學習,到現在考研上課全身心的投入智慧系統的開發當中來,在演算法當中理解了資料和模型,對一些基本問題的解決和現在社會上的環境風氣有

Android爬坑FileProviderFailed to find configured root that contains

最近在測試FileProvider相關功能的時候,在從自定義相簿選擇圖片通過FileProvider來獲取content uri的時候程式突然崩潰了,報出了 Failed to find configured root that contains xxxx

RNN的神奇The Unreasonable Effectiveness of Recurrent Neural Networks

RNN有很多神奇的地方。我仍然記得為Image Captioning訓練的第一個RNN。我隨便設定了超引數,在訓練了幾十分鐘後這個小模型開始產生看起來非常不錯、幾乎有意義的描述。有些時候,模型的簡單程度與結果超出預期的程度對比十分懸殊——我的第一個RNN

陳俊嶺的程式設計師公眾號求關注,方便交流

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   轉眼間已經研二了,突然想把以前看過的文獻總結總結與大家分享,留作紀念,方便以後參考。  1、深度追蹤:通過卷積網路進行差異特徵學習的視覺追蹤(DeepTrack:Learning Disc

分散式搜尋elasticsearch java API highlighting 對搜尋結果的高亮顯示

搜尋請求的Body如下:: { "query" : {...}, "highlight" : { "fields" : { "title":{}, "intro" : {}

C語言陣列陣列賦值的三種形式

在C語言中,對陣列進行賦值的三種形式 1、通過迴圈的形式     即:陣列名[下標]      對陣列的元素進行依次賦值 #include <stdio.h> int main() { int i; int a[10] = {0}

我的AI轉型路與AI我見非985211的奮鬥路程與視角

http://blog.csdn.net/sileixinhua/article/details/75203725 前言 我是一名傳統網頁(PHP+ruby)和應用開發(Android)轉型AI相關開發的碼農。在非985211高校出身的情況下,我前期自己買書學習