微服務(wù)設(shè)計筆記(8)—— RPC 調(diào)用方式

RPC(Remote Procedure Call)—遠程過程調(diào)用,它是一種不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議绪氛,就可以通過網(wǎng)絡(luò)负甸,請求遠程服務(wù)器上的服務(wù)。

我們可以調(diào)用本地的一個 RPC , 實際上犀呼,響應(yīng)結(jié)果是由遠程服務(wù)器返回的 。RPC 有很多種類型 , 比如 SOAP薇组、Thrift外臂、 protocol buffers 等等 )。不同的技術(shù)棧律胀,可以通過其接口定義宋光,很方便地生成客戶端或服務(wù)端的樁代碼 貌矿。

  • SOAP(Simple Object Access Protocol),即簡單對象訪問協(xié)議罪佳。它是交換數(shù)據(jù)的一種協(xié)議規(guī)范逛漫,是一種輕量的、簡單的赘艳、基于XML的協(xié)議酌毡,它被設(shè)計成可在 WEB 上交換結(jié)構(gòu)化或固化的信息。
  • Thrift 是一種接口描述語言和二進制通訊協(xié)議蕾管,它被用來定義和創(chuàng)建跨語言服務(wù) 枷踏。它是由 Facebook 為支持 “ 大規(guī)模跨語言服務(wù)” 而開發(fā)的 掰曾。
  • protocol buffer 是 google 的一個開源項目旭蠕。它可串行化結(jié)構(gòu)化的數(shù)據(jù)。就像 XML 婴梧,但它比 XML 更小 下梢、 更快 客蹋、 也更簡單 塞蹭。 我們可以定義自己的數(shù)據(jù)結(jié)構(gòu),然后使用代碼生成器所生成的代碼來讀寫這個數(shù)據(jù)結(jié)構(gòu) 讶坯。甚至可以在無需重新部署程序的情況下更新自定義的數(shù)據(jù)結(jié)構(gòu)番电。

比如, 我們可以讓一個 Java 服務(wù)對外表現(xiàn)為一個 SOAP 服務(wù)接口 , 調(diào)用方可以依據(jù)使用 WSDL( Web Service Definition Language,Web 服務(wù)描述語言 ) 接口定義內(nèi)容,來生成基于 .NET 的客戶端代碼 辆琅。 這些技術(shù)都有一個共同點 , 那就是使用本地調(diào)用的方式和遠程服務(wù)器進行交互漱办。

Java RMI、 Thrift婉烟、 protocol buffers 是以二進制作為消息格式娩井;而 SOAP 用的是 XML,而且綁定特定的網(wǎng)絡(luò)協(xié)議(HTTP)似袁。不同的網(wǎng)絡(luò)協(xié)議洞辣,特性也不同。比如昙衅, TCP 協(xié)議能夠保證消息送達對端扬霜;而 UDP 雖然會丟包,但開銷較小而涉。 所以我們可以根據(jù)實際應(yīng)用場景來選擇不同的技術(shù)棧著瓶。

這些 RPC 實現(xiàn)一般會提供工具,快速生成服務(wù)端或客戶端的樁代碼 , 這樣我們就可以直接開始編碼 啼县。

實際應(yīng)用中材原,RPC 調(diào)用方式并沒有那么好沸久。一開始,問題還不那么明顯 , 但慢慢就會暴露出來 , 其帶來的負面影響要遠遠大于一開始快速編碼所帶來的好處余蟹。

(1)耦合

比如 Java RMI(Remote Method Invocation), 會導(dǎo)致服務(wù)端和客戶端緊密耦合 , 因為雙方都必須使用相同的 Java 技術(shù)棧麦向。而 Thrift 和 protocol buffers 可以支持不同編程語言 , 從而在一定程度上緩解了這個問題 。

(2)遠程調(diào)用的復(fù)雜性

RPC 的原意是隱藏遠程調(diào)用的復(fù)雜性 客叉。但遠程調(diào)用特定涉及網(wǎng)絡(luò)通信時間诵竭、對傳輸對象的序列化與反序列化,這樣都會影響性能兼搏。

