Dubbo運行原理

目錄

Dubbo通訊協議

Dubbo負載均衡策略

RPC和HTTP有什么區別?

讓你設計一個RPC框架,如何考慮數據序列化問題?


Dubbo 是一款高性能、輕量級的開源?RPC(遠程過程調用)框架,主要用于構建分布式服務和微服務架構。

要說 Dubbo 運行流程就不得不先來了解一下 Dubbo 的核心組件了,因為 Dubbo 的交互流程是和核心組件息息相關的。

Dubbo 核心組件有以下幾個:

  • 服務提供者(Provider):暴露服務的應用,通過 Dubbo 框架將自身的服務接口及實現注冊到注冊中心。

  • 服務消費者(Consumer):調用遠程服務的應用,從注冊中心訂閱所需的服務,然后通過遠程調用消費服務。

  • 注冊中心(Registry):集中管理服務的地址信息,服務提供者和服務消費者均在此注冊或訂閱服務信息。常見的注冊中心有 ZooKeeper、Nacos 等。

Dubbo 運行流程如下圖所示:

圖片

它的執行流程如下:

  1. 服務提供者會將實例(URL 地址)注冊到注冊中心,注冊中心負責對數據進行聚合(健康檢測)。

  2. 消費者從注冊中心讀取地址列表并訂閱變更,每當地址列表發生變化,注冊中心將最新的列表通知到所有訂閱的消費者實例。

  3. 消費者得到服務實例之后,通過 Dubbo 內置的負載均衡策略,選擇其中的一個節點,之后使用 RPC 的方式與服務提供者建立連接,并進行通訊和服務調用。

更詳細的調用流程如下:

Dubbo通訊協議

Dubbo 框架提供了自定義的高性能 RPC 通信協議:基于 HTTP/2 的 Triple 協議和基于 TCP 的 Dubbo2 協議。除此之外,Dubbo 框架支持任意第三方通信協議,如官方支持的 gRPC、Thrift、REST、JsonRPC、Hessian2 等,更多協議可以通過自定義擴展實現。這對于微服務實踐中經常要處理的多協議通信場景非常有用。Dubbo 框架不綁定任何通信協議,在實現上 Dubbo 對多協議的支持也非常靈活,它可以讓你在一個應用內發布多個使用不同協議的服務,并且支持用同一個 port 端口對外發布所有協議。

通過 Dubbo 框架的多協議支持,你可以做到:

  • 將任意通信協議無縫地接入 Dubbo 服務治理體系。Dubbo 體系下的所有通信協議,都可以享受到 Dubbo 的編程模型、服務發現、流量管控等優勢。比如 gRPC over Dubbo 的模式,服務治理、編程 API 都能夠零成本接入 Dubbo 體系。

  • 兼容不同技術棧,業務系統混合使用不同的服務框架、RPC 框架。比如有些服務使用 gRPC 或者 Spring Cloud 開發,有些服務使用 Dubbo 框架開發,通過 Dubbo 的多協議支持可以很好的實現互通。

  • 讓協議遷移變的更簡單。通過多協議、注冊中心的協調,可以快速滿足公司內協議遷移的需求。比如如從自研協議升級到 Dubbo 協議,Dubbo 協議自身升級,從 Dubbo 協議遷移到 gRPC,從 HTTP 遷移到 Dubbo 協議等。

Dubbo負載均衡策略

