大家好,我是小悟。
Dubbo 是一款高性能、轻量级的 Java RPC 框架,主要功能包括:
<!-- pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>dubbo-demo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-api</module>
<module>dubbo-provider</module>
<module>dubbo-consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
</parent>
<properties>
<dubbo.version>3.2.0</dubbo.version>
<zookeeper.version>3.8.0</zookeeper.version>
<curator.version>5.3.0</curator.version>
</properties>
</project>// UserService.java - 服务接口
package com.example.service;
public interface UserService {
UserDTO getUserById(Long id);
List<UserDTO> findAllUsers();
Long createUser(UserDTO user);
}
// UserDTO.java - 数据传输对象
package com.example.dto;
import java.io.Serializable;
public class UserDTO implements Serializable {
private Long id;
private String username;
private String email;
private Integer age;
// 构造器、getter、setter省略
}
<!-- dubbo-api/pom.xml -->
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
</dependencies><!-- dubbo-provider/pom.xml -->
<dependencies>
<!-- API 模块依赖 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- Zookeeper 注册中心 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- Zookeeper 客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- 如果使用 Nacos,替换为:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.0</version>
</dependency>
-->
</dependencies>
# application.yml
spring:
application:
name: dubbo-provider
dubbo:
application:
name: ${spring.application.name}
qos-enable: false # 关闭QoS服务,避免端口冲突
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://localhost:2181
# 如果使用Nacos:nacos://localhost:8848
scan:
base-packages: com.example.service.impl # 服务实现类扫描路径
provider:
timeout: 5000
retries: 3
// UserServiceImpl.java - 服务实现
package com.example.service.impl;
import org.apache.dubbo.config.annotation.DubboService;
import com.example.service.UserService;
import com.example.dto.UserDTO;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@DubboService(version = "1.0.0", group = "user-service")
public class UserServiceImpl implements UserService {
private final ConcurrentHashMap<Long, UserDTO> userStore = new ConcurrentHashMap<>();
private Long idGenerator = 1L;
@Override
public UserDTO getUserById(Long id) {
return userStore.get(id);
}
@Override
public List<UserDTO> findAllUsers() {
return new ArrayList<>(userStore.values());
}
@Override
public Long createUser(UserDTO user) {
Long id = idGenerator++;
user.setId(id);
userStore.put(id, user);
return id;
}
}
// ProviderApplication.java - 启动类
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo // 开启Dubbo注解支持
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
System.out.println("Dubbo Provider 启动成功!");
}
}<!-- dubbo-consumer/pom.xml -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
</dependencies>
# application.yml
spring:
application:
name: dubbo-consumer
dubbo:
application:
name: ${spring.application.name}
registry:
address: zookeeper://localhost:2181
consumer:
check: false # 启动时不检查提供者是否可用
timeout: 5000
// UserController.java - REST控制器
package com.example.controller;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;
import com.example.service.UserService;
import com.example.dto.UserDTO;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@DubboReference(
version = "1.0.0",
group = "user-service",
check = false,
timeout = 3000,
retries = 2
)
private UserService userService;
@GetMapping("/{id}")
public UserDTO getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@GetMapping
public List<UserDTO> getAllUsers() {
return userService.findAllUsers();
}
@PostMapping
public Long createUser(@RequestBody UserDTO user) {
return userService.createUser(user);
}
}
// ConsumerApplication.java - 启动类
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
System.out.println("Dubbo Consumer 启动成功!");
System.out.println("访问 http://localhost:8080/users 测试");
}
}使用 Docker 启动 Zookeeper:
docker run -d --name zookeeper \
-p 2181:2181 \
-e ZOO_STANDALONE_ENABLED=true \
zookeeper:3.8或使用 Nacos:
docker run -d --name nacos \
-p 8848:8848 \
-e MODE=standalone \
nacos/nacos-server:2.1.0@DubboReference(
version = "1.0.0",
loadbalance = "roundrobin" // 轮询负载均衡
// 可选值:random(随机)、leastactive(最少活跃调用)
)
private UserService userService;@DubboReference(
version = "1.0.0",
cluster = "failover" // 失败自动切换
// 可选值:failfast(快速失败)、failsafe(失败安全)
)
private UserService userService;// Provider端 - 发布多个版本
@DubboService(version = "2.0.0", group = "user-service")
public class UserServiceV2Impl implements UserService {
// 新版本实现
}
// Consumer端 - 引用指定版本
@DubboReference(version = "2.0.0")
private UserService userService;// Provider端
@DubboService(group = "test", version = "1.0.0")
public class UserServiceTestImpl implements UserService {
// 测试环境实现
}
@DubboService(group = "prod", version = "1.0.0")
public class UserServiceProdImpl implements UserService {
// 生产环境实现
}
// Consumer端
@DubboReference(group = "test") // 引用测试环境服务
private UserService userService;# 使用 Docker
docker run -d \
--name dubbo-admin \
-p 8080:8080 \
-e admin.registry.address=zookeeper://localhost:2181 \
-e admin.config-center=zookeeper://localhost:2181 \
-e admin.metadata-report.address=zookeeper://localhost:2181 \
apache/dubbo-admin:0.5.0访问:http://localhost:8080
@DubboService 和 @DubboReference 简化配置通过以上步骤,可以成功将 Spring Boot 与 Dubbo 集成,构建分布式微服务应用。

谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。