1. 程式人生 > >基於Spring開發的一個BIO-RPC框架(對小白很友好)

基於Spring開發的一個BIO-RPC框架(對小白很友好)

instance 啟動項 jar包 pan 發現 就是 遠程 map 配置

PART1:先來整體看下項目的構成

技術分享圖片

其中bio-rpc-core就是所謂的rpc框架

bio-rpc-example-client即所謂的服務調用方(你的項目中想要調用服務的地方)

bio-rpc-example-server即所謂的服務提供方(你的項目中寫好服務想要供別人調用的地方)

github地址:https://github.com/Luyu05/BioRpcExample


PART2:這個框架咋用?

服務使用方

1.首先,在想要調用服務的地方(bio-rpc-example-client)引入框架的jar包,本例中如下圖

技術分享圖片

2.跟普通的要托管給spring的bean一樣,在配置文件中引入bean的基本信息,值得註意的是這裏的這個類NetComClientProxy(框架裏的核心部分)

技術分享圖片

3.在想要使用的地方,通過@resource等讓spring幫助我們完成自動註入,此時就可以像調用本地類的方法一樣調用遠程的方法了~

技術分享圖片

4.至此服務使用方講解完成,是不是很簡單,下面看看服務提供方需要做什麽(你會發現比這裏更簡單)

服務提供方

1.第一步與上面類似,引入框架jar包

技術分享圖片

2.第二步,在你想要對外提供的類的上方,加上一個註解

技術分享圖片

3.值得註意的是,還需要在服務提供方服務使用方的pom文件中引入對應的api的jar包,如下圖

技術分享圖片

4.大功告成,啟動項目試試,先啟動server(服務提供端:bio-rpc-example-server),再啟動client(服務調用端:bio-rpc-example-client),如果看到下面內容,就說明你已經成功了~你現在已經可以把服務部署到老王的PC上(我們稱為A),再在你本機上(稱為B)調用A上定義的類以及方法(B是怎麽知道A上定義的方法的具體細節的?還記得我們引入的定義類的api包嗎),最重要的是方法的執行過程耗費的是A機器的資源,與你也就是B機器沒啥太大關系,你只要負責發送調用請求,再收方法執行結果就行了。

技術分享圖片


PART3 框架是咋實現的,為啥我通過簡單的幾個註解,還有配置的bean就可以用老王的機器執行我的任務了?

1.Server


1.1 在web啟動的配置文件中,定義了原始類為框架核心的類-NetComServerFactory,項目啟動時,會自動實例化該bean


1.2 NetComServerFactory中首先會執行bean定義時的property標簽對應的set方法


1.3 接下來執行從ApplicationContextAware繼承的setApplicationContext方法


1.4 setApplicationContext中,調用了一個有趣的方法applicationContext.getBeansWithAnnotation(RpcProviderService.class)


1.5 這個方法將帶有@RpcProviderService標簽的bean 都找到,然後在setApplicationContext中將這些bean 以類名字為主鍵 bean本身為value 放到了一個map裏,名字是serviceMap


1.6 接下來執行afterPropertiesSet方法,該方法繼承自InitializingBean接口


1.7 在afterPropertiesSet方法中,開啟了一個新的線程來在服務端啟動一個端口,來監聽客戶端的請求,由於基於bio所以這時候新的線程內部會堵塞


1.8 獲取到連接後,服務端對每一個客戶端到來的連接都創建一個新線程,獲取客戶端輸入對象-反序列化並解析對象


1.9 根據客戶端的請求傳來的接口信息,從之前的serviceMap中根據類名字找到對應的類,通過反射獲取對應類的實例並調用目標方法


1.10 將反射調用的結果,封裝並傳給客戶端,關閉連接

2.Client


2.1 在web啟動的配置文件中,定義了要使用的服務端的bean,原始類為框架核心的類--NetComClientProxy,項目啟動時,會自動實例化該bean

2.2 在NetComClientProxy中繼承自FactoryBean的getObject方法中return了一個自定義的代理類,Proxy.newProxyInstance(xxx)


2.3 接上,覆寫了invoke方法,使得代理每次調用原始接口方法的時候,都會調用這個invoke方法;


2.4 該方法將當前方法的信息、類信息封裝為請求,一並通過socket發送到服務端,並接收服務端的響應,將結果返回給調用方。


github地址:https://github.com/Luyu05/BioRpcExample


基於Spring開發的一個BIO-RPC框架(對小白很友好)