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 {
    @Override
    public 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 服务
    @DubboReference
    private 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 的服务治理能力,可大幅简化分布式服务的开发与维护,适合中小型分布式系统快速落地。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值