目前 Dubbo(3.X)內置了如下負載均衡算法如下:

  1. Weighted Random LoadBalance(加權隨機):默認負載均衡算法,默認權重相同。按權重設置隨機概率。缺點:存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。

  2. RoundRobin LoadBalance(加權輪詢):借鑒于 Nginx 的平滑加權輪詢算法,默認權重相同,按公約后的權重設置輪詢比率,循環調用節點。缺點:同樣存在慢的提供者累積請求的問題。

  3. LeastActive LoadBalance(最少活躍優先+加權隨機):背后是能者多勞的思想,活躍數越低,越優先調用,相同活躍數的進行加權隨機。活躍數指調用前后計數差(針對特定提供者:請求發送數 - 響應返回數),表示特定提供者的任務堆積量,活躍數越低,代表該提供者處理能力越強。使慢的提供者收到更少請求,因為越慢的提供者的調用前后計數差會越大;相對的,處理能力越強的節點,處理更多的請求。

  4. Shortest-Response LoadBalance(最短響應優先+加權隨機):更加關注響應速度,在最近一個滑動窗口中,響應時間越短,越優先調用。相同響應時間的進行加權隨機。使得響應時間越快的提供者,處理更多的請求。缺點:可能會造成流量過于集中于高性能節點的問題。

  5. ConsistentHash LoadBalance(一致性哈希):確定的入參,確定的提供者,適用于有狀態請求。當某一臺提供者掛時,原本發往該提供者的請求,基于虛擬節點,平攤到其它提供者,不會引起劇烈變動。

  6. P2C LoadBalance(隨機選擇兩個節點+連接數較小):隨機選擇兩個節點后,繼續選擇“連接數”較小的那個節點。對于每次調用,從可用的 provider 列表中做兩次隨機選擇,選出兩個節點 providerA 和 providerB,比較 providerA 和 providerB 兩個節點,選擇其“當前正在處理的連接數”較小的那個節點。

  7. Adaptive LoadBalance(自適應負載均衡):在?P2C?算法基礎上,選擇二者中 load 最小的那個節點,是一種能根據后端實例負載自動調整流量分布的算法實現,它總是嘗試將請求轉發到負載最小的節點。

RPC和HTTP有什么區別?

RPC(Remote Procedure Call,遠程過程調用)和 HTTP(Hypertext Transfer Protocol,超文本傳輸協議)都是用于服務間通訊的,它們主要區別如下:

  1. 概念和使用場景不同

    • RPC:RPC 是一種通信模式,允許一個程序在另一個地址空間上執行遠程計算過程,使得客戶端調用遠程服務就像調用本地方法一樣。

    • HTTP:HTTP 是一個應用層協議,用于在客戶端和服務器之間傳輸文本、圖像、視頻等超媒體資源,通常用于 Web 應用之間的通信。

  2. 傳輸數據不同

    • RPC:RPC 通常基于二進制數據傳輸,可以使用更高效的序列化方式(如 Protobuf、Thrift)進行數據交換。

    • HTTP:HTTP 使用文本協議,請求和響應數據通常是基于文本格式(如 JSON、XML)進行傳輸。

  3. 傳輸效率與性能不同

    • RPC:因為 RPC 通常使用更高效的二進制序列化(如 Protobuf、Thrift),減少了數據傳輸的體積,且由于其針對性的設計,往往在性能上更為優越,特別是在大量小數據包的傳輸場景。

    • HTTP:傳統上使用文本格式如 JSON 進行數據交換,這可能導致更大的數據包和更多的序列化/反序列化開銷,但在 HTTP/2 中引入了頭部壓縮和多路復用,提升了效率。

讓你設計一個RPC框架,如何考慮數據序列化問題?

數據序列化需要考慮的以下問題:

  1. 性能問題:選擇高性能的序列化庫至關重要。二進制序列化(如 Protocol Buffers, Apache Thrift, FlatBuffers)通常比文本格式(如 JSON、XML)更高效,因為它們占用的空間小,序列化和反序列化的速度更快。對于高性能要求的場景,應優先考慮這些二進制格式。

  2. 安全性:在序列化過程中,應考慮數據的安全性,避免敏感信息的泄露。可以采用加密序列化內容、過濾敏感字段或使用安全的傳輸層協議(如 TLS/SSL)來增加安全性。

  3. 兼容性:良好的版本兼容性是長期維護 RPC 框架的關鍵。設計時要考慮向前和向后兼容,即新老版本的序列化庫應能互相理解和處理對方生成的數據格式。可以采用預留字段、版本標識符等機制來支持這一點。

  4. 跨語言支持:RPC 框架往往需要支持多種編程語言,因此選擇一種跨語言的序列化方案是必要的。Protocol Buffers、Apache Thrift、Avro 等都是很好的選擇,它們提供了多種語言的編解碼庫。

  5. 可擴展性:設計時應考慮到未來可能增加的數據結構和字段,序列化方案應易于擴展,支持動態字段、自定義類型等特性。

  6. 可配置性:允許用戶根據實際需求選擇或切換序列化策略。例如,對于對性能要求極高的場景,用戶可以選擇最高效的序列化方式;而對于調試或日志記錄,可能會偏好人類可讀性更好的格式。

  7. 異常處理:在序列化或反序列化過程中可能會遇到錯誤(如數據損壞、不兼容的版本等)。框架應能優雅地處理這些異常,并提供清晰的錯誤信息,幫助開發者診斷問題。

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

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

