前言
在我不了解一項(xiàng)技術(shù)時慈参,我特別痛恨技術(shù)文檔里那些故弄玄虛的詞输枯,因?yàn)樗麜驌粑覍W(xué)習(xí)的積極性 。在我掌握了一項(xiàng)技術(shù)后券坞,我發(fā)現(xiàn)他們都是紙老虎 鬓催。在我深入理解一項(xiàng)技術(shù)后,我發(fā)現(xiàn)這些詞并不是在故弄玄虛恨锚,因?yàn)闆]有比它更簡潔的表達(dá)宇驾。這個系列會用最白話的方式來闡述dubbo里的方方面面
1. 什么是服務(wù)暴露
先來看一段 dubbo provider 的配置
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> //spring 中一個普通的java bean
<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” /> //將spring中普通的java bean 轉(zhuǎn)化為dubbo provider
這是一段很常見spring dubbo 配置(基于注解、API編程也是等價的)猴伶,在很多分析dubbo原理的文章里课舍,在分析這段配置背后的邏輯時,經(jīng)常會蹦出來一個詞 —— 服務(wù)暴露
2. 用大白話解釋下 “服務(wù)暴露”
先允許我把你們當(dāng)做剛?cè)腴T的小白他挎,我們先從源頭說起 ……
本地方法調(diào)用 vs 遠(yuǎn)程方法調(diào)用(RPC)
public class Test {
@Autowired
UserService userService ;
public void addUser(){
User user = new User();
userService.addUser(user);
}
}
這是一段很簡單的代碼吧筝尾,userService
的 addUser
方法負(fù)責(zé)增加用戶
那么請問 userService.addUser(user);
這行代碼中的 userService
對象是在哪兒呢? 有可能就是在當(dāng)前JVM 堆里办桨,也有可能他只是個傀儡筹淫,真正的執(zhí)行是在遠(yuǎn)程,比如在美國的一臺電腦上
如果userService就是在當(dāng)前JVM里呢撞,那么這行代碼就是最普通的調(diào)用——本地方法調(diào)用
如果userService真正的邏輯執(zhí)行是在遠(yuǎn)程贸街,本地的只是個傀儡,那么這行代碼就是遠(yuǎn)程方法調(diào)用
dubbo 里的方法調(diào)用方式就是這一類RPC遠(yuǎn)程調(diào)用狸相,比如: userService.addUser(user);
如果這里的 userService 是dubbo 的consumer 薛匪,那么本質(zhì)上userService就是個傀儡,真正 addUser(user)
這個動作是要在遠(yuǎn)程執(zhí)行的
本地的dubbo consumer 執(zhí)行 userService.addUser(user);
的時候脓鹃,首先會收集所需的各種信息(userService 這個class逸尖, addUser 方法,user對象信息等),在把這些收集到的信息序列化成 byte 字節(jié)流娇跟,userService 這個傀儡會負(fù)責(zé)把字節(jié)流通過網(wǎng)絡(luò)傳輸?shù)竭h(yuǎn)程岩齿,遠(yuǎn)程收到這些信息后,會反序列化還原這些信息苞俘。于是乎遠(yuǎn)程那個真正的userService就知道要去調(diào)哪個類的哪個方法盹沈,入?yún)⑹鞘裁吹龋h(yuǎn)程就真正執(zhí)行 addUser(user)
這個邏輯
問題的出現(xiàn)
看完上面一段敘述吃谣,突然發(fā)現(xiàn)一個問題: 本地的userService 這個傀儡怎么知道這個所謂的 遠(yuǎn)程
在哪里捌蚍狻?最起碼他要知道遠(yuǎn)程的 ip地址和端口號吧岗憋,不然怎么發(fā)起網(wǎng)絡(luò)連接呢肃晚,怎么傳輸收集到的字節(jié)流呢?
一個最簡單的思路 仔戈,首先遠(yuǎn)程那個真正的userService需要把自己暴露給外界关串,他需要在遠(yuǎn)程監(jiān)聽一個ip、端口號监徘,然后把這個ip晋修、端口號放到一個公共的地方(所有人都能訪問),這樣本地的傀儡在發(fā)起網(wǎng)絡(luò)連接的時候凰盔,可以先到這個公共的地方查一下飞蚓,根據(jù)查到的ip、端口發(fā)起網(wǎng)絡(luò)連接
3. 暴露的本質(zhì)
綜上廊蜒,得出暴露的本質(zhì)就是: dubbo provider端監(jiān)聽一個ip趴拧、端口號,并注冊到公共地方(zk)
知道這個本質(zhì)了山叮,看源碼還不簡單么