前面我們講了容器網路如何實作跨主機互通,以及微服務之間的相互呼叫,

網路是打通了,那服務之間的互相呼叫,該怎么實作呢?你可能說,咱不是學過 Socket 嗎,服務之間分呼叫方和被呼叫方,我們就建立一個 TCP 或者 UDP 的連接,不就可以通信了?

你仔細想一下,這事兒沒這么簡單,我們就拿最簡單的場景,客戶端呼叫一個加法函式,將兩個整數加起來,回傳它們的和,
如果放在本地呼叫,那是簡單的不能再簡單了,只要稍微學過一種編程語言,三下五除二就搞定了,但是一旦變成了遠程呼叫,門檻一下子就上去了,
首先你要會 Socket 編程,至少先要把咱們這門網路協議課學一下,然后再看 N 本磚頭厚的 Socket 程式設計的書,學會咱們學過的幾種 Socket 程式設計的模型,這就使得本來大學畢業就能干的一項作業,變成了一件五年作業經驗都不一定干好的作業,而且,搞定了 Socket 程式設計,才是萬里長征的第一步,后面還有很多問題呢!
如何解決這五個問題?
問題一:如何規定遠程呼叫的語法?
客戶端如何告訴服務端,我是一個加法,而另一個是乘法,我是用字串“add”傳給你,還是傳給你一個整數,比如 1 表示加法,2 表示乘法?服務端該如何告訴客戶端,我的這個加法,目前只能加整數,不能加小數,不能加字串;而另一個加法“add1”,它能實作小數和整數的混合加法,那回傳值是什么?正確的時候回傳什么,錯誤的時候又回傳什么?
問題二:如果傳遞引數?
我是先傳兩個整數,后傳一個運算子“add”,還是先傳運算子,再傳兩個整數?是不是像咱們資料結構里一樣,如果都是 UDP,想要實作一個逆波蘭運算式,放在一個報文里面還好,如果是 TCP,是一個流,在這個流里面,如何將兩次呼叫進行分界?什么時候是頭,什么時候是尾?把這次的引數和上次的引數混了起來,TCP 一端發送出去的資料,另外一端不一定能一下子全部讀取出來,所以,怎么才算讀完呢?
問題三:如何表示資料?
在這個簡單的例子中,傳遞的就是一個固定長度的 int 值,這種情況還好,如果是變長的型別,是一個結構體,甚至是一個類,應該怎么辦呢?如果是 int,不同的平臺上長度也不同,該怎么辦呢?
在網路上傳輸超過一個 Byte 的型別,還有大端 Big Endian 和小端 Little Endian 的問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/208293.html
標籤:其他
下一篇:mybatis的主組態檔講述