還有網(wǎng)絡(luò)本身并不可靠卵慰。所以即使客戶端和服務(wù)端都正常,也會因為網(wǎng)絡(luò)問題佛呻,導(dǎo)致服務(wù)調(diào)用失敗裳朋。還有黑客攻擊情況也要予以考慮。

(3)脆弱性

假設(shè)我們使用 Java RMI 定義了一個服務(wù)接口:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface CustomerRemote extends Remote {
    /**
     * 查找客戶
     *
     * @param id
     * @return
     * @throws RemoteException
     */
    Customer find(String id) throws RemoteException;

    /**
     * 創(chuàng)建客戶
     * @param firstname
     * @param surname
     * @param email
     * @return
     * @throws RemoteException
     */
    Customer create(String firstname, String surname, String email) throws RemoteException;

}

在這個接口定義中 , “創(chuàng)建客戶” 方法吓著,接受姓名及電子郵件作為入?yún)?鲤嫡。 如果客戶端希望只通過電子郵件就可以創(chuàng)建客戶,我們可以在這個接口中绑莺,新定義一個方法 , 如下所示:

 Customer create( String email) throws RemoteException;

因為重新定義了接口暖眼,所以所有的客戶端都需要重新生成樁,即使某些客戶端根本不需要這個新方法 纺裁。這是一個普遍現(xiàn)象诫肠,所以認為RPC 調(diào)用方式是脆弱的。

此外欺缘,還有一種形式的脆弱栋豫。 現(xiàn)在讓我們來看看 Customer 對象:

import java.io.Serializable;

public class Customer implements Serializable {
    private String firstName;
    private String surName;
    private String email;
    private String age;
}

這里的 Customer 客戶對象,除了之前在接口中所看到的 firstName谚殊、surName 和 age 之外丧鸯,還定義了 age 屬性。后來發(fā)現(xiàn)這個屬性嫩絮,完全沒有任何客戶端在使用它丛肢,是一個冗余字段。但不能直接在服務(wù)端刪除它絮记,因為會影響各個調(diào)用者的 Customer 客戶對象摔踱,即使是基于二進制消息格式的 RPC 也存在同樣的問題,即服務(wù)端和客戶端無法實現(xiàn)部署分離怨愤。


如果一定要選用 RPC 調(diào)用方式派敷,那么注意不要對遠程調(diào)用過度抽象,讓客戶端留意網(wǎng)絡(luò)調(diào)用的影響。還要確保我們可以獨立地升級服務(wù)端接口篮愉,而不是強迫客戶端升級腐芍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市试躏,隨后出現(xiàn)的幾起案子猪勇,更是在濱河造成了極大的恐慌,老刑警劉巖颠蕴,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐熙,死亡現(xiàn)場離奇詭異摊腋,居然都是意外死亡装悲,警方通過查閱死者的電腦和手機贱除,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寡键,“玉大人掀泳,你說我怎么就攤上這事∥餍” “怎么了员舵?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藕畔。 經(jīng)常有香客問我马僻,道長,這世上最難降的妖魔是什么劫流? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任巫玻,我火速辦了婚禮,結(jié)果婚禮上祠汇,老公的妹妹穿的比我還像新娘。我一直安慰自己熄诡,他們只是感情好可很,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凰浮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袜茧。 梳的紋絲不亂的頭發(fā)上菜拓,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音笛厦,去河邊找鬼纳鼎。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贱鄙。 我是一名探鬼主播劝贸,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逗宁!你這毒婦竟也來了映九?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞎颗,失蹤者是張志新(化名)和其女友劉穎件甥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哼拔,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嚼蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了管挟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿曙。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僻孝,靈堂內(nèi)的尸體忽然破棺而出导帝,到底是詐尸還是另有隱情,我是刑警寧澤穿铆,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布您单,位于F島的核電站,受9級特大地震影響荞雏,放射性物質(zhì)發(fā)生泄漏虐秦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一凤优、第九天 我趴在偏房一處隱蔽的房頂上張望悦陋。 院中可真熱鬧,春花似錦筑辨、人聲如沸俺驶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暮现。三九已至,卻和暖如春楚昭,著一層夾襖步出監(jiān)牢的瞬間栖袋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工抚太, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塘幅,地道東北人昔案。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像晌块,于是被迫代替她去往敵國和親爱沟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容