Dubbo源碼及總結

Springboot整合Dubbo啟動解析Bean定義

根據springboot啟動原理,會先把啟動類下的所有類先進行解析bean定義,所以要先EnableDubbo這個注解,再根據這個注解里面的注解,可以知道import的兩個類DubboComponentScanRegistrar和DubboConfigConfigurationSelector

DubboConfigConfigurationSelector看上去主要用來加載dubbo配置的一些信息

DubboAutoConfiguration這個類是在自動裝配是加載的

本地的類定義和spring.factories需要的類定義加載完會調用this.reader.loadBeanDefinitions(configClasses);開始對ImportBeanDefinitionRegistrar注解的類進行bean定義注冊,DubboComponentScanRegistrar做了兩件事,注冊了ServiceAnnotationBeanPostProcessor和ReferenceAnnotationBeanPostProcessor的bean定義

然后在ServiceAnnotationBeanPostProcessor掃描出有dubbo的@Service注解的類進行注冊,這里會新增一個bean定義類ServiceBean:userServiceIml:xx.xx.comsumer.service.UserService,這個類的class是ServiceBean,以此類推會把所有的@com.alibaba.dubbo.config.annotation.Service注解的都解析了

ReferenceAnnotationBeanPostProcessor主要是對@Reference注解的類做動態代理

Service暴露

等springboot創建完所有bean,由于ServiceBean實現了ApplicationListener接口,所以在ServiceBean的類一些bean創建完之后,會調用onApplicationEvent這個方法,這個方法就是對服務的暴露

給provider,module,registries,monitor,protocols填充屬性

JavassistProxyFactory做動態代理

InjvmProtocol導出

然后就是遠程導出

導出服務

到這里就是創建完netty了,就是獲取注冊中心注冊數據

整個過程差不多就是這樣

Reference服務發現

由于ReferenceBean實現了FactoryBean,所以在創建bean的時候會調用getObject方法

消費者調用提供者服務

Dubbo總結

dubbo協議

支持多協議,默認dubbo協議還有rmi,hessian,http,webservice,hrift,memcached,redis,rest等協議

注冊中心

支持多注冊中心,默認使用 Zookeeper 作為注冊中心,還有 Redis、Multicast、Simple 注冊中心,但不推薦。dubbo會把數據存到本地,所以注冊中心掛了,消費者也可以調用提供者

負載均衡

隨機,輪訓,活躍度,一致性hash

Dubbo容錯策略

failover cluster模式

provider 宕機重試以后,請求會分到其他的provider上,默認兩次,可以手動設置重試次數,建議把寫操作重試次數設置成0。

failback模式

失敗自動恢復會在調用失敗后,返回一個空結果給服務消費者。并通過定時任務對失敗的調用進行重試,適合執行消息通知等操作。

failfast cluster模式

快速失敗只會進行一次調用,失敗后立即拋出異常。適用于冪等操作,寫操作,類似于failover cluster模式中重試次數設置為0的情況。

failsafe cluster模式

失敗安全是指,當調用過程中出現異常時,僅會打印異常,而不會拋出異常。適用于寫入審計日志等操作。

forking cluster模式

并行調用多個服務器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks=“2” 來設置最大并行數。

broadcacst cluster模式

廣播調用所有提供者,逐個調用,任意一臺報錯則報錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。

序列化

dubbo序列化:阿里尚未開發成熟的高效java序列化實現,阿里不建議在生產環境使用它

hessian2序列化(默認推薦):hessian是一種跨語言的高效二進制序列化方式。但這里實際不是原生的hessian2序列化,而是阿里修改過的hessian lite,它是dubbo RPC默認啟用的序列化方式

json序列化:目前有兩種實現,一種是采用的阿里的fastjson庫,另一種是采用dubbo中自己實現的簡單json庫,但其實現都不是特別成熟,而且json這種文本序列化性能一般不如上面兩種二進制序列化。

