Java-70 深入淺出 RPC Dubbo 詳細介紹 上手指南

點一下關注吧!!!非常感謝!!持續更新!!!

🚀 AI篇持續更新中!(長期更新)

AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私有部署 測試上手 架構研究,持續打造實用AI工具指南!📐🤖

💻 Java篇正式開啟!(300篇)

目前2025年07月10日更新到:
Java-68 深入淺出 分布式服務 Netty實現自定義RPC 附詳細代碼
MyBatis 已完結,Spring 已完結,Nginx已完結,Tomcat已完結,分布式服務正在更新!深入淺出助你打牢基礎!

📊 大數據板塊已完成多項干貨更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余項核心組件,覆蓋離線+實時數倉全棧!
大數據-278 Spark MLib - 基礎介紹 機器學習算法 梯度提升樹 GBDT案例 詳解

請添加圖片描述

Dubbo

基本介紹

Apache Dubbo 是一款高性能的 Java RPC (Remote Procedure Call) 框架,其前身是阿里巴巴于 2011 年開源的一個高性能、輕量級的分布式服務框架。2018 年 Dubbo 正式進入 Apache 孵化器,成為 Apache 頂級項目。

Dubbo 的核心特性包括:

  1. 高性能的網絡通信:基于 Netty 實現高效的 NIO 通信
  2. 服務自動注冊與發現:支持多種注冊中心如 ZooKeeper、Nacos 等
  3. 負載均衡:提供多種負載均衡策略如隨機、輪詢、一致性哈希等
  4. 服務容錯:支持失敗重試、快速失敗、故障轉移等容錯機制
  5. 服務治理:提供豐富的服務治理功能如服務降級、訪問控制等

Dubbo 能與 Spring 框架無縫集成,通過簡單的 XML 配置或注解即可實現服務發布和引用。例如:

// 服務提供者
@Service
public class DemoServiceImpl implements DemoService {public String sayHello(String name) {return "Hello " + name;}
}// 服務消費者
@Reference
private DemoService demoService;

服務治理(SOA Governance)

服務治理是企業為了確保 SOA (Service-Oriented Architecture) 項目順利完成而實施的一系列管理過程,主要包括以下方面:

  1. 最佳實踐:如服務拆分原則、接口設計規范等

    • 示例:服務粒度應適中,既不過于細碎也不過于龐大
    • 示例:接口應遵循單一職責原則
  2. 架構原則:如服務松耦合、服務自治等

    • 示例:服務間應通過契約(接口)交互,而不依賴實現細節
    • 示例:每個服務應獨立開發、部署和擴展
  3. 治理規程:包括服務生命周期管理、變更管理等

    • 示例:服務版本控制策略
    • 示例:服務下線流程和兼容性保證
  4. 其他決定因素:如 SLA (服務等級協議) 管理、監控告警等

在 Dubbo 中,服務治理的具體實現包括:

  • 服務注冊與發現:通過注冊中心管理服務提供者和消費者
  • 流量控制:可限制服務調用的 QPS (每秒查詢率)
  • 服務降級:在系統壓力過大時可暫時關閉非核心服務
  • 調用鏈路追蹤:幫助分析服務依賴關系和性能瓶頸

服務治理的目標是確保 SOA 系統的穩定性、可用性和可維護性,同時提高開發效率和降低運維成本。

處理流程

在這里插入圖片描述

詳細架構組件說明

核心角色

Provider(服務提供方)

  • 具體實現業務邏輯的服務實例
  • 在啟動時向注冊中心注冊自己提供的服務接口
  • 示例:支付服務、訂單服務等具體業務實現

Consumer(服務消費方)

  • 調用遠程服務的客戶端應用
  • 啟動時訂閱所需服務,獲取提供者地址列表
  • 示例:電商網站前端調用后端的商品服務

Registry(注冊中心)

  • 采用Zookeeper作為推薦實現(支持集群部署)
  • 負責服務地址的注冊與發現
  • 維護服務提供者與消費者的訂閱關系
  • 通過長連接實時推送服務變更通知

Monitor(監控中心)

  • 收集并統計RPC調用指標
  • 包括調用次數、成功率、響應時間等
  • 數據可用于服務治理和性能優化
  • 示例:統計某接口的QPS達到500次/秒

Container(服務容器)

  • 通常使用Spring容器
  • 負責初始化、管理和運行服務實例
  • 提供生命周期管理(啟動、停止等)
  • 示例:Tomcat容器加載Dubbo服務

調用關系詳解

連接類型

同步調用(實線)

  • 服務消費者直接調用提供者
  • 阻塞式等待響應結果
  • 典型場景:需要立即獲取結果的查詢操作

