dubbo的底層原理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

一、Duboo基本概念解釋

Dubbo是一種分布式服務框架。 Webservice也是一種服務框架,但是webservice并不是分布式的服務框架,他需要結合F5實現負載均衡。因此,dubbo除了可以提供服務之外,還可以實現軟負載均衡。它還提供了兩個功能Monitor 監控中心和調用中心。這兩個是可選的,需要單獨配置。

Dubbo的計數架構圖如下:

這里寫圖片描述

我們解釋以下這個架構圖:

Consumer服務消費者,Provider服務提供者。Container服務容器。消費當然是invoke提供者了,invoke這條實線按照圖上的說明當然同步的意思了,多說一句,在實際調用過程中,Provider的位置對于Consumer來說是透明的,上一次調用服務的位置(IP地址)和下一次調用服務的位置,是不確定的。這個地方就是實現了軟負載。

服務提供者先啟動start,然后注冊register服務。

消費訂閱subscribe服務,如果沒有訂閱到自己想獲得的服務,它會不斷的嘗試訂閱。新的服務注冊到注冊中心以后,注冊中心會將這些服務通過notify到消費者。

Monitor這是一個監控,圖中虛線表明Consumer 和Provider通過異步的方式發送消息至Monitor,Consumer和Provider會將信息存放在本地磁盤,平均1min會發送一次信息。Monitor在整個架構中是可選的(圖中的虛線并不是可選的意思),Monitor功能需要單獨配置,不配置或者配置以后,Monitor掛掉并不會影響服務的調用。

二、dubbo原理

本篇博客的內容總體上比較抽象,如果一個想馬上使用dubbo的同學來說,讀這篇博客效果不太好,本篇博客沒有寫怎么使用、配置dubbo,接下來,我再令寫一篇dubbo入門包含demo的博客。

I、初始化過程細節:
上圖中的第一步start,就是將服務裝載容器中,然后準備注冊服務。和Spring中啟動過程類似,spring啟動時,將bean裝載進容器中的時候,首先要解析bean。所以dubbo也是先讀配置文件解析服務。
解析服務:
1)、基于dubbo.jar內的Meta-inf/spring.handlers配置,spring在遇到dubbo名稱空間時,會回調DubboNamespaceHandler類。
2)、所有的dubbo標簽,都統一用DubboBeanDefinitionParser進行解析,基于一對一屬性映射,將XML標簽解析為Bean對象。
源碼截圖:
在ServiceConfig.export 或者ReferenceConfig.get 初始化時,將Bean對象轉會為url格式,將所以Bean屬性轉成url的參數。
然后將URL傳給Protocol擴展點,基于擴展點的Adaptive機制,根據URL的協議頭,進行不同協議的服務暴露和引用。
暴露服務:

a、 只暴露服務端口

在沒有使用注冊中心的情況,這種情況一般適用在開發環境下,服務的調用這和提供在同一個IP上,只需要打開服務的端口即可。
即,當配置 or
ServiceConfig解析出的URL的格式為:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0
基于擴展點的Adaptiver機制,通過URL的“dubbo://”協議頭識別,直接調用DubboProtocol的export()方法,打開服務端口。

b、向注冊中心暴露服務:

和上一種的區別:需要將服務的IP和端口一同暴露給注冊中心。
ServiceConfig解析出的url格式為:
registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode(“dubbo://service-host/com.xxx.TxxService?version=1.0.0”)

基于擴展點的Adaptive機制,通過URL的“registry://”協議頭識別,調用RegistryProtocol的export方法,將export參數中的提供者URL先注冊到注冊中心,再重新傳給Protocol擴展點進行暴露:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

引用服務:

a、直接引用服務:

在沒有注冊中心的,直連提供者情況下,
ReferenceConfig解析出的URL格式為:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

基于擴展點的Adaptive機制,通過url的“dubbo://”協議頭識別,直接調用DubboProtocol的refer方法,返回提供者引用。

b、從注冊中心發現引用服務:

此時,ReferenceConfig解析出的URL的格式為:
?registry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”)

