Dubbo + Spring Boot + Zookeeper 快速搭建分布式服務

Dubbo + Spring Boot + Zookeeper 快速搭建分布式服務

本文將詳細介紹如何基于 Dubbo、Spring Boot 和 Zookeeper 快速搭建一個簡單的分布式服務調用場景,包含服務提供者(Provider)、服務消費者(Consumer)及公共接口(API)的創建與配置,幫助開發者快速上手分布式服務開發。

1. 環境準備與項目結構設計

1.1 核心組件版本說明

  • Spring Boot:2.7.15(穩定版本,兼容性較好)
  • Dubbo:3.1.0(支持 Spring Boot 自動配置,簡化開發)
  • Zookeeper:3.4.6(作為服務注冊中心,需提前在本地安裝并啟動)

1.2 啟動本地 Zookeeper

Zookeeper 是 Dubbo 默認的服務注冊中心,需先確保本地 Zookeeper 正常運行:

  1. 下載 Zookeeper 并解壓,進入 bin 目錄

  2. 執行zkServer.cmd(Windows)啟動服務

  3. 啟動成功后,控制臺會顯示類似如下信息:
    在這里插入圖片描述

1.3 創建父項目與子模塊

使用 IDEA 或 Eclipse 創建一個 Spring Boot 父項目,然后在父項目下新建 3 個子模塊,分別對應:

  • api:存放公共接口(服務契約),供 Provider 和 Consumer 依賴
  • provider:服務提供者,實現 api 模塊的接口并暴露服務
  • consumer:服務消費者,調用 Provider 暴露的服務

項目結構如圖所示:
在這里插入圖片描述

2. 核心依賴配置

2.1 父項目依賴管理

在父項目的 pom.xml 添加依賴,供consumer和provider模塊使用

 <groupId>com.example</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>consumer</module><module>provider</module><module>dubbo-api</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.15</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.1.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-zookeeper --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-zookeeper</artifactId><version>3.1.0</version></dependency></dependencies>

2.2 Provider 與 Consumer 依賴

providerconsumer 模塊的 pom.xml 中添加api模塊的依賴

    <dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

3. 服務配置與啟動

3.1 Provider 配置(服務提供者)

provider/src/main/resources/application.yml 中配置服務端口、Dubbo 應用名及注冊中心地址:

server:port: 8081  # Provider 端口,避免與 Consumer 沖突dubbo:application:name: dubbo-demo-provider  # 應用名稱,唯一標識registry:address: zookeeper://127.0.0.1:2181  # Zookeeper 注冊中心地址

3.2 Consumer 配置(服務消費者)

consumer/src/main/resources/application.yml 中配置:

server:port: 8080  # Consumer 端口,與 Provider 區分dubbo:application:name: dubbo-demo-consumer  # 應用名稱,唯一標識registry:address: zookeeper://127.0.0.1:2181  # 同 Provider 的注冊中心地址

3.3 啟動類配置

  • Provider 啟動類:添加 @EnableDubbo 注解,開啟 Dubbo 自動配置并掃描服務實現類

    @SpringBootApplication
    @EnableDubbo  // 關鍵注解:啟用 Dubbo 服務注冊與發現
    public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
    }
    
  • Consumer 啟動類:無需額外注解,直接啟動即可

    @SpringBootApplication
    public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
    }
    

分別啟動 Provider 和 Consumer 后,控制臺顯示啟動成功:
在這里插入圖片描述

4. 服務接口定義與實現

4.1 公共 API 接口(api 模塊)

api 模塊中定義服務接口(服務契約),作為 Provider 和 Consumer 的通信標準:

package com.example.api.service;/*** 公共服務接口*/
public interface HelloService {// 定義一個簡單的遠程調用方法String sayHello(String name);
}

4.2 Provider 實現服務接口

provider 模塊中創建接口實現類,并通過 @DubboService 注解標記為 Dubbo 服務:

package com.example.provider.service.impl;import com.example.api.service.HelloService;
import org.apache.dubbo.config.annotation.DubboService;/*** 服務實現類:需實現 api 模塊的接口*/
@DubboService  // 關鍵注解:聲明為 Dubbo 服務提供者
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello:" + name + ",我是 Dubbo 服務提供者!";}
}

4.3 Consumer 調用遠程服務

consumer 模塊中創建控制器,通過 @DubboReference 注解注入遠程服務接口并調用:

package com.example.consumer.controller;import com.example.api.service.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 消費者控制器:測試遠程服務調用*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {// 關鍵注解:引用遠程 Dubbo 服務@DubboReferenceprivate HelloService helloService;// 提供 HTTP 接口,用于測試遠程調用@GetMapping("/testHello")public String testHello() {// 調用遠程服務方法return helloService.sayHello("Dubbo 消費者");}
}

5. 驗證服務調用

5.1 檢查服務注冊狀態