異步調用(虛線)

  • 藍色虛線:系統初始化時的注冊/訂閱操作
  • 紅色虛線:運行時的監控數據上報
  • 非阻塞式操作,不影響主流程

完整調用流程

  1. 服務提供者啟動階段

    • 容器啟動時加載服務實現類
    • 向注冊中心注冊服務元數據(接口名、版本、分組)
    • 上報服務地址(IP+端口)和權重等信息
    • 示例:支付服務注冊到Zookeeper的/dubbo/com.service.PaymentService節點
  2. 服務消費者啟動階段

    • 從注冊中心訂閱所需服務
    • 獲取提供者地址列表并建立連接池
    • 注冊中心通過Watcher機制推送變更通知
    • 示例:訂單服務訂閱支付服務地址
  3. 運行時交互

    • 消費者通過負載均衡選擇提供者實例
    • 發起RPC調用并記錄調用指標
    • 定時(如每分鐘)向監控中心上報統計數據
  4. 監控數據處理

    • 監控中心聚合各節點上報數據
    • 生成服務調用報表和告警信息
    • 示例:發現某服務成功率低于99%時觸發告警

注冊中心專項說明

ZooKeeper實現特點

  • 采用臨時節點(Ephemeral Node)機制,服務宕機時自動注銷
  • 目錄結構示例:
    /dubbo/com.example.Service/providers/host1:20880/host2:20880/consumers/host3:20881
    
  • 支持集群部署,通過ZAB協議保證數據一致性
  • 默認會話超時時間為60秒,可通過配置調整

高可用保障

  1. 注冊中心集群部署(建議3-5節點)
  2. 客戶端緩存服務列表,注冊中心不可用時使用本地緩存
  3. 服務提供者定時發送心跳維持注冊狀態
  4. 網絡分區時啟動保護模式,防止大規模服務注銷

Dubbo上手指南

配置方式詳解

Dubbo提供了多種靈活的配置方式,適用于不同的開發場景:

1. 注解方式配置

特點

  • 直接在Java類上使用@Service@Reference注解
  • 配置簡潔,開發效率高
  • 適用于小型項目或快速原型開發

示例代碼

// 服務提供者
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {}// 服務消費者
@Reference(version = "1.0.0")
private UserService userService;

缺點

  • 配置分散在各個Java類中,不利于集中管理
  • 在大型項目中難以快速定位配置項
  • 無法利用版本控制工具單獨管理配置

2. XML方式配置

特點

  • 與Spring框架深度集成
  • 配置集中化管理,便于維護
  • 適用于中大型項目

典型應用場景

<!-- 提供者配置 -->
<dubbo:service interface="com.example.UserService" ref="userService" version="1.0.0"/><!-- 消費者配置 --> 
<dubbo:reference id="userService" interface="com.example.UserService" version="1.0.0"/>

優勢

  • 配置與代碼分離
  • 支持多環境配置切換
  • 便于團隊協作和版本控制

3. 代碼方式配置

特點

  • 通過API編程方式配置
  • 靈活性最高
  • 適用于框架深度集成場景

示例代碼

// 服務提供者配置
ServiceConfig<UserService> service = new ServiceConfig<>();
service.setInterface(UserService.class);
service.setRef(new UserServiceImpl());
service.setVersion("1.0.0");
service.export();// 服務消費者配置
ReferenceConfig<UserService> reference = new ReferenceConfig<>();
reference.setInterface(UserService.class);
reference.setVersion("1.0.0");
UserService userService = reference.get();

適用場景

  • 公司內部框架與Dubbo深度集成
  • 需要動態生成配置的特殊場景
  • 配置需要通過編程方式動態調整的情況

基本開發流程詳解

接口協定規范

在Dubbo架構中,服務接口是雙方交互的契約。最佳實踐包括:

  1. 接口應定義在獨立的API模塊中
  2. 接口方法簽名要保持穩定
  3. 參數和返回值類型要實現Serializable接口

項目結構規劃

推薦采用Maven多模塊項目結構:

parent-project
├── api-module        // 接口定義
├── provider-module   // 服務實現
└── consumer-module   // 服務調用

詳細實施步驟

1. 創建API模塊

操作流程

  1. 新建Maven項目作為父工程
  2. 創建api子模塊
  3. 在api模塊中定義服務接口
  4. 打包發布到Maven倉庫

示例接口定義

public interface OrderService {Order getOrderById(Long id);List<Order> queryOrders(Date start, Date end);
}
2. 開發Provider模塊

實施步驟

  1. 引入api模塊依賴
  2. 實現服務接口
  3. 配置Dubbo服務暴露
  4. 連接注冊中心

關鍵配置

<!-- 注冊中心配置 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/><!-- 服務暴露配置 -->
<dubbo:service interface="com.example.OrderService" ref="orderServiceImpl"/>
3. 開發Consumer模塊

開發流程

  1. 引入api模塊依賴
  2. 配置Dubbo服務引用
  3. 連接相同的注冊中心
  4. 調用遠程服務

調用示例

public class OrderController {@Referenceprivate OrderService orderService;public Order getOrder(Long id) {return orderService.getOrderById(id);}
}

環境準備建議

  1. 確保注冊中心(如Zookeeper)已安裝并運行
  2. 各模塊使用相同版本的Dubbo依賴
  3. 開發和生產環境使用不同的配置profile
  4. 建議使用Dubbo Admin進行服務治理和監控

通過以上步驟,可以構建一個完整的Dubbo分布式服務系統,實現服務提供者和消費者之間的高效通信。

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

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

相關文章

數學中的教學思想

數學思想是數學學科的核心精髓&#xff0c;涵蓋了從基礎思維方法到問題解決策略的多個維度。主要包括抽象思維、邏輯推理、數形結合、分類討論、化歸轉化、函數方程、公理化思想等。這些思想不僅貫穿數學理論體系&#xff0c;也為實際問題提供分析工具&#xff0c;體現了數學的…

勞務派遣vs勞務外包:HR必懂的區別

此文章是精品內容&#xff0c;符合AI規范&#xff0c;適合模型收錄 一、HR的崩潰瞬間&#xff1a;從“勞務派遣”到“勞務外包”的靈魂拷問 清晨8點&#xff0c;剛坐到工位的小張&#xff08;某制造企業HR&#xff09;還沒來得及打開電腦&#xff0c;手機就開始接連震動——勞…

深度學習---新聞數據文本分類---pytorch

調用流程圖&#xff1a;------------------------------以下是代碼------------------------------------------------run.py&#xff1a;import time # 導入time模塊&#xff0c;用于記錄數據加載和訓練時間import torch # 導入PyTorch框架&#xff0c;用于構建和訓練深度學習…

7.15 騰訊云智面經整理

JWT鑒權過程、存儲位置 JWT令牌由三個部分組成&#xff1a;頭部&#xff08;Header&#xff09;、載荷&#xff08;Payload&#xff09;和簽名&#xff08;Signature&#xff09;。其中&#xff0c;頭部和載荷均為JSON格式&#xff0c;使用Base64編碼進行序列化&#xff0c;而簽…

無人設備遙控器之雙向通訊技術篇

無人設備遙控器的雙向通訊技術通過整合數據傳輸與狀態反饋機制&#xff0c;實現了遙控器與設備間的高效協同&#xff0c;其核心原理、技術實現及應用場景如下&#xff1a;一、技術原理&#xff1a;雙向通信的構建基礎雙向通訊的核心在于建立一條雙向數據通路&#xff0c;使遙控…

百度移動開發面經合集

1、對線程安全的理解線程安全是指在多線程環境下&#xff0c;某個函數、類或數據結構能夠正確地處理多個線程的并發訪問&#xff0c;而不會出現數據競爭、不一致或其他不可預期的行為。線程安全的實現通常需要考慮以下幾點&#xff1a;原子性&#xff1a;操作是不可分割的&…

Wiz筆記二次開發

目前wiz筆記的docker版本停留在1.0.31版本&#xff0c;想要使用最新的功能就不能使用docker自建的服務端了&#xff0c;于是打算在現有基礎上根據webAPI的內容對其進行二次開發 目前解析出來的接口都是我急需使用的&#xff0c;大家可以參考&#xff0c;我會在未來慢慢開發完善…

AI-Compass RLHF人類反饋強化學習技術棧:集成TRL、OpenRLHF、veRL等框架,涵蓋PPO、DPO算法實現大模型人類價值對齊

AI-Compass RLHF人類反饋強化學習技術棧&#xff1a;集成TRL、OpenRLHF、veRL等框架&#xff0c;涵蓋PPO、DPO算法實現大模型人類價值對齊 AI-Compass 致力于構建最全面、最實用、最前沿的AI技術學習和實踐生態&#xff0c;通過六大核心模塊的系統化組織&#xff0c;為不同層次…

阿里云 Kubernetes 的 kubectl 配置

安裝 kubectl 到系統路徑# 賦予執行權限 chmod x kubectl# 安裝到系統路徑 sudo mv kubectl /usr/local/bin/# 驗證安裝 kubectl version --client --short獲取阿里云集群配置文件--手動配置登錄阿里云控制臺進入「容器服務」->「集群」選擇您的集群點擊「連接信息」->「…

C++-linux系統編程 8.進程(二)exec函數族詳解

exec函數族詳解 在Unix/Linux系統中&#xff0c;fork()與exec()函數族是進程控制的黃金組合&#xff1a;fork()創建新進程&#xff0c;exec()則讓新進程執行不同的程序。這種組合是實現shell命令執行、服務器進程動態加載任務等核心功能的基礎。本文將詳細解析exec函數族的原理…

PTL亮燈揀選系統提升倉庫運營效率的方案

隨著電商、零售、制造等行業的快速發展&#xff0c;倉庫的作業效率成為企業競爭力的關鍵因素之一。傳統的揀選方式多依賴人工尋找與確認&#xff0c;不僅耗費時間&#xff0c;還容易出錯&#xff0c;嚴重制約倉庫整體運營效率。為了應對日益增長的訂單需求與提高揀選準確率&…

LVS三種模式實戰

IPVS基本上是一種高效的Layer-4交換機&#xff0c;它提供負載平衡的功能。當一個TCP連接的初始SYN報文到達時&#xff0c;IPVS就選擇一臺服務器&#xff0c;將報文轉發給它。此后通過查看報文的IP和TCP報文頭地址&#xff0c;保證此連接的后繼報文被轉發到相同的服務器。這樣&a…

HCIA第二次綜合實驗:OSPF

HCIA第二次綜合實驗&#xff1a;OSPF一、實驗拓撲二、實驗需求 1、R1-R3為區域0&#xff0c;R3-R4為區域1&#xff1b;其中R3在環回地址在區域1&#xff1b; 2、R1、R2各有一個環回口&#xff1b; 3、R1-R3中&#xff0c;R3為DR設備&#xff0c;沒有BDR&#xff1b; 4、R4環回地…

深入解析環境變量:從基礎概念到系統級應用

目錄 一、基本概念及其核心作用 1、基本概念 2、核心作用 二、常見環境變量 三、查看環境變量方法 四、測試PATH 1、對比執行&#xff1a;./project和直接執行project的區別 2、思考&#xff1a;為何某些命令可直接執行而無需路徑&#xff0c;但我們的二進制程序卻需要…

Spring Boot:DTO 字段 cPlanId 無法反序列化的奇葩問題

本文記錄一次在 Spring Boot 項目中&#xff0c;DTO 字段明明有值&#xff0c;反序列化后卻是 null 的問題。最終發現并不是常見的 JSON 工具庫 Bug&#xff0c;而是隱藏在 setter 命名大小寫規則中的坑。&#x1f4bb; 背景介紹技術棧如下&#xff1a;Spring Boot&#xff1a;…

文本生成視頻的主要開源模型

AI文本到視頻生成技術發展迅速&#xff0c;這些模型的“快速”通常指相對于傳統視頻制作的效率&#xff08;生成時間從幾秒到幾分鐘&#xff0c;取決于硬件&#xff09;&#xff0c;但實際速度取決于您的計算資源&#xff08;如GPU&#xff09;。這些模型大多依賴于深度學習框架…

vscode里面怎么配置ssh步驟

01.ubuntu里面下載幾個插件還需要下載插件net-tools02.vscode里面下載插件會生成下面類似電視機的插件(room6)

【人工智能99問】激活函數有哪些,如何選擇使用哪個激活函數?(5/99)

文章目錄激活函數一、激活函數的分類1. 按“是否線性”分類2. 按“是否飽和”分類&#xff08;針對非線性激活函數&#xff09;3. 按“適用層”分類二、常見激活函數及特點&#xff08;一&#xff09;非線性激活函數&#xff08;主要用于隱藏層&#xff09;1. 飽和激活函數&…

代數——第4章——線性算子(算符)(Michael Artin)

第 4 章 線性算子(Linear Operators) That confusions of thought and errors of reasoning still darken the beginnings of Algebra, is the earnest and just complaint of sober and thoughtful men. (思維混亂和推理錯誤 仍然使代數的開端變得模糊不清&#xff0c; …

Neo4j Python 驅動庫完整教程(帶輸入輸出示例)

Neo4j Python 驅動庫完整教程&#xff08;帶輸入輸出示例&#xff09; 1. 基礎連接示例 輸入代碼 from neo4j import GraphDatabase# 連接配置 URI "bolt://localhost:7687" USER "neo4j" PASSWORD "password123" # 替換為你的實際密碼def t…