java序列化:主要是采用JDK自帶的Java序列化實現,性能很不理想。

整體設計

圖例說明:

  • 圖中左邊淡藍背景的為服務消費方使用的接口,右邊淡綠色背景的為服務提供方使用的接口,位于中軸線上的為雙方都用到的接口。
  • 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關系,每一層都可以剝離上層被復用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
  • 圖中綠色小塊的為擴展接口,藍色小塊為實現類,圖中只顯示用于關聯各層的實現類。
  • 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法調用過程,即運行時調用鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為調用的方法。

各層說明

  • Config 配置層:對外配置接口,以 ServiceConfig, ReferenceConfig 為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類
  • Proxy 服務代理層:服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton, 以 ServiceProxy 為中心,擴展接口為 ProxyFactory
  • Registry 注冊中心層:封裝服務地址的注冊與發現,以服務 URL 為中心,擴展接口為 RegistryFactory, Registry, RegistryService
  • Cluster 路由層:封裝多個提供者的路由及負載均衡,并橋接注冊中心,以 Invoker 為中心,擴展接口為 Cluster, Directory, Router, LoadBalance
  • Monitor 監控層:RPC 調用次數和調用時間監控,以 Statistics 為中心,擴展接口為 MonitorFactory, Monitor, MonitorService
  • Protocol 遠程調用層:封裝 RPC 調用,以 Invocation, Result 為中心,擴展接口為 Protocol, Invoker, Exporter
  • Exchange 信息交換層:封裝請求響應模式,同步轉異步,以 Request, Response 為中心,擴展接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
  • Transport 網絡傳輸層:抽象 mina 和 netty 為統一接口,以 Message 為中心,擴展接口為 Channel, Transporter, Client, Server, Codec
  • Serialize 數據序列化層:可復用的一些工具,擴展接口為 Serialization, ObjectInput, ObjectOutput, ThreadPool

Zookeeper和Dubbo的關系

在 Provider 上可以配置的 Consumer 端的屬性有哪些

1)timeout:方法調用超時
2)retries:失敗重試次數,默認重試 2 次
3)loadbalance:負載均衡算法,默認隨機
4)actives 消費者端,最大并發調用限制

Dubbo啟動時如果依賴的服務不可用會怎樣

Dubbo 缺省會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,默認 check="true",可以通過 check="false" 關閉檢查。

當一個服務接口有多種實現時怎么做

當一個接口有多種實現時,可以用 group 屬性來分組,服務提供方和消費方都指定同一個 group 即可。

服務上線怎么兼容舊版本

可以用版本號(version)過渡,多個不同版本的服務注冊到注冊中心,版本號不同的服務相互間不引用。這個和服務分組的概念有一點類似。

Dubbo可以對結果進行緩存嗎

可以,Dubbo 提供了聲明式緩存,用于加速熱門數據的訪問速度,以減少用戶加緩存的工作量。

Dubbo服務之間的調用是阻塞的嗎

默認是同步等待結果阻塞的,支持異步調用。

Dubbo 是基于 NIO 的非阻塞實現并行調用,客戶端不需要啟動多線程即可完成并行調用多個遠程服務,相對多線程開銷較小,異步調用會返回一個 Future 對象。

異步調用流程圖如下。

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

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

相關文章

