筆者,不玩游戲已經(jīng)有一個(gè)月的時(shí)間了。昨天偶然發(fā)現(xiàn)大家都在玩吃雞,于是好奇心作祟,昨個(gè)不知不覺就到了5點(diǎn)多。筆者現(xiàn)在的電腦配置是10年前的,現(xiàn)在大的期待是能夠有一臺(tái)配置高、外觀漂亮的電腦。好了,每天閑扯一下其實(shí)很開心,也主要是現(xiàn)在的游戲大都是3D體驗(yàn)感的,筆者暈3D渲染(配置低的電腦更明顯),沒辦法啊。好了廢話不多說了,現(xiàn)在我們實(shí)現(xiàn)一種跨Web網(wǎng)站的數(shù)據(jù)推送技術(shù):從當(dāng)前的Web網(wǎng)站生成一個(gè)數(shù)據(jù)文件包,然后將該數(shù)據(jù)文件包推送到另一個(gè)Web網(wǎng)站中,實(shí)現(xiàn)網(wǎng)站展現(xiàn)效果的實(shí)時(shí)推送。對(duì)此,筆者嘗試使用Hessian解決跨Web服務(wù)進(jìn)行服務(wù)器間的數(shù)據(jù)推送。
總結(jié)一下hessian:
1、 相比WebService,Hessian更簡(jiǎn)單、快捷。
2、采用的是二進(jìn)制RPC協(xié)議
RPC是指遠(yuǎn)程過程調(diào)用協(xié)議,因?yàn)椴捎玫氖嵌M(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。
3、對(duì)象必須進(jìn)行序列化
由于使用二進(jìn)制RPC協(xié)議傳輸數(shù)據(jù),對(duì)象必須進(jìn)行序列化,實(shí)現(xiàn)Serializable 接口
4、通過 Hessian 本身提供的 API 來發(fā)起請(qǐng)求。
5 、Hessian 通過其自定義的串行化機(jī)制將請(qǐng)求信息進(jìn)行序列化,產(chǎn)生二進(jìn)制流。
6、Hessian 基于 Http 協(xié)議進(jìn)行傳輸。
7、響應(yīng)端根據(jù) Hessian 提供的 API 來接收請(qǐng)求。
8、Hessian 根據(jù)其私有的串行化機(jī)制來將請(qǐng)求信息進(jìn)行反序列化,傳遞給使用者時(shí)已是相應(yīng)的請(qǐng)求信息對(duì)象了。
9 、處理完畢后直接返回, hessian 將結(jié)果對(duì)象進(jìn)行序列化,傳輸至調(diào)用端。
調(diào)用端通過 HessianProxyFactory 的 create 方法就是創(chuàng)建接口的代理類,該類實(shí)現(xiàn)了接口, JDK 的 proxy 類會(huì)自動(dòng)用 InvocationHandler 的實(shí)現(xiàn)類(該類在 Hessian 中表現(xiàn)為 HessianProxy )的 invoke 方法體來填充所生成代理類的方法體。
Hessian 的這個(gè)遠(yuǎn)程過程調(diào)用,完全使用動(dòng)態(tài)代理來實(shí)現(xiàn)的。
除去 spring 對(duì)其的封裝,調(diào)用端主要是通過 HessianProxyFactory 的 create 方法就是創(chuàng)建接口的代理類,該類實(shí)現(xiàn)了接口, JDK 的 proxy 類會(huì)自動(dòng)用 InvocationHandler 的實(shí)現(xiàn)類(該類在 Hessian 中表現(xiàn)為 HessianProxy )的 invoke 方法體來填充所生成代理類的方法體。
調(diào)用端系統(tǒng)啟動(dòng)時(shí):
根據(jù) serviceUrl 和 serviceInterface 創(chuàng)建代理。
HessianProxyFactoryBean 類
HessianClientInterceptor 類
createHessianProxy(HessianProxyFactory proxyFactory)
HessianProxyFactory 類
public Object create(Class api, String urlName)
調(diào)用端調(diào)用 hessian 服務(wù)時(shí):
HessianProxy 類的 invoke(Object proxy, Method method, Object []args) 方法
String methodName = method.getName();// 取得方法名
Object value = args[0]; // 取得傳入?yún)?shù)
conn = sendRequest(mangleName, args) ; // 通過該方法和服務(wù)器端取得連接
httpConn = (HttpURLConnection) conn;
code = httpConn.getResponseCode(); // 發(fā)出請(qǐng)求
// 等待被調(diào)用端返回相應(yīng)…………
is = conn.getInputStream();
Object value = in.readObject(method.getReturnType()); // 取得返回值
HessianProxy 類的 URLConnection sendRequest(String methodName, Object []args) 方法:
URLConnection conn = _factory.openConnection(_url); // 創(chuàng)建 URLConnection
OutputStream os = conn.getOutputStream();
AbstractHessianOutput out = _factory.getHessianOutput(os); // 封裝為 hessian 自己的輸入輸出 API
out.call(methodName, args);
return conn;
被調(diào)用端接收請(qǐng)求并處理請(qǐng)求
被調(diào)用端截獲相應(yīng)請(qǐng)求交給:
org.springframework.remoting.caucho.HessianServiceExporter
具體處理步驟如下:
a) HessianServiceExporter 類
(HessianExporter) invoke(request.getInputStream(), response.getOutputStream());
b) HessianExporter 類
(Hessian2SkeletonInvoker) this.skeletonInvoker.invoke(inputStream, outputStream);
c) Hessian2SkeletonInvoker 類
將輸入輸出封轉(zhuǎn)化為轉(zhuǎn)化為 Hessian 特有的 Hessian2Input 和 Hessian2Output
Hessian2Input in = new Hessian2Input(isToUse);
in.setSerializerFactory(this.serializerFactory);
AbstractHessianOutput out = null;
int major = in.read();
int minor = in.read();
out = new Hessian2Output(osToUse);
out = new HessianOutput(osToUse);
out.setSerializerFactory(this.serializerFactory);
(HessianSkeleton) this.skeleton.invoke(in, out);
d) HessianSkeleton 類
讀取方法名
String methodName = in.readMethod();
Method method = getMethod(methodName);
讀取方法參數(shù)
Class []args = method.getParameterTypes();
Object []values = new Object[args.length];
執(zhí)行相應(yīng)方法并取得結(jié)果
result = method.invoke(service, values);
結(jié)果寫入到輸出流
out.writeObject(result);
總結(jié): 由上面源碼分析可知,被調(diào)用端接收處理請(qǐng)求都是通過 hessian 自己的 API 。輸入輸出流都要封裝為 hessian 自己的 Hessian2Input 和 Hessian2Output
筆者一直堅(jiān)信,簡(jiǎn)單代碼迭代出復(fù)雜功能。
下篇繼續(xù),實(shí)地過程中的hessian,跨Web服務(wù)的數(shù)據(jù)推送。
參考資料《Hessian百度百科》
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。