SpringBoot+Dubbo+Zookeeper实现分布式系统步骤

news2025/5/13 10:23:22

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 {
    @Override
    public 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=8080

dubbo.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.coloradmin.cn/o/2374583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程10-有名管道概述、创建、读写操作、两个管道进程间通信、读写规律(只读、只写、读写区别)、设置阻塞/非阻塞

目录 1.有名管道 1.1概述 1.2与无名管道的差异 2.有名管道的创建 2.1 直接用shell命令创建有名管道 2.2使用mkfifo函数创建有名管道 3.有名管道读写操作 3.1单次读写 3.2多次读写 4.有名管道进程间通信 4.1回合制通信 4.2父子进程通信 5.有名管道读写规律&#xff…

精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案

这份文档是一份全面风险管理信息系统项目建设风控一体化标准方案&#xff0c;涵盖了业务架构、功能方案、系统技术架构设计、项目实施及服务等多个方面的详细内容。方案旨在通过信息化手段提升企业全面风险管理工作水平&#xff0c;促进风险管理落地和内部控制规范化&#xff0…

YOLOv8网络结构

YOLOv8的网络结构由输入端(Input)、骨干网络(Backbone)、颈部网络(Neck)和检测头(Head)四部分组成。 YOLOv8的网络结构如下图所示&#xff1a; 在整个系统架构中&#xff0c;图像首先进入输入处理模块&#xff0c;该模块承担着图像预处理与数据增强的双重任务。接着&#xff0c…

笔记本电脑升级实战手册【扩展篇1】:flash id查询硬盘颗粒

文章目录 前言&#xff1a;一、硬盘颗粒介绍1、MLC&#xff08;Multi-Level Cell&#xff09;2、TLC&#xff08;Triple-Level Cell&#xff09;3、QLC&#xff08;Quad-Level Cell&#xff09; 二、硬盘与主控1、主控介绍2、主流主控厂家 三 、硬盘颗粒查询使用flash id工具查…

AutoDL租用服务器教程

在跑ai模型的时候&#xff0c;容易遇到算力不够的情况。此时便需要租用服务器。autodl是个较为便宜的服务器租用平台&#xff0c;h20仅需七点几元每小时。下面是简单的介绍。 打开网站AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL&#xff0c;并登录账号 登录后&#xff…

goner/otel 在Gone框架接入OpenTelemetry

文章目录 背景与意义快速上手&#xff1a;五步集成 OpenTelemetry运行效果展示代码详解与实践目录结构说明组件加载&#xff08;module.load.go&#xff09;业务组件示例&#xff08;your_component.go&#xff09;程序入口&#xff08;main.go&#xff09; 进阶用法与最佳实践…

杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】

基于SSMJSP鲜花商城系统 随着电子商务的快速发展&#xff0c;鲜花在线销售已成为一种重要的消费模式。本文设计并实现了一个基于JSP技术的鲜花销售管理系统&#xff0c;采用B/S架构&#xff0c;使用SSM框架进行开发&#xff0c;并结合Maven进行项目依赖管理。系统分为前台用户模…

springboot集成langchain4j实现票务助手实战

前言 看此篇的前置知识为langchain4j整合springboot&#xff0c;以及springboot集成langchain4j记忆对话。 Function-Calls介绍 langchain4j 中的 Function Calls&#xff08;函数调用&#xff09;是一种让大语言模型&#xff08;LLM&#xff09;与外部工具&#xff08;如 A…

Feed流推送之订阅推送

分类 feed流分为TimeLine和智能排序&#xff0c;前者不对内容进行过滤&#xff0c;一般根据发布的时间来进行排序&#xff0c;一般用于好友动态或者推送关注的人的消息&#xff0c;而后者一般有着复杂的算法&#xff0c;可以根据算法智能地向目标用户推送内容&#xff0c;例如…

wordpress自学笔记 第四节 商城菜单的添加和修改美化

wordpress自学笔记 摘自 超详细WordPress搭建独立站商城教程-第四节 商城菜单的添加和修改美化&#xff0c;2025 WordPress搭建独立站商城#WordPress建站教程https://www.bilibili.com/video/BV1UwwgeuEkK?spm_id_from333.788.videopod.sections&vd_sourcea0af3bbc6b6d…

GPU L2 Cache一致性协议对科学计算的影响研究

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、GPU缓存层级革命&#xff1a;从Volta到Hopper的演进图谱 1.1 架构级缓存策略对比 ‌Vo…

【速写】KV-cache与解码的再探讨(以束搜索实现为例)

文章目录 1 Beam Search 解码算法实现2 实现带KV Cache的Beam Search解码3 关于在带kv-cache的情况下的use_cache参数 1 Beam Search 解码算法实现 下面是一个使用PyTorch实现的beam search解码算法&#xff1a; 几个小细节&#xff1a; 束搜索可以加入length_penalty&#…

(网络)应用层协议-HTTPS

1.HTTPS是什么&#xff1f; HTTPS是应用层的一种协议&#xff0c;是在HTTP的基础上进行了加密层的处理。 HTTP协议的内容都是按照文本的形式进行传输的&#xff0c;所以呢就很容易被别人知道传输的是什么。 我们在了解了TCP/IP之后是知道我们的数据在传输的过程中是通过路由器进…

vue3: pdf.js 3.4.120 using javascript

npm install pdfjs-dist3.4.120 项目结构&#xff1a; pdfjsViewer.vue <template><div><div v-if"loading" class"flex justify-center items-center py-8"><div class"animate-spin rounded-full h-12 w-12 border-b-2 borde…

想实现一个基于MCP的pptx生成系统架构图【初版实现】

技术栈:Python + MCP协议 + python-pptx + FastMCP 核心创新点:通过MCP协议实现PPTX元素的动态化生成与标准化模板管理 当前还是个半成品,后续持续更新。 主要先介绍一下思路。 一、MCP协议与系统设计原理 1.1 为什么选择MCP? 标准化工具调用:通过MCP将PPTX元素生成逻辑封…

PyTorch Lightning实战 - 训练 MNIST 数据集

MNIST with PyTorch Lightning 利用 PyTorch Lightning 训练 MNIST 数据。验证梯度范数、学习率、优化器对训练的影响。 pip show lightning Version: 2.5.1.post0Fast dev run DATASET_DIR"/repos/datasets" python mnist_pl.py --output_grad_norm --fast_dev_run…

力扣2094题解

记录&#xff1a; 2025.5.12 题目&#xff1a; 思路&#xff1a; 暴力遍历。 解题步骤&#xff1a; 1.统计数字出现次数&#xff1a;使用数组cnt来记录输入数组中每个数字的出现次数。 2.生成三位偶数&#xff1a;通过循环从100开始&#xff0c;每次递增2&#xff0c;生成…

DHCP自动分配IP

DHCP自动分配IP 练习1 路由器 Router>en Router#conf t Router(config)#ip dhcp pool ip10 //创建DHCP地址池 Router(dhcp-config)#network 192.168.20.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#default-router 192.168.20.254 //配置默认网关 Rou…

【CF】Day57——Codeforces Round 955 (Div. 2, with prizes from NEAR!) BCD

B. Collatz Conjecture 题目&#xff1a; 思路&#xff1a; 简单模拟 很简单的模拟&#xff0c;我们只需要快速的找到下一个离 x 最近的 y 的倍数即可&#xff08;要大于 x&#xff09; 这里我们可以这样写 add y - (x % y)&#xff0c;这样就知道如果 x 要变成 y 的倍数还要…

(done) 补充:xv6 的一个用户程序 init 是怎么启动的 ?它如何启动第一个 bash ?

先看 main.c 从函数名来看&#xff0c;比较相关的就 userinit() 和 scheduler() #include "types.h" #include "param.h" #include "memlayout.h" #include "riscv.h" #include "defs.h"volatile static int started 0;//…