輸入一串字符,輸入想要字符串前*的個數n,判斷字符串前*的個數是大于n還是小于n,如果大于n則刪除多余的*其它保持不變,如果小于n,則字符串也保持不變

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(char* a, int n) {int i 0, j 0, m 0,b0,c0;char* p;p a;//第一步&#xff0c;判斷字母前面有多少個*while (p[i] *){j;}printf("字母前*的個數%d\n",j);//求總的字符串長度while (a[m] !…

【全開源】沃德商協會管理系統源碼(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的商協會系統&#xff0c;新一代數字化商協會運營管理系統&#xff0c;以“智慧化會員體系、智敏化內容運營、智能化活動構建”三大板塊為基點&#xff0c;實施功能全場景覆蓋&#xff0c;一站式解決商協會需求壁壘&#xff0c;有效快速建立…

護眼小貼士:學生如何正確使用臺燈?

隨著電子設備的普及和長時間的用眼&#xff0c;長時間盯著屏幕或學習&#xff0c;眼睛需要不斷調節焦距&#xff0c;導致眼睛肌肉疲勞&#xff0c;進而引發視力下降。這種現象在年輕一代甚至青少年中尤為普遍&#xff0c;這種疲勞狀態不僅影響眼睛的舒適度&#xff0c;還會導致…

linux配置防火墻端口

配置防火墻&#xff0c;添加或刪除端口&#xff0c;需要有root權限。 防火墻常用命令如下&#xff1a; 1.查看防火墻狀態&#xff1a; systemctl status firewalld active(running)&#xff1a;開啟狀態&#xff0c;正在運行中 inactive(dead)&#xff1a;關閉狀態&#xff…

十、OpenAI之視覺

視覺 學習怎樣使用視覺能力理解圖片 1. 介紹 GPT-4o和GPT-4 Turbo兩個模型都擁有視覺能力&#xff0c;這意味著模型可以接收圖片并回答關于圖片的問題。從歷史上看&#xff0c;語言模型系統被限制采用單一的文本輸入方式。 2. 快速開始 模型使用圖片主要有2種方式&#xff…

qml下拉條實現

qml下拉條實現 代碼結構 代碼結構 Rectangle里面嵌套一個Flickable&#xff0c;然后下面是一個Rectangle&#xff0c;作為滑動的區域&#xff0c;給最外層的Rectangle的y加一個屬性動畫。滑動區域寫好onPressed和Onrelease即可。 import QtQuick 2.15 import QtQuick.Control…

從《紅樓夢》的視角看大模型知識庫 RAG 服務的 Rerank 調優

背景介紹 在之前的文章 有道 QAnything 源碼解讀 中介紹了有道 RAG 的一個主要亮點在于對 Rerank 機制的重視。 從目前來看&#xff0c;Rerank 確實逐漸成為 RAG 的一個重要模塊&#xff0c;在這篇文章中就希望能講清楚為什么 RAG 服務需要 Rerank 機制&#xff0c;以及如何選…

Redisson-分布式鎖單Redis節點模式

Redisson-分布式鎖單Redis節點模式 為什么要用分布式鎖&#xff1f; 使用分布式鎖的主要目的是為了解決多線程或多進程并發訪問共享資源時可能出現的競爭條件和數據一致性問題。舉一些實際場?&#xff1a; 數據庫并發控制&#xff1a;在分布式系統中&#xff0c;多個節點同…

虛擬機上部署java微服務

在Windows服務器上安裝Ubuntu系統&#xff0c;先安裝虛擬機&#xff0c;然后再虛擬機上安裝Ubuntu系統 啟動虛擬機上的Ubuntu系統&#xff0c;然后安裝jdk。安裝好的Ubuntu系統是帶桌面版的&#xff0c;需要打開 “終端” 控制臺&#xff0c;通過命令行交互的方式部署程序&…

git 合并多個commit 使分支保持一次提交

1.控制臺輸入 git log 查看commit歷史 找到歷史提交sha 2.控制臺輸入 git rebase -i d0c5de8f7ca8e58fef347b36dd6b0f42f551cdb4 進入變基 3.輸入英文i進入VM輸入模式 4.保留第一行的pick 后面的pick改為s 5.esc退出輸入模式 6.輸入:wq保存退出 7.輸入英文i進入VM輸入模式…

從0開始實現一個博客系統 (SSM 實現)

相關技術 Spring Spring Boot Spring MVC MyBatis Html Css JS 實現功能 用戶注冊 - 密碼加鹽加密 (md5 加密)前后端用戶信息存儲 - 令牌技術用戶登錄 - (使用 攔截器 做登錄校驗)博客的增刪改查后端數據返回前端, 采用 SpringBoot 做統一功能處理和統一異常處理 數據…

軟考-程序員 知識點與部分真題梳理

軟考-程序員 知識點與部分真題梳理 參照《程序員教程》第五版劃分類別&#xff1b; 持續更新中… 計算機系統基礎知識 如何理解和處理浮點數的加減法運算 在計算機科學中&#xff0c;處理浮點數的表示和運算是基礎且關鍵的&#xff0c;尤其是在進行科學計算、圖形處理和數據分…

V2I(車與基礎設施)介紹

V2I&#xff08;車與基礎設施&#xff09;介紹 一、V2I技術概述 V2I&#xff08;Vehicle-to-Infrastructure&#xff09;技術&#xff0c;全稱汽車與基礎設施通訊&#xff0c;也被稱為信號燈系統。它通過無線通信技術&#xff0c;為車載智能交通運輸系統設立了專門的通信頻段…

【網絡】為什么udp協議報頭有長度字段,而tcp沒有

引言&#xff1a; 在網絡通信中&#xff0c;UDP&#xff08;用戶數據報協議&#xff09;和TCP&#xff08;傳輸控制協議&#xff09;是兩種常用的傳輸層協議。它們在設計和功能上有一些不同之處&#xff0c;其中之一就是報頭中的長度字段。本文將深入探討UDP和TCP協議中長度字…

SpringCloud Alibaba詳解:打造高可用的分布式系統

SpringCloud Alibaba是一個基于Spring Cloud的微服務開發框架&#xff0c;它集成了阿里巴巴的一系列中間件和工具&#xff0c;能夠快速構建高可用的分布式系統。在本文中&#xff0c;將詳細介紹如何使用SpringCloud Alibaba來打造高可用的分布式系統&#xff0c;并通過代碼案例…

第十一課,end關鍵字、簡單while循環嵌套、初識for循環

一&#xff0c;end關鍵字 end關鍵字用于在print輸出的內容后面聲明結束的字符&#xff0c;我們之前學過并且十分了解print是默認輸出內容之后跟著換行的&#xff0c;如果我們不希望換行而希望使用其它字符來代替換行&#xff0c;就可以用end關鍵字來實現 特殊的&#xff0c;en…

k8s筆記 | 高度調度

CronJob計劃任務 簡介&#xff1a;在k8s中周期性運行計劃任務&#xff0c;與linux中的crontab相同&#xff1b;注意點 CornJob執行的時間是controller-manager的時間&#xff0c;所以一定要確保controller-manager的時間是準確的&#xff0c;另外cornjob cron表達式 文章參…

xjoi題庫一級三段題解(c語言版)

浮點數 時間&#xff1a;0.2 空間&#xff1a;32M 題目描述&#xff1a; 小鸚鵡正在學習浮點數&#xff0c;你跟他說一個浮點數&#xff0c;他立刻就能學會。 輸入一個浮點數&#xff0c;輸出這個浮點數。 輸入格式&#xff1a; 輸入一個浮點數 輸出格式&#xff1a; 輸出一個…

2024.5.25AcWing刷題記錄-排序篇

一、786. 第k個數 - AcWing題庫 三路快速排序 import random def func(nums, start, end):if start > end:return idx random.randint(start, end)base nums[idx]i, j, m start, start, end 1while j < m:if nums[j] < base:nums[i], nums[j] nums[j], nums[i]…

Redis機制-Redis緩存穿透,擊穿,雪崩理解等問題的理解和學習

目錄 一 緩存穿透問題 二 緩存擊穿問題 三 緩存雪崩問題&#xff1a; 圖1 正常的Redis緩存流程 一 緩存穿透問題 我們都知道Redis是一個存儲鍵值對的非關系型數據庫&#xff0c;那么當用戶進行查詢的時候&#xff0c;勢必會從前端發起請求&#xff0c;從而數據從Redis緩存…