開源中間件DUBBO介紹

一褪储、dubbo是什么遭垛?

Dubbo是一個(gè)分布式RPC中間件。RPC(Remote Procedure Call)

遠(yuǎn)程過程調(diào)用協(xié)議未状,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請求服務(wù)鸭限,

而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議蜕径。RPC可以認(rèn)為是普通的c/s模式,服務(wù)提供方作為服務(wù)端里覆,服務(wù)調(diào)用方作為客戶端丧荐。

通常的RPC過程如下圖:

二、如何實(shí)現(xiàn)一個(gè)Rpc

服務(wù)端代碼通過監(jiān)聽一個(gè)端口暴露服務(wù):

public static void export(final Object service, int port) throws Exception {

ServerSocket server = new ServerSocket(port);

for (; ; ) {

try {

final Socket socket = server.accept();

new Thread(new Runnable() {

@Override

public void run() {

try {

try {

ObjectInputStream input = new ObjectInputStream(socket.getInputStream());

try {

String methodName = input.readUTF();

Class[] parameterTypes = (Class[]) input.readObject();

Object[] arguments = (Object[]) input.readObject();

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

try {

Method method = service.getClass().getMethod(methodName, parameterTypes);

Object result = method.invoke(service, arguments);

output.writeObject(result);

} catch (Throwable t) {

output.writeObject(t);

} finally {

output.close();

}

} finally {

input.close();

}

} finally {

socket.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

} catch (Exception e) {

e.printStackTrace();

}

}

}

客戶端根據(jù)服務(wù)提供者IP和端口喧枷,進(jìn)行服務(wù)引用

@SuppressWarnings("unchecked")

public static T refer(final Class interfaceClass, final String host, final int port)

throws Exception {

if (interfaceClass == null) {

throw new IllegalArgumentException("Interface class == null");

}

if (!interfaceClass.isInterface()) {

throw new IllegalArgumentException(

"The " + interfaceClass.getName() + " must be interface class!");

}

if (host == null || host.length() == 0) {

throw new IllegalArgumentException("Host == null!");

}

if (port <= 0 || port > 65535) {

throw new IllegalArgumentException("Invalid port " + port);

}

System.out.println(

"Get remote service " + interfaceClass.getName() + " from server " + host + ":" + port);

return (T) Proxy

.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{interfaceClass},

new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] arguments)

throws Throwable {

Socket socket = new Socket(host, port);

try {

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

try {

output.writeUTF(method.getName());

output.writeObject(method.getParameterTypes());

output.writeObject(arguments);

ObjectInputStream input = new ObjectInputStream(socket.getInputStream());

try {

Object result = input.readObject();

if (result instanceof Throwable) {

throw (Throwable) result;

}

return result;

} finally {

input.close();

}

} finally {

output.close();

}

} finally {

socket.close();

}

}

});

}

可以看到,最簡單的RPC方式弓坞,不需要太多的代碼隧甚。但是在最簡單的RPC實(shí)現(xiàn)模型中,有一些問題:

1.服務(wù)端的狀態(tài)變化(不可用渡冻,對客戶端的權(quán)限變化)戚扳,怎么通知到客戶端?

2.服務(wù)的增減(可擴(kuò)展性)

3.調(diào)用關(guān)系拓?fù)洌?/p>

4.服務(wù)端永遠(yuǎn)不知道誰會(huì)對它提供的服務(wù)感興趣族吻。

5.服務(wù)質(zhì)量保證

.......

總之有很多可用性帽借、可擴(kuò)展性、可管理等許多問題無法解決超歌。

三砍艾、RPC改進(jìn)一點(diǎn)

普通的RPC有諸多缺陷,但我們期望的是高可用巍举、高性能脆荷、高度可擴(kuò)展的系統(tǒng)。而這些特性恰是分布式系統(tǒng)的設(shè)計(jì)目標(biāo)。

我們?nèi)绾巫龇植际降膽?yīng)用:

普通的C/S模型實(shí)現(xiàn)是一個(gè)server端蜓谋,而在分布式中梦皮,采用的多節(jié)點(diǎn)集群;不論是客戶端還是服務(wù)端,都是多節(jié)點(diǎn)集群桃焕,而且各個(gè)節(jié)點(diǎn)是動(dòng)態(tài)可增減的剑肯。為此我們引入了注冊中心的概念。注冊中心將服務(wù)端和客戶端解耦观堂,工作方式大體如下:


四退子、更具體一些

在dubbo中,其實(shí)是服務(wù)提供者在zk進(jìn)行Path的創(chuàng)建型将,Path中包含了服務(wù)相關(guān)的配置信息(服務(wù)名寂祥、消費(fèi)白名單、序列化協(xié)議七兜、服務(wù)器地址等)丸凭,如下:


同時(shí),客戶端需要上報(bào)自己引用了哪些服務(wù)腕铸。相比服務(wù)發(fā)布惜犀,訂閱服務(wù)麻煩得多,dubbo服務(wù)訂閱的實(shí)現(xiàn)方式是:通過監(jiān)聽provide目錄和configurators目錄狠裹;provide目錄虽界,就是所有注冊同一服務(wù)的提供者都會(huì)在這個(gè)目錄下創(chuàng)建Path;configurations一般由服務(wù)訂閱者初始化創(chuàng)建涛菠,控制臺(tái)來修改里面的內(nèi)容(增刪path莉御,如序列化協(xié)議、負(fù)載均衡算法俗冻、超時(shí)控制等)礁叔。具體如下:

客戶端上報(bào)服務(wù)的具體例子:

客戶端調(diào)用具體流程:

本文作者:楊濤(點(diǎn)融黑幫),就職于點(diǎn)融架構(gòu)組迄薄,JAVA程序員一枚琅关。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讥蔽,隨后出現(xiàn)的幾起案子涣易,更是在濱河造成了極大的恐慌,老刑警劉巖冶伞,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件新症,死亡現(xiàn)場離奇詭異,居然都是意外死亡碰缔,警方通過查閱死者的電腦和手機(jī)账劲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瀑焦,你說我怎么就攤上這事腌且。” “怎么了榛瓮?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵铺董,是天一觀的道長。 經(jīng)常有香客問我禀晓,道長精续,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任粹懒,我火速辦了婚禮重付,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凫乖。我一直安慰自己确垫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布帽芽。 她就那樣靜靜地躺著删掀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪导街。 梳的紋絲不亂的頭發(fā)上披泪,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機(jī)與錄音搬瑰,去河邊找鬼款票。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跌捆,可吹牛的內(nèi)容都是我干的徽职。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼佩厚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了说订?” 一聲冷哼從身側(cè)響起抄瓦,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陶冷,沒想到半個(gè)月后钙姊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂伦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年煞额,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膊毁,死狀恐怖胀莹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婚温,我是刑警寧澤描焰,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站栅螟,受9級(jí)特大地震影響荆秦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜力图,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一步绸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吃媒,春花似錦瓤介、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漓概,卻和暖如春漾月,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胃珍。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工梁肿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人觅彰。 一個(gè)月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓吩蔑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親填抬。 傳聞我的和親對象是個(gè)殘疾皇子烛芬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)飒责,斷路器赘娄,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 概念解釋RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)...
    Jerry_unused閱讀 1,085評論 0 1
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,313評論 0 6
  • RPC框架遠(yuǎn)程調(diào)用的實(shí)現(xiàn)方式在原理上是比較簡單的宏蛉,即將調(diào)用的方法(接口名遣臼、方法名、參數(shù)類型拾并、參數(shù))序列化之后發(fā)送到...
    謎碌小孩閱讀 3,095評論 0 13
  • 【內(nèi)楗第三】 原文: (3.1)君臣上下之事揍堰,有遠(yuǎn)有親鹏浅,近而疏,就之不用屏歹,去之反求隐砸。日進(jìn)前而不御,遙聞聲而相思西采。事...
    瀚王閱讀 310評論 0 0