通過 Zookeeper 客戶端驗證服務是否注冊成功:

  1. 進入 Zookeeper 的 bin 目錄,雙擊 zkCli.cmd 啟動客戶端

  2. 執行命令

    ls /services
    

    查看注冊的服務,可看到

    ls /services/dubbo-demo-provider
    

    已注冊:
    在這里插入圖片描述

5.2 測試遠程調用

啟動 Provider 和 Consumer 后,通過瀏覽器或 Postman 訪問 Consumer 的測試接口:

  • 請求地址:http://localhost:8080/consumer/testHello
  • 成功響應結果:Hello:Dubbo 消費者,我是 Dubbo 服務提供者!

調用成功界面如下:
在這里插入圖片描述

6. 常見問題與解決方案

  1. 服務注冊失敗
    • 檢查 Zookeeper 是否啟動,地址是否正確(默認端口 2181)
    • Provider 啟動類是否添加 @EnableDubbo 注解,確保服務被掃描
  2. 消費者找不到服務
    • 檢查 Provider 和 Consumer 的 application.ymldubbo.registry.address 是否一致
    • 確認 API 接口的包路徑在 Provider 和 Consumer 中完全相同(Dubbo 基于接口全類名匹配服務)
  3. 依賴沖突
    • 統一管理 Dubbo 和 Spring Boot 版本,避免不同模塊依賴版本不一致

總結

通過本文的步驟,我們快速搭建了一個基于 Dubbo + Spring Boot + Zookeeper 的分布式服務調用場景,核心流程包括:

  1. 搭建 Zookeeper 注冊中心
  2. 創建 Provider、Consumer 和 API 模塊并配置依賴
  3. 定義服務接口并實現,通過注解暴露和引用服務
  4. 驗證遠程服務調用

Dubbo 作為高性能的 RPC 框架,結合 Spring Boot 的自動配置和 Zookeeper 的服務治理能力,可大幅簡化分布式服務的開發與維護,適合中小型分布式系統快速落地。

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

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

相關文章

五分鐘掌握 TDengine 數據文件的工作原理

小 T 導讀&#xff1a;今天我們來探討一下——TDengine中的時序數據到底是如何存儲的&#xff1f; 在上一期的文章《五分鐘掌握 TDengine 時序數據的保留策略》中&#xff0c;我們知道了TDengine是如何按照時間段對數據進行分區來管理數據的。 接下來&#xff0c;我們和大家一起…

Python爬蟲實戰:研究http-parser庫相關技術

一、研究背景與意義 在當今數字化時代,網絡數據蘊含著巨大的價值。從商業決策、學術研究到社會治理,對海量網絡信息的有效采集與分析至關重要。網絡爬蟲作為數據獲取的核心工具,其性能與穩定性直接影響數據質量。然而,隨著互聯網技術的發展,網站反爬機制不斷升級,傳統爬…

Go語言實戰案例-批量重命名文件

在《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例17&#xff1a;批量重命名文件 的完整內容&#xff0c;適合初學者實踐如何使用 Go 操作文件系統并批量處理文件名。&#x1f3af; 案例目標實現一個小工具&#xff0c;能夠批量重命名指定目錄下的所有文件&#xff0c;例如…

基于單片機非接觸紅外測溫系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的非接觸式紅外測溫系統&#xff0c;適用于快速、安全測量物體表面溫…

Python 入門手札:從 0 到會--第十天Python常用的第三方庫Numpy,Pandas,Matplotlib

目錄 一、Numpy 1.NumPy 是什么&#xff1f; 1.1安裝numpy 1.2 導入numpy模塊 2.NumPy 的核心&#xff1a;ndarray 2.1 什么是 ndarray&#xff1f; 2.2 ndarray 的創建方式 2.3 常見屬性&#xff08;用于查看數組結構&#xff09; 2.4 ndarray 的切片與索引 2.5 ndarr…

mysql 性能優化之Explain講解

EXPLAIN是 MySQL 中用于分析查詢執行計劃的重要工具&#xff0c;通過它可以查看查詢如何使用索引、掃描數據的方式以及表連接順序等信息&#xff0c;從而找出性能瓶頸。以下是關于EXPLAIN的詳細介紹和實戰指南&#xff1a;1. EXPLAIN 基本用法在SELECT、INSERT、UPDATE、DELETE…

Redis 連接:深度解析與最佳實踐

Redis 連接:深度解析與最佳實踐 引言 Redis 作為一款高性能的內存數據結構存儲系統,在當今的互聯網應用中扮演著越來越重要的角色。高效的 Redis 連接管理對于保證系統的穩定性和性能至關重要。本文將深入探討 Redis 連接的原理、配置以及最佳實踐,幫助讀者更好地理解和應…

C語言---VSCODE的C語言環境搭建

