Dubbo底層原理


dubbo

1. 依賴 spring掃描注入 

2. 反射

3. 動態代理

4.Zookeeper

5.netty

 

                                                                                                                                                                    

 

 服務不在本地,具體實現在遠程  可以用Dubbo

 

 基於XML 效率低 傳輸低  解析低   JSON還好一些

 Dubbo傳輸的是二進制數據  對象序列化成二進制    在網絡中去傳輸     獲取到二進制反序列化成對象    效率高。並且Java寫的,用Java去反序列化。消費端可以是PHP的哈

 當然Dubbo可以發布可以通過FastJSON  可以PHP解析 跨語言解析  但是用了JSON效率降低了

 

 但是XML依然有用!

  如果有不光有文字 還有圖片呢 JSON可以做 但是麻煩。  圖片直接寫到XML中,一次傳輸過來。

  而且可以進行數據檢查,xsd做數據校驗

  而且可以跨平台 C語言都可以

 

Restful 接口很靈活的  是個規范 風格  restful一般返回的都是JSON數據格式

  JSON里面不能包含太大的數據 太大考慮XML

 

原理思路:

  反射(Class.forName("xxx"))  出Class對象來 然后newInstance() 出對象

  有了對象就可以調用方法了  對象是Object 但是不知道是哪個方法啊 需要強轉下 看我調用者的接口了

  使用接口的目的是 不確定具體類型 抽象出一個接口 通過接口去調用實際方法(實際的是遠程jvm的那個哦,遠程的那個怎么實現的 我調用的就是那個實現的)  

   通過反射出類對象,然后動態調用(替換本地的)遠程實現類的方法  (執行的是 反序列化后的對象的那個類的方法   )

 

 我大體給大家貼下代碼吧:  本質就是動態代理  執行之前做個小動作 去執行了代理類的方法

遠端項目啟動Spring 時候  掃描包 掃描到注解  掃到自我容器中

然后放(Socket)到ZK中(服務注冊中心 去注冊服務)登記

 

  或者我在調用方法時候: 比調用 add() 方法時候  不執行本地的方法(本地沒有實現) 

  在調用實際方法時候 通過遠程把真正實例 加載到本地 通過 反射(Invoke 動態代理去實現 首先實現接口InvocationHandler)進行攔截執行 動態執行

  

 網絡編程 效率最高的還是netty啦~ 所以socket 用的 netty   

 在調用實際方法時候 通過遠程 把這是的實例 加載到本地

 

 

 動態代理

  遠程查找對象實例,通過網絡Socket獲取到

  反序列化 並注入對象

 


免責聲明!

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



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