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;…