Java案例如何实现Dubbo?

wen python案例 6

本文目录导读:

Java案例如何实现Dubbo?

  1. 技术选型与准备
  2. 整体项目结构
  3. 第一步:定义接口模块(dubbo-api)
  4. 第二步:服务提供者(dubbo-provider)
  5. 第三步:服务消费者(dubbo-consumer)
  6. 验证运行
  7. 核心要点说明
  8. 常见问题

Java 中实现 Dubbo 案例,核心步骤包括:搭建注册中心(推荐 Zookeeper)、定义接口、提供者实现服务并暴露、消费者引用并调用服务。

下面是一个完整的、可直接运行的 Mini 案例(基于 Dubbo 3.x + Spring Boot 2.x + Zookeeper)。


技术选型与准备

  • JDK 8+
  • Maven 3.6+
  • Zookeeper 3.7+(作为注册中心)—— 启动本地 ZK 服务(默认端口 2181)
  • Spring Boot 2.7.x
  • Dubbo 3.2.x

整体项目结构

建议使用 Maven 多模块项目:

dubbo-demo
├── dubbo-api          // 接口定义(POJO + Service 接口)
├── dubbo-provider     // 服务提供者(Spring Boot)
└── dubbo-consumer     // 服务消费者(Spring Boot)

第一步:定义接口模块(dubbo-api)

pom.xml:仅需少量依赖(可选 Lombok)。

实体类:

package com.example.api;
import java.io.Serializable;
public class User implements Serializable {
    private Long id;
    private String name;
    private String email;
    // getters / setters / toString(省略)
}

服务接口:

package com.example.api;
public interface UserService {
    User getUserById(Long id);
    String sayHello(String name);
}

安装到本地仓库:mvn clean install


第二步:服务提供者(dubbo-provider)

pom.xml 核心依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.18</version>
</parent>
<dependencies>
    <!-- Dubbo Spring Boot Starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>3.2.12</version>
    </dependency>
    <!-- Zookeeper 客户端(使用 Curator) -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
        <version>3.2.12</version>
        <type>pom</type>
    </dependency>
    <!-- 接口模块 -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>dubbo-api</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

application.yml(或 properties):

dubbo:
  application:
    name: user-provider
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: -1   # 随机端口(推荐)
  scan:
    base-packages: com.example.provider.service

服务实现类:

package com.example.provider.service;
import com.example.api.User;
import com.example.api.UserService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService  // 声明并暴露服务
public class UserServiceImpl implements UserService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "! (from provider)";
    }
    @Override
    public User getUserById(Long id) {
        // 模拟数据库查询
        return new User(id, "张三-" + id, "zhangsan@example.com");
    }
}

Spring Boot 启动类:

package com.example.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo  // 可选(但建议加上,显式启用 Dubbo 扫描)
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

启动后,服务将注册到 Zookeeper(可在 ZK 客户端查看 /dubbo 节点)。


第三步:服务消费者(dubbo-consumer)

pom.xml:与 provider 类似,依赖 dubbo-spring-boot-starter、Zookeeper 客户端、dubbo-api

application.yml

dubbo:
  application:
    name: user-consumer
  registry:
    address: zookeeper://127.0.0.1:2181

消费代码(Controller 或 Service):

package com.example.consumer.controller;
import com.example.api.User;
import com.example.api.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
    @DubboReference  // 远程引用服务
    private UserService userService;
    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        return userService.sayHello(name);
    }
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}

启动类:

package com.example.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

验证运行

  1. 启动 Zookeeper(默认端口 2181)
  2. 启动 Provider(控制台显示 dubbo service started
  3. 启动 Consumer(作为 Spring Boot Web 服务,默认端口 8080)
  4. 浏览器/curl:http://localhost:8080/user/hello?name=Dubbo → 返回:Hello, Dubbo! (from provider)
  5. 访问:http://localhost:8080/user/1 → 返回 JSON:{"id":1,"name":"张三-1","email":"zhangsan@example.com"}

核心要点说明

组件 说明
@DubboService 标注在 Provider 实现类上,暴露服务
@DubboReference 标注在 Consumer 字段上,注入远程代理
dubbo.protocol.port=-1 自动分配可用端口(推荐避免冲突)
Zookeeper 客户端 使用 Curator 5.x(dubbo-dependencies-zookeeper-curator5)
序列化 实体类必须实现 Serializable(Dubbo 默认 Hessian2 序列化)

常见问题

  • Zookeeper 连接不上:检查 ZK 是否启动、端口是否正确、防火墙是否关闭。
  • 版本不兼容:Dubbo 3.x 与 Spring Boot 2.x 搭配稳定,请勿混用过低版本。
  • 服务找不到:确认 provider 已启动且注册成功(ZooInspector 查看 zk 节点)。
  • @EnableDubbo 缺失:Dubbo 自动配置可能失效,建议显式添加。

如果需要更高级特性(如负载均衡、超时配置、多注册中心、TLS、Spring Cloud Alibaba 集成等),可以在 application.yml 中进一步配置 dubbo.consumerdubbo.provider 参数。

抱歉,评论功能暂时关闭!