這篇文章主要討論如何在不知道介面的情況下進行RPC調用,以及如何在一個線上系統中支持多種不同的RPC協議。 ...
23 | 如何在沒有介面的情況下進行RPC調用?
我們什麼情況下需要在沒有介面時進行RPC調用?
列舉2個典型場景:
- 我們搭建一個測試平臺,允許各個業務方在測試憑條上通過輸入介面、分組名、方法名以及參數值,線上測試自己發佈的RPC服務。
- 我們要搭建一個輕量級的服務網關,可以讓各個業務方用HTTP的方式,通過服務網關調用其他服務。
所謂RPC調用,本質上就是調用端向服務端發送一條請求消息,服務端接收並處理,之後向調用端發送一條響應消息,調用端處理完響應消息後,一次RPC調用就完成了。
如果調用端可以將服務端需要知道的消息,例如介面名、業務分組名、方法名以及參數信息封裝成請求消息發送給伺服器,服務端就能夠解析並處理這條請求信息,這樣問題就解決了。
我們可以使用泛化介面的方式,來讓RPC框架通過動態代理的方式,在沒有介面的情況下,進行RPC調用,也稱為泛化調用。
24 | 如何線上上環境里相容多種RPC協議?
不同的RPC框架隨著互聯網技術的發展而慢慢涌現,這些框架會在不同時期被引入到不同的項目中去解決應用之間的通信問題,這樣就導致了我們線上上的環境中會存在各種各樣的RPC框架。
我們可以嘗試通過自下而上的滾動升級方式,最終讓所有的應用都切換到統一的RPC框架上,這種方法有2個局限:
- 這要求我們能夠清楚的梳理出各個應用之間的調用關係,只有這樣,我們才能按部就班地把所有應用都升級到新的RPC框架上。
- 這要求應用之間的關係不能存在互相調用的情況,最好是應用之間的調用關係就像一棵樹,有一定的層次關係。但實際上,應用之間的調用關係往往會變成一張網。
這裡的關鍵在於,我們要讓新的RPC能同時支持多種RPC調用,當一個調用方切換到新的RPC之後,調用方和服務提供方之間就可以用新的協議完成調用,當調用方用老的RPC進行調用時,調用方和服務提供方之間就繼續沿用老的協議完成調用。
RPC協議的作用是用來分割二進位數據流,不同的協議約定的數據包格式是不一樣的,而且每種協議開頭都有一個協議編碼, 一般叫做magic number。
當RPC收到數據包之後,我們可以先解析出magic number,之後就可以找到對應協議的數據格式,然後使用相應的數據格式去解析收到的二進位數據包。
協議解析過程就是把一連串的二進位數據變成一個RPC內部對象,我們可以把和協議相關的對象轉換成一個和協議無關的對象。
當完成真正的方法調用以後,RPC返回的也是一個和協議無關的通用對象,當我們向調用方回寫數據時,我們還需要把通用對象轉換成和協議相關的對象。
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。