基于擴展點的Apaptive機制,通過URL的“registry://”協議頭識別,就會調用RegistryProtocol的refer方法,基于refer參數總的條件,查詢提供者URL,如:
Dubbo://service-host/com.xxx.TxxService?version=1.0.0

基于擴展點的Adaptive機制,通過提供者URL的“dubbo://”協議頭識別,就會調用DubboProtocol的refer()方法,得到提供者引用。
然后RegistryProtocol將多個提供者引用,通過Cluster擴展點,偽裝成單個提供這引用返回。

三、遠程調用細節:

服務提供者暴露一個服務的詳細過程:

這里寫圖片描述

上圖是服務提供者暴露服務的主過程:
首先ServiceConfig類拿到對外提供服務的實際類ref,然后將ProxyFactory類的getInvoker方法使用ref生成一個AbstractProxyInvoker實例,到這一步就完成具體服務到invoker的轉化。接下來就是Invoker轉換到Exporter的過程。
Dubbo處理服務暴露的關鍵就在Invoker轉換到Exporter的過程,下面我們以Dubbo和rmi這兩種典型協議的實現來進行說明:
Dubbo的實現:
Dubbo協議的Invoker轉為Exporter發生在DubboProtocol類的export方法,它主要是打開socket偵聽服務,并接收客戶端發來的各種請求,通訊細節由dubbo自己實現。
Rmi的實現:
RMI協議的Invoker轉為Exporter發生在RmiProtocol類的export方法,他通過Spring或Dubbo或JDK來實現服務,通訊細節由JDK底層來實現。

服務消費者消費一個服務的詳細過程

這里寫圖片描述

上圖是服務消費的主過程:
首先ReferenceConfig類的init方法調用Protocol的refer方法生成Invoker實例。接下來把Invoker轉為客戶端需要的接口即可。

?

?轉自:https://blog.csdn.net/qq_33101675/article/details/78701305?utm_source=copy?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BOM屬性對象方法

本文原鏈接:https://cloud.tencent.com/developer/article/1018747 BOM 1.window對象 2.location對象 3.history對象 BOM也叫瀏覽器對象模型,它提供了很多對象,用于訪問瀏覽器的功能。BOM缺少規范,每個瀏覽器提供商又按照自己想法…

nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

實現LNMP 實現環境: 服務版本系統CentOS7.6Mysql5.6.34Nginx1.14.2PHP7.1.30HAProxy1.8.20Keepalived1.3.5NFS1.3.0主機IPMysql_master192.168.37.108Mysql_slave192.168.37.105NginxPHP192.168.37.103NginxPHP192.168.37.104HAProxyKeepalived192.168.37.101HAPro…

OpenCL “速成”沖刺【第一天】

話說軟件開發從來沒有速成一說,一門語言你學的越快,說明你在別的語言上下個功夫越多,所以這次加了引號,只不過幾周之后可能會有一個公司內部OpenCL的考核,雖然本人不需要考核,不過也正好借機整理下之前Open…

Java8函數式編程

