HSF源碼閱讀筆記(一)


HSF(highspeed service framework ) 是淘寶內部使用的一個rpc(remote procedure call) 框架,最近在看Apache Mina的應用層協議的編解碼器時,想到了看HSF的源碼。

1、HSF單元測試環境的啟動: 

HSF組開發同事提供了一個HSFEasyStarter,支持HSF環境的快速啟動。它的原理是: 從淘寶內網下載一個taobao-hsf.sar目錄,這個目錄下面有META-INF,lib,plugins三個目錄. 其中lib目錄下存放了hsf容器的jar (hsf.container-1.4.8.7.jar)和隨着eclipse一起發布的osgi標准的實現(org.eclipse.osgi-framework-3.4.2.R34x_v20080826.jar)

hsf.container-1.4.8.7.jar
hsf.thirdcontainer.jboss-1.4.8.7.jar
hsf.thirdcontainer.tomcat-1.4.8.7.jar
org.eclipse.osgi-framework-3.4.2.R34x_v20080826.jar

HSF容器啟動的時候,會基於equinox的Declare Service的方式進行Service的定義,另外,plugins目錄下的plugin(理解為一個bundle)里面打包了一個properties文件, 里面指明了bundle中需要導出給外部應用使用的HSF的一些Class,並且HSFEasyStarter在啟動時使用的一個HSFMiniContainer對雙親委派的Classloader機制進行了改寫,在App classloader和ext classloader之間插入了一個urlclassloader,這個Urlclassloader就從前面說的bundle導出的類去findClass,代碼片段如下: 

//---------------------創建一個Urlclassloader,指定其父classloader為ext classloader,因為ClassLoader.getSystemClassLoader()取到的是app

//classloader

ClassLoader hsfClassLoader = new URLClassLoader(new URL[]{}, ClassLoader.getSystemClassLoader().getParent()){
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> clazz = exportedClassMap.get(name);
if(clazz != null){
return clazz;
}
throw new ClassNotFoundException(name);
}
};

 

//-------下面的代碼指定app classloader的父classloader為前面介紹的urlclassloader; 

ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
Class<URLClassLoader> sysClass = URLClassLoader.class;
Field parentField = sysClass.getSuperclass().getSuperclass().getDeclaredField("parent");
parentField.setAccessible(true);
parentField.set(sysLoader, hsfClassLoader);

 整個過程可以描述如下: 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM