SpringBoot+Dubbo+Zookeeper實現分布式系統步驟

SpringBoot+Dubbo+Zookeeper實現分布式系統

    • 一、分布式系統通俗解釋
    • 二、環境準備(詳細版)
      • 1. 軟件版本
      • 2. 安裝Zookeeper(單機模式)
    • 三、完整項目結構(帶詳細注釋)
    • 四、手把手代碼實現
      • 步驟1:創建父工程(管理依賴)
      • 步驟2:API模塊(定義服務契約)
      • 步驟3:服務提供者(實現具體邏輯)
      • 步驟4:服務消費者(調用遠程服務)
      • 步驟5:啟動類配置
    • 五、運行流程詳解
      • 1. 啟動順序
      • 2. 驗證步驟
      • 3. 查看服務注冊情況
    • 六、核心機制詳解
      • 1. 服務注冊過程
      • 2. 服務發現過程
      • 3. 通信協議
    • 七、常見問題解決方案
      • 1. 服務無法注冊
      • 2. 調用超時
      • 3. 接口包路徑不一致
    • 八、擴展實踐建議


一、分布式系統通俗解釋

場景比喻:想象一個大型超市(分布式系統):

  • 收銀臺(服務消費者):處理顧客請求
  • 倉庫(服務提供者):提供商品
  • 總控室(Zookeeper):記錄哪個倉庫有什么商品
  • 物流系統(Dubbo):負責收銀臺和倉庫之間的通信

當顧客要買可樂時:

  1. 收銀臺詢問總控室:哪里能拿到可樂?
  2. 總控室返回倉庫A的地址
  3. 收銀臺通過物流系統向倉庫A請求可樂
  4. 倉庫A將可樂送到收銀臺

二、環境準備(詳細版)

1. 軟件版本

  • JDK 8
  • Maven 3.6.3
  • Zookeeper 3.7.0 (下載地址)

2. 安裝Zookeeper(單機模式)

# 解壓后進入conf目錄
cp zoo_sample.cfg zoo.cfg
# 修改配置(關鍵部分)
dataDir=/tmp/zookeeper
clientPort=2181# 啟動服務(Linux/Mac)
bin/zkServer.sh start
# Windows雙擊zkServer.cmd

三、完整項目結構(帶詳細注釋)

distributed-demo
├── api           # 服務接口定義
├── provider      # 服務提供者
└── consumer      # 服務消費者

四、手把手代碼實現

步驟1:創建父工程(管理依賴)

<!-- pom.xml -->
<project><groupId>com.example</groupId><artifactId>distributed-demo</artifactId><version>1.0</version><packaging>pom</packaging><modules><module>api</module><module>provider</module><module>consumer</module></modules><properties><dubbo.version>2.7.15</dubbo.version><zk.version>3.7.0</zk.version></properties><dependencies><!-- Dubbo核心 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><!-- Zookeeper客戶端 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.1.0</version></dependency></dependencies>
</project>

步驟2:API模塊(定義服務契約)

// api/src/main/java/com/example/api/CalculatorService.java
public interface CalculatorService {/*** 加法服務* @param a 加數* @param b 被加數* @return 和*/int add(int a, int b);
}

步驟3:服務提供者(實現具體邏輯)

// provider/src/main/java/com/example/provider/CalculatorServiceImpl.java
@DubboService // 關鍵注解:聲明這是Dubbo服務
public class CalculatorServiceImpl implements CalculatorService {@Overridepublic int add(int a, int b) {System.out.println("收到請求:" + a + "+" + b);return a + b;}
}// provider/src/main/resources/application.properties
# 應用配置
spring.application.name=calculator-provider
server.port=8081# Dubbo配置
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.scan.base-packages=com.example.provider

步驟4:服務消費者(調用遠程服務)

// consumer/src/main/java/com/example/consumer/CalculatorController.java
@RestController
public class CalculatorController {@DubboReference // 關鍵注解:引用遠程服務private CalculatorService calculatorService;@GetMapping("/add")public String add(@RequestParam int a, @RequestParam int b) {return a + " + " + b + " = " + calculatorService.add(a, b);}
}// consumer/src/main/resources/application.properties
spring.application.name=calculator-consumer
server.port=8080dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.consumer.timeout=3000

步驟5:啟動類配置

// Provider啟動類
@SpringBootApplication
@EnableDubbo // 啟用Dubbo功能
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);System.out.println("Provider啟動成功!");}
}// Consumer啟動類
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);System.out.println("Consumer啟動成功!");}
}

五、運行流程詳解

1. 啟動順序

Zookeeper Provider Consumer 2181端口監聽 注冊服務信息 查詢服務地址 返回Provider地址 發起RPC調用 返回計算結果 Zookeeper Provider Consumer

2. 驗證步驟

  1. 啟動Zookeeper
  2. 啟動Provider(控制臺看到Provider啟動成功!
  3. 啟動Consumer
  4. 訪問測試接口:
    http://localhost:8080/add?a=5&b=3
    
    應返回:5 + 3 = 8

3. 查看服務注冊情況

使用Zookeeper客戶端工具(推薦PrettyZoo)連接localhost:2181,查看節點:

/dubbo/com.example.api.CalculatorService/providers

六、核心機制詳解

1. 服務注冊過程

  1. Provider啟動時向Zookeeper注冊自己的地址
  2. 注冊信息包括:IP、端口、接口名稱、版本等
  3. Zookeeper以臨時節點存儲這些信息

2. 服務發現過程

  1. Consumer啟動時訂閱所需服務
  2. Zookeeper推送Provider地址列表
  3. Dubbo根據負載均衡策略選擇Provider

3. 通信協議

  • 默認使用Dubbo協議(TCP長連接)
  • 數據序列化:Hessian2二進制格式

七、常見問題解決方案

1. 服務無法注冊

  • 檢查Zookeeper是否運行:telnet 127.0.0.1 2181
  • 查看Provider日志是否有注冊異常
  • 確認Dubbo版本與Zookeeper版本兼容

2. 調用超時

# 在consumer的配置中添加
dubbo.consumer.timeout=5000 # 單位毫秒

3. 接口包路徑不一致

必須保證接口的 全限定名 在Provider和Consumer中完全一致!


八、擴展實踐建議

  1. 多Provider測試:啟動兩個Provider實例,觀察負載均衡
  2. 服務治理:集成Dubbo Admin控制臺
  3. 容錯機制:添加@DubboReference(cluster = "failover")

在這里插入圖片描述

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

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

相關文章

Spring的業務層,持久層,控制層的關系

在 Spring 框架中&#xff0c;控制層&#xff08;Controller&#xff09;、業務層&#xff08;Service&#xff09; 和 持久層&#xff08;Repository/Mapper&#xff09; 是分層架構的核心組成部分&#xff0c;職責分離明確&#xff0c;通過依賴注入&#xff08;DI&#xff09…

css實現不確定內容的高度過渡

實現效果&#xff1a;鼠標懸浮按鈕&#xff0c;高度過渡出現如圖所示文本框 代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

計算機視覺與深度學習 | matlab實現ARIMA-WOA-CNN-LSTM時間序列預測(完整源碼和數據)

以下是一個基于MATLAB的ARIMA-WOA-CNN-LSTM時間序列預測框架。由于完整代碼較長,此處提供核心模塊和實現思路,完整源碼和數據可通過文末方式獲取。 1. 數據準備(示例數據) 使用MATLAB內置的航空乘客數據集: % 加載數據 data = readtable(airline-passengers.csv); data …

在 Excel 中使用東方仙盟軟件————仙盟創夢IDE

安裝插件 用仙盟創夢編寫插件代碼 源碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 東方仙盟.仙盟創夢IDE_招標系統 {public static class 仙盟創夢_招標專…

Sql刷題日志(day9)

一、筆試 1、limit offset&#xff1a;分頁查詢 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳過前 start_row 行&#xff0c;返回接下來的 number_of_rows 行。 2、lag、lead&#xff1a;查詢前后行數據 --lag函數用于訪問當…

C++面試3——const關鍵字的核心概念、典型場景和易錯陷阱

const關鍵字的核心概念、典型場景和易錯陷阱 一、const本質&#xff1a;類型系統的守護者 1. 與#define的本質差異 維度#defineconst編譯階段預處理替換編譯器類型檢查作用域無作用域&#xff08;全局污染&#xff09;遵循塊作用域調試可見性符號消失保留符號信息類型安全無類…

16-看門狗和RTC

一、獨立看門狗 1、獨立看門狗概述 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff08;不按照正常程序進行運行&#xff0c;如程序重啟&#xff0c;但是如果我們填加看門狗的技術&#xff0…

w~自動駕駛~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法來啦&#xff01; 在自動駕駛系統當中&#xff0c;感知任務是整個自駕系統中至關重要的組成部分。感知任務的主要目標是使自動駕駛車輛能夠理解和感知周圍的環境元素&…

怎么打包發布到npm?——從零到一的詳細指南

怎么打包發布到npm&#xff1f;——從零到一的詳細指南 目錄 怎么打包發布到npm&#xff1f;——從零到一的詳細指南一、準備工作1. 注冊 npm 賬號2. 安裝 Node.js 和 npm 二、初始化項目三、編寫你的代碼四、配置 package.json五、打包你的項目六、登錄 npm七、發布到 npm八、…

【C++ - 仿mudou庫one thread one loop式高并發服務器實現】

文章目錄 項目介紹項目模塊和服務器主要設計模式項目主要流程前置知識1.bind函數2.定時器任務TimerTask和時間輪思想TimerWheel3.正則表達式4.通用型容器Any類 服務器設計模式1&#xff09;單Reactor單線程模式2&#xff09;單Reactor多線程模式3&#xff09;多Reactor多線程模…

RISC-V 開發板 MUSE Pi Pro USB 測試(3.0 U盤,2.0 UVC攝像頭)

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro USB 測試&#xff08;3.0 U盤&#xff0c;2.0 UVC攝像頭&#xff09; 總共開發板有4個USB的A口&#xff0c;1個USB的TypeC口&#xff0c;我們插上兩個USB3.0的U盤和一個USB2.0的UVC攝像頭來進行測試 lsusb -tv 可以看到有3個US…

docker學習與使用(概念、鏡像、容器、數據卷、dockerfile等)

文章目錄 前言引入docker 簡介docker的應用場景docker的虛擬化技術VS虛擬機docker的優點docker架構Docker倉庫Docker鏡像linux操作系統的大致組成部分 Docker容器 docker安裝與啟動校驗版本移除舊的版本安裝依賴工具設置軟件源安裝docker驗證 配置鏡像加速器docker服務相關命令…

記錄一次服務器卡頓

一、服務器卡頓現象 服務用了一段時間后&#xff0c;突然很卡&#xff0c;發現在服務器上新建excel也很卡&#xff0c;發現服務器中病毒了&#xff0c;然后重新安裝了操作系統。重新安裝服務環境時&#xff0c;發現同時安裝pdf、tomcat時都很慢&#xff0c;只能一個安裝好了&am…

基于 Reactor 的 Java 高性能異步編程:響應式流與背壓詳解

本文將圍繞 Reactor 框架&#xff0c;深入剖析響應式流的核心機制&#xff0c;重點講解背壓&#xff08;Backpressure&#xff09;的實現原理與實際應用。通過理論結合實踐&#xff0c;希望幫助你真正掌握 Java 世界的響應式異步編程。 一、響應式編程與 Reactor 簡介 1.1 什么…

知識蒸餾實戰:用PyTorch和預訓練模型提升小模型性能

在深度學習的浪潮中&#xff0c;我們常常追求更大、更深、更復雜的模型以達到最先進的性能。然而&#xff0c;這些“龐然大物”般的模型往往伴隨著高昂的計算成本和緩慢的推理速度&#xff0c;使得它們難以部署在資源受限的環境中&#xff0c;如移動設備或邊緣計算平臺。知識蒸…

python:mysql全局大覽(保姆級教程)

本文目錄&#xff1a; 一、關于數據庫**二、sql語言分類**三、數據庫增刪改查操作**四、庫中表增刪改查操作**五、表中記錄插入**六、表約束**七、單表查詢**八、多表查詢**&#xff08;一&#xff09;外鍵約束**&#xff08;二&#xff09;連結查詢**1.交叉連接&#xff08;笛…

Android framework 問題記錄

一、休眠喚醒&#xff0c;很快熄屏 1.1 問題描述 機器休眠喚醒后&#xff0c;沒有按照約定的熄屏timeout 進行熄屏&#xff0c;很快就熄屏&#xff08;約2s~3s左右&#xff09; 1.2 原因分析&#xff1a; 抓取相關log&#xff0c;打印休眠背光 相關調用棧 //具體打印調用棧…

怎么利用JS根據坐標判斷構成單個多邊形是否合法

怎么利用JS根據坐標判斷構成單個多邊形是否合法 引言 在GIS(地理信息系統)、游戲開發、計算機圖形學等領域,判斷一組坐標點能否構成合法的簡單多邊形(Simple Polygon)是一個常見需求。合法多邊形需要滿足幾何學上的基本規則,本文將詳細介紹如何使用JavaScript實現這一判…

sqlite的拼接字段的方法(sqlite沒有convert函數)

我在sqlserver 操作方式&#xff1a; /// <summary>///獲取當前門店工資列表/// </summary>/// <param name"wheres">其他條件</param>/// <param name"ThisMendian">當前門店</param>/// <param name"IsNotU…

構建高效移動端網頁調試流程:以 WebDebugX 為核心的工具、技巧與實戰經驗

現代前端開發早已不僅僅局限于桌面瀏覽器。隨著 Hybrid 應用、小程序、移動 Web 的廣泛應用&#xff0c;開發者日常面臨的一個關鍵挑戰是&#xff1a;如何在移動設備上快速定位并解決問題&#xff1f; 這不再是“打開 DevTools 查查 Console”的問題&#xff0c;而是一個關于設…