解決接口與動態(tài)代理綁定問題,實(shí)現(xiàn)rpc的最后一站

前言
昨天我們終于把rpc動態(tài)代理實(shí)現(xiàn)了,有了動態(tài)代理才是真rpc,但是真正實(shí)現(xiàn)之后,發(fā)現(xiàn)rpc服務(wù)框架還是挺簡單的,核心的核心就是動態(tài)代理,如果沒有動態(tài)代理作技術(shù)支持,這個(gè)遠(yuǎn)程調(diào)用還真的不好實(shí)現(xiàn),至少我沒有更好的實(shí)現(xiàn)思路。
今天我在昨天動態(tài)代理的基礎(chǔ)上,做了一些整理優(yōu)化,增加動態(tài)幫忙功能,讓我們的框架在使用的時(shí)候可以更靈活,具體來說就是在我們服務(wù)消費(fèi)者啟動的時(shí)候,會自動掃描加了RpcConsumer的消費(fèi)者類,如果該類存在加了RpcClient注解的屬性,就會給該屬性綁定一個(gè)動態(tài)代理對象,這樣在調(diào)用接口的方法,就會自動去調(diào)用遠(yuǎn)程方法。下面就看下具體如何實(shí)現(xiàn)。
動態(tài)代理綁定
這里的綁定就是在消費(fèi)者注冊的同時(shí),生成代理類,然后創(chuàng)建消費(fèi)類的實(shí)例,并把生成的代理類賦值給消費(fèi)者實(shí)例加了RpcClient注解的字段,這里同時(shí)還要把當(dāng)前消費(fèi)者的實(shí)例存放到IOC容器中,不然賦值就失效了,因?yàn)橘x值只能給實(shí)例的屬性賦值。

使用的話,也很簡單,只需要從容器中直接拿出消費(fèi)者的實(shí)例,然后通過消費(fèi)者實(shí)例調(diào)用對應(yīng)的service方法。這一塊如果和我們的syske-boot服務(wù)器整合的話,那用起來就很方便了,直接通過Service注解就ok了。

測試
我們來測試下看看。服務(wù)端沒有任何變化,直接啟動即可,然后運(yùn)行消費(fèi)者端:

可以看到,消費(fèi)者consumer實(shí)例的helloService已經(jīng)和代理對象綁定成功。
總結(jié)
今天的內(nèi)容很簡單,就是簡單的流程梳理和優(yōu)化,原來考慮rpc的內(nèi)容會和之前的web服務(wù)器一樣,能夠分享一周左右,但是真正做下來,發(fā)現(xiàn)核心的知識點(diǎn)不多,所以rpc的知識差不多就要結(jié)束了,后續(xù)可能會再探討下與zk整合這塊的實(shí)現(xiàn)、與我們的syske-boot項(xiàng)目整合的實(shí)現(xiàn),其他目前還想不到,等后面再說。
rpc這塊結(jié)束后,我打算去研究下限流、熔斷、網(wǎng)關(guān)等技術(shù)的實(shí)現(xiàn),相關(guān)的技術(shù)還有很多,比如配置中心、注冊中心等,反正我覺得搞清楚原理,然后通過自己的思路把這些核心功能實(shí)現(xiàn),整個(gè)過程還是蠻有意思的,不僅對好多組件的原理有了不一樣的認(rèn)識,同時(shí)還對java底層的一些原理和解決方案,有了更多的了解。
好了,今天就到這里吧!天氣又開始熱起來了,各位小伙伴注意防暑哦!
- END -