相關文章

springcloud第4季 springcloud-alibaba之openfegin+sentinel整合案例

一 介紹說明 1.1 說明 1.1.1 消費者8081 1.1.2 openfegin接口 1.1.3 提供者9091 9091微服務滿足: 1 openfegin 配置fallback邏輯,作為統一fallback服務降級處理。 2.sentinel訪問觸發了自定義的限流配置,在注解sentinelResource里面配置…

基于SpringBoot的學生綜合測評系統

你好呀,我是計算機學姐碼農小野!如果有相關需求,可以私信聯系我。 開發語言:Java 數據庫:MySQL 技術:SpringBoot框架 工具:MyEclipse、Tomcat 系統展示 首頁 系統首頁,提供綜合…

After Effects 2024 mac/win版:創意視效,夢想起航

After Effects 2024是一款引領視效革命的專業軟件,匯聚了創意與技術的精華。作為Adobe推出的全新版本,它以其強大的視頻處理和動畫創作能力,成為從事設計和視頻特技的機構,如電視臺、動畫制作公司、個人后期制作工作室以及多媒體工…

求職產品運營的個人簡歷案例(精選篇)

在求職產品運營的道路上,一份出色的個人簡歷是邁向成功的第一步,但是簡歷怎么寫才最好呢?下面是小編整理的求職產品運營的個人簡歷案例,同時,幻主簡歷網還提供精美簡歷模板下載和簡歷在線制作工具,歡迎大家…

Kivy tutorial 008: More kv language

Kivy tutorial 008: More kv language – Kivy Blog Central themes: Event binding and canvas instructions in kv language 中心主題: 事件綁定 和 kv語言里的畫布結構 This tutorial directly follows on from the previous, so start by retrieving the previous code, …

meizu M10 魅藍 10 mblu10 root 解鎖 安裝LSPosed框架 紫光展銳改串 AT命令 一鍵新機 改機軟件 硬改 改參數

meizu M10 魅藍 10 mblu10 root 解鎖 安裝LSPosed框架 紫光展銳改串 AT命令 一鍵新機 改機軟件 硬改 改參數 ro.system.build.version.release11 ro.system.build.version.release_or_codename11 ro.system.build.version.sdk30 ro.system.custom.versionAndroid_M01 ro.prod…

python目錄樹生成器

代碼如下: import os from colorama import Fore, Style, init from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, RIGHT, Y, END# 初始化 colorama init(autoresetTrue)def print_directory_tree(root_dir, text_widget, indent, lastTrue):"…

NISP國家信息安全水平考試

國家信息安全水平考試(NISP)是中國信息安全測評中心考試、發證,由國家網絡空間安全人才培養基地運營管理,并授權網安世紀科技有限公司為NISP證書管理中心。 中國信息安全測評中心開展國家信息安全水平考試(NISP)考試項目,是為普及信息安全/網…

Sklearn 深入教程

Sklearn 深入教程 Scikit-learn(sklearn)是Python中功能強大且廣泛使用的機器學習庫。本教程將深入探討sklearn中的高級主題,涵蓋高級數據預處理、高級特征工程、復雜模型調參、高級集成學習、模型持久化與部署等內容。 目錄 高級數據預處…

