javawebservice大數據
① 大數據提供用戶交互方式有哪些
一、 ftp伺服器共享方式。即建立一個ftp伺服器,為不同的系統分配賬號、密碼、目錄的操作許可權等,要交換數據的兩個系統要約定好數據格式(比如:xml文件,excel文件,csv文件等)、文件命名方式、存放路徑等規則等。交互時,一個系統按約定的時間將數據寫入ftp目錄中,另一個系統定期取走並進行相應的業務操作。這種方式在電信、移動中項目用得比較多,特別是sp。
二、socket通訊伺服器方式。要傳送數據的雙方建立socket連接後再傳送數據,數據格式自行約定,並對傳輸的數據進行加密,這種方式在銀行系統中用得比較多(c、c++寫的核心)。
三、 webservice方式。這種方式不再做過多描述,具體請參閱我的《webservice之cxf實現》《webservice架構設計》博文。這種方式在互聯網上用得多一些。
四、 遠程rmi(如OMG CORBA)方式。以前我在delphi中實現過(懷念李維的時代,呵呵),j2se中也有相應的支持,這種方式相對來說比較復雜。如果同為java系統可用jndi方式,ejb也是一種方式。
五、遠程url地址方式。這種方式在互聯網上用得很多,比如:facebook,豆瓣的api,支付寶在線支持數據交互等等,早期DWR的web遠程調用本質上也屬於這種。當然,webservice說到底也是這種方式,只不過數據的xml打包和解包過程由程序按照規范自動完成。交互示意圖
這種暴露url地址方式的數據傳輸格式可以是xml、json或自定義text格式,也可以在請求參數中直接協帶一個一個需要的數據。要注意的是,如果在客戶瀏覽器中解析第三方伺服器的json數據會有跨域安全訪問問題(無論js還是fash、flex都一樣),還好,jQuery中有相應的函數封裝。
總之,無論採用哪種方式,你在為實際項目做架構原型的時候,下面幾個因素都要考慮周全。
一、簡單。交互的設計要簡單,這對調用雙方都有好處。
二、 安全性。如何保證數據在交互過程中的安全性是一個點。
三、 性能。在選擇的時候,要考慮數據量的大小,以決定一種合適的方式(比如:一次調用請求的數據量,請求調用的頻率)。
四、最後,要考慮重復數據的處理,特別是在其它系統將數據推入的情況,對於推入的數據,要做好處理日誌,以備後查。大數據更多交互方式,參考:http://ke.qq.com/course/109084#term_id=100116274
② 怎樣提高WebService的性能
性能: 1、 啟用FastInfoset(快速信息集) webservice的性能實在是不敢恭維。曾經因為webservice吞吐量上不去,對webservice進行了一些性能方面的優化,採用了FastInfoset,效果很明顯,極端條件下的大數據量傳輸,性能提高60%,他可以減少傳輸成...
③ 怎樣提高WebService性能大數據量網路傳輸處理
1. 直接返回DataSet對象
特點:通常組件化的處理機制,不加任何修飾及
處理;
優點:代碼精減、易於處理,小數據量處理較快;
缺點:大數據量的傳遞處理慢,消耗網路資源;
建議:當應用系統在內網、專網(區域網)的應用
時,或外網(廣域網)且數據量在KB級時的
應用時,採用此種模式。
2.返回DataSet對象用Binary序列化後的位元組數組
特點:位元組數組流的處理模式;
優點:易於處理,可以中文內容起到加密作用;
缺點:大數據量的傳遞處理慢,較消耗網路資源;
建議:當系統需要進行較大數據交換時採用。
3.返回DataSetSurrogate對象用Binary序列化後的位元組數組
特點:微軟提供的開源組件;
下載地址 http://support.microsoft.com/kb/829740/zh-cn
優點:易於處理,可以中文內容起到加密作用;
缺點:大數據量的傳遞處理慢,較消耗網路資源;
建議:當系統需要傳輸中文數據或需要加密時採用此種方式
4.返回DataSetSurrogate對象用Binary序列化並Zip壓縮後的位元組數組
特點:對位元組流數組進行壓縮後傳遞;
優點:當數據量大時,性能提高效果明顯,
壓縮比例大;
缺點:相比第三方組件,壓縮比例還有待提高;
建議:當系統需要進行大數據量網路數據傳遞時,
建議採用此種可靠、高效、免費的方法。
測試用例:SqlServer2000資料庫,數據量大小40000行,
欄位數10個,結果如下:
使用方法
用時(秒)
數據量(Byte)
大小
百分比(%)
直接返回DataSet
12.625
19629414
100%
返回二進制序列化後DataSet
9.712
12049645
61.38%
返回轉化DataSetSurrogate的DataSet 並且二進制序列化後
7.943
5138990
26.18%
返回轉化DataSetSurrogate的DataSet 並且二進制序列化後使用zip壓縮
7.619
978033
4.98%
源碼:
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.IO;
using System.IO.Compression;
using System.Data.SqlClient;
using System.Runtime.Serialization.Formatters.Binary;
namespace DataSetWebService
{
/// <summary>
/// Service1 的摘要說明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class DataSetService : System.Web.Services.WebService
{
[WebMethod(Description="直接返回DataSet對象")]
public DataSet GetDataSet()
{
//http://www.dzbsoft.com XT_TEXT
string sql = "select * from XT_TEXT";
SqlConnection conn = new SqlConnection("Server=60.28.25.58;DataBase=s168593;user id=s168593;password=h0y+FeC*;");
conn.Open();
SqlDataAdapter dataAd = new SqlDataAdapter(sql, conn);
DataSet DS = new DataSet("XT_TEXT");
dataAd.Fill(DS);
conn.Close();
return DS;
}
[WebMethod(Description = "返回DataSet對象用Binary序列化後的位元組數組")]
public byte[] GetDataSetBytes()
{
DataSet DS = GetDataSet();
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, DS);
byte[] buffer = ms.ToArray();
return buffer;
}
[WebMethod(Description = "返回DataSetSurrogate對象用Binary序列化後的位元組數組")]
public byte[] GetDataSetSurrogateBytes()
{
DataSet DS = GetDataSet();
DataSetSurrogate dss = new DataSetSurrogate(DS);
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, dss);
byte[] buffer = ms.ToArray();
return buffer;
}
[WebMethod(Description = "返回DataSetSurrogate對象用Binary序列化並ZIP壓縮後的位元組數組")]
public byte[] GetDataSetSurrogateZipBytes()
{
DataSet DS = GetDataSet();
DataSetSurrogate dss = new DataSetSurrogate(DS);
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, dss);
byte[] buffer = ms.ToArray();
byte[] Zipbuffer = Compress(buffer);
return Zipbuffer;
}
public byte[] Compress(byte[] data)
{
MemoryStream ms = new MemoryStream();
Stream zipStream = null;
zipStream = new GZipStream(ms, CompressionMode.Compress, true);
zipStream.Write(data, 0, data.Length);
zipStream.Close();
ms.Position = 0;
byte[] compressed_data = new byte[ms.Length];
ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));
return compressed_data;
}
}
}
客戶端調用:C/S
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Compression;
using System.Data.SqlClient;
using System.Runtime.Serialization.Formatters.Binary;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BindDataSet(DataSet DS)
{
this.dataGridView1.DataSource = DS.Tables[0];
}
private void button1_Click(object sender, EventArgs e)
{
com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
DateTime dtBegin = DateTime.Now;
DataSet DS = ds.GetDataSet();
this.label1.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin);
BindDataSet(DS);
}
private void button2_Click(object sender, EventArgs e)
{
com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
DateTime dtBegin = DateTime.Now;
byte[] buffer = ds.GetDataSetBytes();
DataSet DS = ds.GetDataSet();
BinaryFormatter ser = new BinaryFormatter();
DataSet dataset = ser.Deserialize(new MemoryStream(buffer)) as DataSet;
this.label2.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + buffer.Length.ToString());
BindDataSet(DS);
}
private void button3_Click(object sender, EventArgs e)
{
com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
DateTime dtBegin = DateTime.Now;
byte[] buffer = ds.GetDataSetSurrogateBytes();
BinaryFormatter ser = new BinaryFormatter();
DataSet DS = ds.GetDataSet();
DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
DataSet dataset = dss.ConvertToDataSet();
this.label3.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + buffer.Length.ToString());
BindDataSet(DS);
}
private void button4_Click(object sender, EventArgs e)
{
com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
DateTime dtBegin = DateTime.Now;
byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();
byte[] buffer = UnZipClass.Decompress(zipBuffer);
BinaryFormatter ser = new BinaryFormatter();
DataSet DS = ds.GetDataSet();
DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
DataSet dataset = dss.ConvertToDataSet();
this.label4.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + zipBuffer.Length.ToString());
BindDataSet(DS);
}
}
}
UnZipClass.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.IO.Compression;
namespace Test
{
public static class UnZipClass
{
/// <summary>
/// Decompresses the specified data.
/// </summary>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Decompress(byte[] data)
{
try
{
MemoryStream ms = new MemoryStream(data);
Stream zipStream = null;
zipStream = new GZipStream(ms, CompressionMode.Decompress);
byte[] dc_data = null;
dc_data = EtractBytesFormStream(zipStream, data.Length);
return dc_data;
}
catch
{
return null;
}
}
public static byte[] EtractBytesFormStream(Stream zipStream, int dataBlock)
{
try
{
byte[] data = null;
int totalBytesRead = 0;
while (true)
{
Array.Resize(ref data, totalBytesRead + dataBlock + 1);
int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
if (bytesRead == 0)
{
break;
}
totalBytesRead += bytesRead;
}
Array.Resize(ref data, totalBytesRead);
return data;
}
catch
{
return null;
}
}
}
}
④ java編程,為什麼soa都要和webservice聯繫上呢
用一句話來概括基本的觀點就是「SOA不是Web Service,Web Service是目前最適合實現SOA的技術」。 之所以SOA和Web Service被混為一談,最可能的原因了也就在於此吧。
Web Service是就現在而言最適合實現SOA的一些技術的集合,事實上最近SOA的火爆在很大程度上歸功於Web Service標準的成熟和應用的普及為廣泛的實現SOA架構提供了基礎。下面讓我們看看Web Service中的各種協議是如何互相工作來滿足SOA所需的特點的:
獨立的功能實體:通過UDDI的目錄查找,我們可以動態改變一個服務的提供方而無需影響客戶端的應用程序配置。所有的訪問都通過SOAP訪問進行,只要WSDL介面封裝良好,外界客戶端是根本沒有辦法直接訪問伺服器端的數據的。
大數據量低頻率訪問:通過使用WSDL和基於文本(Literal)的SOAP請求,我們可以實現能一次性接收大量數據的介面。這里需要著重指出的是SOAP請求分文本方式和遠程調用(RPC)兩種方式,正如上文已經提到的,採用遠程調用方式的SOAP請求並不符合這點要求。但是令人遺憾的是現有的大多數SOAP請求採用的仍然是遠程調用(RPC)方式,在某些平台上,例如IBM WebSphere的早期版本,甚至沒有提供文本方式的SOAP支持。
基於文本的消息傳遞:Web Service所有的通訊是通過SOAP進行的,而SOAP是基於XML的,不同版本之間可以使用不同的DTD或者XML Schema加以辨別和區分。因此只需要我們為不同的版本提供不同的處理就可以輕松實現版本控制的目標。
⑤ cxf怎樣提高webservice性能,及訪問速度調優
1、 啟用FastInfoset(快速信息集)
webservice的性能實在是不敢恭維。曾經因為吞吐量上不
去,對webservice進行了一些性能方面的優化,採用了FastInfoset,效果很明顯,極端條件下的大數據量傳輸,性能提高60%,他可以減
少傳輸成本,序列化成本和xml解析成本。
Cxf提供了FastInfoset協商機制,實現類見org.apache.cxf.feature.FastInfosetFeature,在bus中啟用如下配置:
<cxf:features><cxf:fastinfoset force="false"/></cxf:features>
Force=false表示服務端和客戶端第一次通信時會協商(通過檢查標準的HTTP頭的Accept欄位,值為MIME類型的application/fastinfoset)是否啟用FastInfoset支持,如果客戶端不支持,則不啟用快速信息集。
需要在pom中添加依賴:
<dependency>
<groupId>com.sun.xml.fastinfoset</groupId>
<artifactId>FastInfoset</artifactId>
<version>1.2.9</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
FastInfoset參考:http://java.sun.com/developer/technicalArticles/xml/fastinfoset/
client和service端都要配置
2、 啟用gzip壓縮支持
客戶端和伺服器端是否使用Gzip壓縮,也是基於http協議協商的(檢查請求
header 中是否有Accept-encoding:gzip)。但是這里需要仔細權衡下。對於小數據量,啟用gzip壓縮支持是吃力不討好的行為,
數據量很小的時候,gzip壓縮結果不明顯,還浪費cpu。我們需要權衡數據大小,按照經驗設置threshold為10*1024byte。
在bus中啟用如下配置:
<bean class="org.apache.cxf.transport.common.gzip.GZIPFeature ">
<property name="threshold"><value>10240</value></property>
</bean>
官方文檔指定是是配置org.apache.cxf.transport.http.gzip.GZIPFeature,但是這個類會找不到,可能是官方文檔年久失修,造成一些混亂。官方文檔中也沒提示指定threshold,請參考GZIPFeature源代碼。
參考http://cxf.apache.org/docs/featureslist.html
3、 使用slf4j代替cxf默認日誌組件
CXF 默認使用java.util.logging作為日誌列印組件,其性能我就不過多評價,也不太便於我們做統一日誌管理。目前系統使用的slf4j作為日誌列印組件,替換如下:
在classpath中加入META-INF/cxf/org.apache.cxf.Logger文件,文件內容為
org.apache.cxf.common.logging.Slf4jLogger
4、 測試中啟用日誌
bus中加入<cxf:logging/>,請在測試環境中啟用有助於debug
補充:
1、如何自定義返回碼:
請求在service中處理遇到異
常後,會調用請求鏈中所有攔截器的handleFault方法,參考PhaseInterceptorChain#unwind,然後判斷請求是否單向請
求,如果不是,則構建異常請求鏈,並構建異常message對象,調用異常請求鏈中的handleMessage 方法(參
考:)
JAXWSMethodInvoker
轉發soap請求到指定對象的方法,如果在請求處理失敗,調用updateHeader方法,把請求時的soap
header放入返回header中。但是不同通過繼承JAXWSMethodInvoker來實現清除異常時soap
header也返回給客戶端的問題,因為JAXWSMethodInvoker沒有採用注入的機制
(JaxWsServerFactoryBean#createInvoker)也沒有chain.異常時,會由這些攔截器處理返回請求:
setup []
prepare-send [MessageSenderInterceptor, Soap11FaultOutInterceptor]
pre-stream [LoggingOutInterceptor, StaxOutInterceptor]
pre-protocol [WebFaultOutInterceptor]
write [SoapOutInterceptor]
攔截器初始化類
我們可以在異常鏈中加入清理soap header的攔截器,清理掉在系統異常時soapheader中有信息的問題。
返回錯誤狀態碼,在執行Soap11FaultOutInterceptor攔截器中被寫死。
message.put(org.apache.cxf.message.Message.RESPONSE_CODE, new Integer(500));
為了使返回數據中有錯誤碼,需要在Soap11FaultOutInterceptor後面加入攔截器
2、在項目測試時遇到一個報錯
invalid LOC header (bad
signature),這個問題是因為jar包損壞照成的,雖然構建路徑中有這個jar,但是還是會出現loadClass失敗,清理maven 本地倉
庫目錄的jar,修改pom(比如加上一空行)讓m2e重新載入。
3、Cxf中有一個很不錯的特性,支持javascript訪問soap
webservice,客戶端訪問http://localhost:8080/cxf/HelloWorld?js類似的請求,會生成
javascript 客戶端,js編程時就可以使用此客戶端提供的對象,啟用此功能需要在引入
<import resource="classpath:META-INF/cxf/cxf-extension-javascript-client.xml" />並且在依賴中加入:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-javascript</artifactId>
<version>2.4.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
⑥ JAVA WebService 允許最大數據多少
這個不帶了解!也不知道你是調用還是怎麼了的! 但是傳進去的都不會遺留到WebService 必要的數據會存入庫中!還有具體的xml文件!不知道你說的啥玩意
⑦ 初學Web Service筆記之怎樣提高WebService性能大數據量網路傳輸處理
private void button4_Click(object sender, EventArgs e)
{
//實例化webservice對象
com.dzbsoft.www.DataSetService ds = new Test.com.dzbsoft.www.DataSetService();
DateTime dtBegin = DateTime.Now;
// 獲取webservice返回的序列化並壓縮後的位元組里數組
byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();
//將位元組流數組解壓縮
byte[] buffer = UnZipClass.Decompress(zipBuffer);
//實例化一個序列化對象
BinaryFormatter ser = new BinaryFormatter();
// 獲取dataset
DataSet DS = ds.GetDataSet();
// 將位元組流轉化為內存流,然後進行反序列化,最後強制轉化為DataSetSurrogate類型
DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
//DataSetSurrogate轉化為Dataset對象
DataSet dataset = dss.ConvertToDataSet();
this.label4.Text = string.Format("耗時:{0}", DateTime.Now - dtBegin + " " + zipBuffer.Length.ToString());
//綁定數據控制項
BindDataSet(DS);
}