最近使用lambda表達式,感覺使用起來非常舒服,箭頭函數極大增強了代碼的表達能力。于是決心花點時間深入地去研究一下java8的函數式。 一、lambda表達式 先po一個最經典的例子——線程 public static void main(String[] args) {// Java7new Thread(new R…

電腦如何獲得管理員權限

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我只是記錄下,方便以后查看。 參見: https://jingyan.baidu.com/article/ab69b270ff426e2ca6189f54.html

.NET混淆器 Dotfuscator如何保護應用程序?控制流了解一下!

Dotfuscator是一個.NET的Obfuscator。它提供企業級的應用程序保護,大大降低了盜版、知識產權盜竊和篡改的風險。Dotfuscator的分層混淆、加密、水印、自動失效、防調試、防篡改、報警和防御技術,為世界各地成千上萬的應用程序提供保護。 Dotfuscator提供…

到底什么才是人生最大的投資

不是房子,不是股票, 是人,跟什么人交往,跟隨什么人, 交什么樣的朋友,其實就是你投資什么人, 而這,是對人生影響最大的。 錢不會給人機會,房子也不會, 只有人會…

tcpdump抓包命令

目錄: 命令格式選項expression表達式示例【命令格式】 man手冊顯示如下 1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]2 [ -c count ]3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ]4 [ -i …

百度Ueditor編輯器wordimage踩坑

背景 改造公司老項目后臺編輯器,使用百度的Ueditor做替換。 發現問題 1、ue編輯器初始化后部分參數無法覆蓋ueditor.config.js中的選項。2、wordimage(word圖片轉存)始終是灰色,無法使用。解決辦法 1、將ueditor.config.js中的inp…

IntelliJ IDEA 配置JDK

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 IDEA配置JDK 1、點擊File -->Project Structure; 2、點擊左側標簽頁SDKs選項,再點擊左上角“”,…

get和post 兩種基本請求方式的區別

GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。 你可能自己寫過無數個GET和POST請求,或者已經看過很多權威網站總結出…

無論是工作還是生活都要記住這些話

1.如果你不喜歡現在的工作,要么辭職不干,要么就閉嘴不言。初出茅廬,往往眼高手低,心高氣傲,大事做不了,小事不愿做。不要養成挑三揀四的習慣。不要雨天煩打傘,不帶傘又怕淋雨,處處表…

蘇嵌第一天,shell中一些基礎知識

一、常用環境變量 1、HOME變量 Linux系統中的每個用戶都有一個相關的稱作HOME的目錄。 2、PATH變量 包含一列用冒號定界的目錄的路徑名字,便于可執行程序的搜索。 3、PS1變量 PS1變量包含了shell提示符,$符號 4、LOGNAME變量 包含用戶的注冊名字…

Java異常處理001:Maven clean package時Failed to clean project: Failed to delete

Java異常處理001:Maven打包時Failed to clean project: Failed to delete 異常日志: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project fmk-web: Failed to clean project: Failed …

Weekly Contest 141

做了第一道后,看了下中間兩道題目,沒怎么看懂就先放著,做完最后一道,然后就沒時間了。 1089. Duplicate Zeros Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining element…

IntelliJ IDEA 中配置、使用 SVN

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.配置svn 如下圖: file -- setting -- version control -- subversion -- 選擇 SVN安裝路徑 -- apply -- OK 2.直接檢出…

切記!職場郵件需注意的細節

電子郵件是如今工作場所重要的通信工具之一,但不是每個人都知道如何很好地使用這個工具。工作郵件也是人際溝通的一種方式,和打電話、面談一樣,有很多學問講究,所以在發送郵件之前一定要深思熟慮。 【發送,抄送&…

李洋瘋狂C語言之初

1.sizeof 是看數據類型所占空間大小,這個大小是以 字節(B)為單位 char 是C語言的字符數據類型 %d 用在printf 中表示往屏幕打印一個數字 printf ("char: %d\n", sizeof(char)); 數據類型之間的關系,shor…

時時流量查看工具-ifsta,nload,iftop

為什么80%的碼農都做不了架構師?>>> 1、ifstat 是一個網絡流量監測程序。能查看網卡的流出和流入的字節. 概要:ifstat就像iostat/vmstat描述其它的系統狀況一樣,是一個統計網絡接口活動狀態的工具。 參數: -l 監測環路…

10大清宿便排毒方法及簡單排毒瘦小腹運動

早上空腹喝水法:每日起床后空腹喝下500C.C.加鹽的冷開水。只要是冷的飲料或水分,在腸胃空腹時都有刺激腸胃蠕動的效果,而且越冰刺激效果越好,建議不需加鹽,以免高血壓患者因鹽分中的金屬離子造成腎的負擔。 優酪乳加綠…