Python實例:faker生成數據集、文件

原文鏈接:http://www.juzicode.com/python-example-faker-create-data 本文的幾個例子用faker生成數據并用openpyxl生成表格,或者生成csv、xml、圖像文件。 A)生成個人數據 #juzicode.com/VX公眾號:juzicode from openpyxl import Workboo…

IOS Swift 從入門到精通:BlurEffect BlendMode stroke

文章目錄 UIBlurEffectBlendModestroke基本用法:描邊樣式:與strokeBorder的區別:組合使用:自定義形狀:UIBlurEffect 在Swift中,實現模糊效果通常是通過UIKit框架中的UIBlurEffect類來完成的,這通常被稱作毛玻璃效果。 **創建UIBlurEffect實例:**選擇一個模糊效果的樣…

探索AudioLM的音頻源識別能力:解鎖聲音的奧秘

🎵 探索AudioLM的音頻源識別能力:解鎖聲音的奧秘 🔍 在音頻處理領域,識別不同的音頻源是一項挑戰性任務,涉及到音頻信號處理、模式識別和機器學習等多個領域。AudioLM,作為一個假想的先進的音頻處理模型&a…

docker 安裝MySQL8以上

1.新建目錄 mkdir -p /usr/local/src/mysql80 2.安裝最新mysql # 拉取鏡像 docker pull mysql 3.運行鏡像創建容器,實現數據庫和日志的持久化等命令 docker run \ -p 3380:3306 \ --name mysql80 \ --privilegedtrue \ --restartalways \ -v /usr/local/src/my…

Spring Boot如何實現跨域資源共享(CORS)?

🍅 作者簡介:哪吒,CSDN2021博客之星亞軍🏆、新星計劃導師?、博客專家💪 🍅 哪吒多年工作總結:Java學習路線總結,搬磚工逆襲Java架構師 🍅 技術交流:定期更新…

1.k8s:架構,組件,基礎概念

目錄 一、k8s了解 1.什么是k8s 2.為什么要k8s (1)部署方式演變 (2)k8s作用 (3)Mesos,Swarm,K8S三大平臺對比 二、k8s架構、組件 1.k8s架構 2.k8s基礎組件 3.k8s附加組件 …

5種算法簡單介紹:貪心算法、分治法、回溯法、動態規劃法、最大流算法

1. 貪心算法(Greedy Algorithm) 定義: 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。貪心算法并不是對所有問題都能得到整體最優…

【STM32-存儲器映射】

STM32-存儲器映射 ■ STM32F1-4G地址空間分成8個塊■ STM32F1-Block0■ STM32F1-Block1■ STM32F1-Block2■ STM32F1- ■ STM32F1-4G地址空間分成8個塊 ■ STM32F1-Block0 有出廠 BootLoader 就可以使用串口下載程序。如Keil5圖中IROM地址是0x8000000 開始 就是flash地址 ■ S…

使用方法——注意事項及好處

public class MethodDemo01 {public static void main(String[] args) {// 目標:掌握定義方法的完整性,清楚使用方法的好處。// 需求:假如現在有很多程序員都要進行2個整數求和的操作。//1、李工。int rs sun(10,20);System.out.println(&q…

低代碼開發平臺賦能智慧警務管理:創新引領下的安全新篇章

隨著信息技術的飛速發展,智慧警務管理已經成為維護社會治安、保障人民安全的重要手段。在這一背景下,低代碼開發平臺以其高效、靈活、易用的特性,為智慧警務管理注入了新的活力。本文將探討低代碼開發平臺在智慧警務管理中的應用,…

vue-codemirror的簡單使用

功能 代碼編輯器 安裝 命令行&#xff1a;npm install codemirror vue-codemirror --save 單文件引入 import { Codemirror } from vue-codemirror 單文件展示 <codemirrorv-model"localCode"class"code-mirror":placeholder"placeholder&qu…