文章目錄資源下載配置環境驗證資源下載 站內下載 配置環境 解壓壓縮包&#xff0c;復制以下文件的路徑 打開主頁搜索系統環境變量 點擊環境變量 選擇系統變量中的Path&#xff0c;點擊編輯 在最后面添加路徑。 添加完成記得關機重啟。 驗證 重啟電腦之后打開在Power…

ojdbc對應jdk版本附下載地址(截止20250722)

可以從Oracle官網查看&#xff0c; JDBC and UCP Downloads page

Redis為什么被設計成是單線程的?

Redis單線程模型解析 當我們說Redis是單線程時,特指"其網絡IO和鍵值對讀寫操作由單個線程完成"。實際上,Redis僅網絡請求模塊和數據操作模塊采用單線程設計,而持久化存儲、集群支持等其他模塊都采用了多線程架構。 事實上,Redis從4.0版本就開始對部分命令實現了…

基礎流程圖

一、常用符號及定義二、 畫圖基礎規則1、從上至下&#xff0c;從左至右流向順序。2、開始符號只能有一個出口。3、進程符號不做校驗邏輯。4、相同流程圖&#xff0c;符號大小應為一致。5、引用流程&#xff0c;不重復繪制。6、路徑符號盡量避免交叉重疊。7、同一路徑&#xff0…

C# 結構體

目錄 1.如何定義一個結構體&#xff08;struct 關鍵字&#xff09; 2.如何使用一個結構體 3.如何修改一個數據 4.如何讓去訪問一個學生的信息 5、結構體數組 練習 1.如何定義一個結構體&#xff08;struct 關鍵字&#xff09; C#中public 、private、protect的區別 結構…

在Python中操作Word

生成請假條1.準備一個文件“template.docx”&#xff0c;內容如下。2.安裝docxtpl庫。pip install docxtpl3.執行代碼&#xff0c;替換字典內容。from docxtpl import DocxTemplate# 讀取定義模板文件 tpl DocxTemplate(template.docx) # 創建子文檔 sd tpl.new_subdoc() # 添…

網絡協議(四)網絡層 路由協議

在網絡層及網絡層之上使用IP地址&#xff0c;IP地址放在IP數據報的首部&#xff0c;而MAC地址放在MAC幀的首部。通過數據封裝&#xff0c;把IP數據報分組封裝為MAC幀。 由于路由器的隔離&#xff0c;IP網絡中無法通過廣播MAC地址來完成跨網絡的尋址&#xff0c;因此在網絡層中只…

(后者可以節約內存/GPU顯存)Pytorch中求逆torch.inverse和解線性方程組torch.linalg.solve有什么關系

假設我們要求A的逆矩陣&#xff0c;正常情況下我們使用如下命令&#xff1a; torch.inverse(A)但是本人發現&#xff0c;這個函數還挺消耗顯存的。想到求逆矩陣和求線性方程組有很大關系。從而可以使用torch.linalg.solve來求解逆矩陣&#xff0c;關鍵是其顯存消耗小。 求解逆矩…

esp32 idf 使用http訪問json直接拼接content_length = -1

CMakeLists.txt添加網絡請求庫 REQUIRES esp_http_client效果圖D (14235) HTTP_CLIENT: content_length -1 需要直接拼接content_length才能打印#include <stdio.h> #include <string.h> #include "esp_log.h" #include "esp_system.h" #inc…

[Github】下載使用github上的源代碼

一、安裝Anoconda 二、安裝 Git &#xff08;1&#xff09;安裝 方法 1&#xff1a;通過 Git 官網安裝? 下載 Git for Windows&#xff1a;https://git-scm.com/download/win運行安裝程序&#xff0c;??確保勾選 "Add Git to PATH"??&#xff08;重要&#…

Java 邂逅 WebSocket:解鎖實時通信的無限可能?

在當今的互聯網時代&#xff0c;實時通信已經成為許多應用不可或缺的功能。從在線聊天工具到實時游戲互動&#xff0c;從股票行情推送再到物聯網數據傳輸&#xff0c;都對實時性有著極高的要求。而在 Java 技術棧中&#xff0c;WebSocket 技術的出現&#xff0c;為開發者打開了…

MySQL 核心知識點梳理(5)

目錄 事務 MySQL事務的四大特性 ACID 原子性 持久性 隔離性 事務的隔離級別 讀未提交 讀已提交 可重復讀 串行化 事務的隔離級別如何實現 MVCC 版本鏈 READVIEW 高可用 MySQL數據庫的讀寫分離 主從復制 主從同步延遲怎么處理 分庫策略 水平分庫分表的策略…

借助AI學習開源代碼git0.7之六write-tree

借助AI學習開源代碼git0.7之六write-tree write-tree.c 的作用是根據當前的索引&#xff08;cache&#xff09;內容創建一個樹&#xff08;tree&#xff09;對象&#xff0c;并將其寫入Git的對象數據庫。 樹對象代表了項目在某個時間點的目錄結構。 代碼的主要邏輯&#xff1a;…