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 正常運行:
-
下載 Zookeeper 并解壓,進入
bin
目錄 -
執行
zkServer.cmd
(Windows)啟動服務 -
啟動成功后,控制臺會顯示類似如下信息:
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 依賴
在 provider
和 consumer
模塊的 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 客戶端驗證服務是否注冊成功:
-
進入 Zookeeper 的
bin
目錄,雙擊zkCli.cmd
啟動客戶端 -
執行命令
ls /services
查看注冊的服務,可看到
ls /services/dubbo-demo-provider
已注冊:
5.2 測試遠程調用
啟動 Provider 和 Consumer 后,通過瀏覽器或 Postman 訪問 Consumer 的測試接口:
- 請求地址:
http://localhost:8080/consumer/testHello
- 成功響應結果:
Hello:Dubbo 消費者,我是 Dubbo 服務提供者!
調用成功界面如下:
6. 常見問題與解決方案
- 服務注冊失敗:
- 檢查 Zookeeper 是否啟動,地址是否正確(默認端口 2181)
- Provider 啟動類是否添加
@EnableDubbo
注解,確保服務被掃描
- 消費者找不到服務:
- 檢查 Provider 和 Consumer 的
application.yml
中dubbo.registry.address
是否一致 - 確認 API 接口的包路徑在 Provider 和 Consumer 中完全相同(Dubbo 基于接口全類名匹配服務)
- 檢查 Provider 和 Consumer 的
- 依賴沖突:
- 統一管理 Dubbo 和 Spring Boot 版本,避免不同模塊依賴版本不一致
總結
通過本文的步驟,我們快速搭建了一個基于 Dubbo + Spring Boot + Zookeeper 的分布式服務調用場景,核心流程包括:
- 搭建 Zookeeper 注冊中心
- 創建 Provider、Consumer 和 API 模塊并配置依賴
- 定義服務接口并實現,通過注解暴露和引用服務
- 驗證遠程服務調用
Dubbo 作為高性能的 RPC 框架,結合 Spring Boot 的自動配置和 Zookeeper 的服務治理能力,可大幅簡化分布式服務的開發與維護,適合中小型分布式系統快速落地。