常用的RPC架構---RMI

在分布式時代的今天,我們經常使用rpc技術來實現(xiàn)不同機器的系統(tǒng)相互調用闷盔。原則上來說系統(tǒng)間跨進程的調用都屬于RPC范疇弯洗。

RPC的原理

RPC也就是遠程過程調用,一般用來實現(xiàn)部署在不同機器的系統(tǒng)之間的相互調用逢勾,使得調用方像訪問本地資源一樣通過網絡傳輸去訪問遠端系統(tǒng)資源牡整。

在rpc架構種有幾個重要的概念(角色):

  • Client code:客戶端調用方式代碼,也就是我們經常說的消費方溺拱。負責發(fā)起rpc調用逃贝,為調用方客戶提供api。
  • Server code:服務端提供調用方式代碼迫摔,簡單的沐扳,既然有了調用方,那么就得有服務提供方句占。也就是生產端沪摄,服務端實現(xiàn)具體的業(yè)務邏輯。
  • Serializable/Deserialization:在rpc調用過程中,負責對通過網絡傳輸?shù)臄?shù)據(jù)進行序列化與反序列化杨拐,不同的rpc產品有不同的實現(xiàn)方式祈餐。主要分為文本和二進制兩大類。文本最為常見哄陶,就是我們經常使用的xml以及json昼弟。二進制的序列化機制包括java原生的序列化機制,也包括常見的Hessian奕筐,protobuf舱痘,Thrift,MessagePack等离赫。
  • Stub proxy:可以看做一個代理對象芭逝,屏蔽了rpc調用過程中復雜的網絡處理邏輯。使得rpc調用就像是本地調用一樣的代碼風格渊胸。
  • Transport:rpc底層的通信傳輸模塊旬盯,通過Socket在客戶端與服務端之間傳遞請求以及響應信息
file

常見的RPC框架

常見的RPC框架有RMI,WebService翎猛,Thrift胖翰,gRPC,Http Client等等切厘。今天著重了解RMI萨咳。

RMI

Java RMI是一種基于Java的遠程方法調用技術,是Java實現(xiàn)的一種rpc疫稿。它能使部署在不同機器上的Java對象之間進行通信培他,方法調用

RMI有以下幾個特點:

  • 支持多態(tài)性。這是RMI有區(qū)別于其他RPC框架的主要優(yōu)勢之一遗座。
  • 只支持java語言舀凛。
  • 使用了java原生的序列化機制。也就是必須實現(xiàn)java.io.Serializable接口途蒋。
  • 底層基于BIO實現(xiàn)Socket猛遍。

由于BIO機制的原因,導致性能較差号坡,所以在高性能的場景下不建議使用RMI懊烤。

RMI簡單入手

1)創(chuàng)建UserService接口:

public interface UserService extends Remote {
    public void save(String username) throws Exception ;
}

2)創(chuàng)建UserServiceImpl實現(xiàn)類

public class UserServiceImpl extends UnicastRemoteObject implements UserService, Serializable {
    private static final long serialVersionUID = -9206357578911294402L;
    @Override
    public void save(String username) throws Exception {
        System.out.println("rmi..................username="+username);
    }

    public UserServiceImpl ()throws Exception{

    }
}

服務端的實現(xiàn)要繼承UnicastRemoteObject,該類定義了服務調用方與服務提供方對象實例筋帖,并建立一對一的連接

3)UserServer服務注冊端

public class UserServer {
    public static void main(String[] args) throws Exception {
        UserService userService = new UserServiceImpl();
        //注冊服務
        LocateRegistry.createRegistry(8866);
        Naming.bind("rmi://localhost:8866/userService",userService);
        System.out.println("Server code init finish.......................");
    }
}

4)UserClient:

public class UserClient {
    public static void main(String[] args) throws Exception {
        UserService userService = (UserService) Naming.lookup("rmi://localhost:8866/userService");
        userService.save("張三");
    }
}

5)先運行UserServer的main方法奸晴,然后再運行UserClient的main方法冤馏∪蒸铮控制臺已經打印;

file

RMI穿透防火墻

RMI的通信端口是隨機產生的,因此有可能被防火墻攔截。為了防止被攔截代箭,需要強制RMI指定的通信接口墩划。一般通過自定義RMISocketFactory類來實現(xiàn)。

public class UserSocketFactory extends RMISocketFactory {
    @Override
    public Socket createSocket(String host, int port) throws IOException {
        return new Socket(host, port);
    }

    @Override
    public ServerSocket createServerSocket(int port) throws IOException {
        if(port == 0){
            port = 8866;
        }
        return new ServerSocket(port);
    }
}

然后在使用的時候注入即可:

    public static void main(String[] args) throws Exception {
        UserService userService = new UserServiceImpl();
        //使用UserSocketFactory嗡综,指定通信接口乙帮,防止防火墻攔截
        RMISocketFactory.setSocketFactory(new UserSocketFactory());

        //注冊服務
        LocateRegistry.createRegistry(8866);
        Naming.bind("rmi://localhost:8866/userService",userService);
        System.out.println("Server code init finish.......................");
    }
}

本人水平有限,難免有錯誤或遺漏之處极景,望大家指正和諒解察净,提出寶貴意見,愿與之交流盼樟。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末氢卡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晨缴,更是在濱河造成了極大的恐慌译秦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击碗,死亡現(xiàn)場離奇詭異筑悴,居然都是意外死亡,警方通過查閱死者的電腦和手機稍途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門阁吝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人械拍,你說我怎么就攤上這事求摇。” “怎么了殊者?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵与境,是天一觀的道長。 經常有香客問我猖吴,道長摔刁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任海蔽,我火速辦了婚禮共屈,結果婚禮上,老公的妹妹穿的比我還像新娘党窜。我一直安慰自己拗引,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布幌衣。 她就那樣靜靜地躺著矾削,像睡著了一般壤玫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哼凯,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天欲间,我揣著相機與錄音,去河邊找鬼断部。 笑死猎贴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蝴光。 我是一名探鬼主播她渴,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔑祟!你這毒婦竟也來了惹骂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤做瞪,失蹤者是張志新(化名)和其女友劉穎对粪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體装蓬,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡著拭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牍帚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡遮。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暗赶,靈堂內的尸體忽然破棺而出鄙币,到底是詐尸還是另有隱情,我是刑警寧澤蹂随,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布十嘿,位于F島的核電站,受9級特大地震影響岳锁,放射性物質發(fā)生泄漏绩衷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一激率、第九天 我趴在偏房一處隱蔽的房頂上張望咳燕。 院中可真熱鬧,春花似錦乒躺、人聲如沸招盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曹货。三九已至咆繁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間控乾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工娜遵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜕衡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓设拟,卻偏偏與公主長得像慨仿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纳胧,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容