大纲
前言
Dubbo 是阿里巴巴开源的产品,采用二进制通信,相比 OpenFeign 的 HTTP 通信,具有性能优势,而且可以轻松集成到 SpringBoot 和 Spring Cloud 中使用,对于性能要求比较高的场景,使用比较广泛。
学习资源
版本对应关系
SpringBoot 与 Dubbo 的版本必须互相匹配,否则不同版本之间可能会存在兼容性问题,最终导致服务无法正常运行。两者的版本对应关系如下:
Dubbo 分支 | 最新版本 | JDK | SpringBoot | 详细说明 |
---|
3.3.x | 3.3.2 | 8, 17, 21 | 2.x、3.x | 生产可用(推荐,长期维护)! 最新 Triple 协议升级,内置 Metrics、Tracing、GraalVM 支持等 |
3.2.x | 3.2.10 | 8, 17 | 2.x、3.x | 生产可用(长期维护)! |
3.1.x | 3.1.11 | 8, 17 | 2.x、3.x | 仅修复安全漏洞! |
3.0.x | 3.0.15 | 8 | 2.x | 停止维护! |
2.7.x | 2.7.23 | 8 | 2.x | 停止维护! |
2.6.x | 2.6.20 | 6, 7 | - | 停止维护! |
2.5.x | 2.5.10 | 6, 7 | - | 停止维护! |
如果仍然使用版本低于 2.7.0
的旧版 Dubbo,请使用以下 Spring Boot 启动器:
Dubbo Spring Boot Starter | Dubbo | Spring Boot |
---|
0.2.1.RELEASE | 2.6.5+ | 2.x |
0.1.2.RELEASE | 2.6.5+ | 1.x |
Dubbo 整合案例
本节目将整合 SpringBoot 与 Dubbo,并使用 Nacos 作为 Dubbo 的注册中心。值得一提的是,本教程的内容也适用于 Spring Cloud 项目。
版本说明
组件 | 版本 | 说明 |
---|
SpringBoot | 3.4.2 | |
Dubbo Spring Boot Starter | 3.3.2 | 依赖 Dubbo 3.3.2 |
Nacos Server | 2.5.0 | Nacos 服务器,作为服务注册中心 |
JDK | 17 | 支持 JDK 17 及以上版本 |
模块说明
api
:抽取出来的公共模块,存放公用的实体类和接口provider
:服务提供者,实现 api
模块中的接口customer
:服务消费者,调用服务提供者中的接口
案例代码
API 模块
1 2 3 4 5
| public interface DemoService {
String sayHello(String name);
}
|
Provider 模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| <properties> <spring-boot.version>3.4.2</spring-boot.version> <dubbo-springboot.version>3.3.2</dubbo-springboot.version> <dubbo-nacos.version>3.3.2</dubbo-nacos.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>com.clay.dubbo</groupId> <artifactId>dubbo-lesson-01-api</artifactId> <version>1.0-SNAPSHOT</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-springboot.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>${dubbo-nacos.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
|
- 接口实现类,
@DubboService
注解主要用于暴露服务,使其能够被 Dubbo 框架识别并注册到服务注册中心
1 2 3 4 5 6 7 8 9 10 11
| import org.apache.dubbo.config.annotation.DubboService;
@DubboService public class DemoServiceImpl implements DemoService {
@Override public String sayHello(String name) { return "Hello " + name; }
}
|
1 2 3 4 5 6 7 8
| @SpringBootApplication public class ProviderApplication {
public static void main(String[] args) { SpringApplication.run(ProviderApplication.class); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| server: port: 9090
spring: application: name: dubbo-provider-application
dubbo: application: name: ${spring.application.name} registry: address: nacos://127.0.0.1:8848 protocol: name: dubbo port: 20880 scan: base-packages: com.clay.dubbo.provider
|
提示
若不希望在 YML 配置文件中指定 dubbo.scan.base-packages
参数,那么可以在主启动类上标注 @EnableDubbo(scanBasePackages = "xxx")
注解或者 @DubboComponentScan(basePackages = "xxx")
注解来替代。
Consumer 模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| <properties> <spring-boot.version>3.4.2</spring-boot.version> <dubbo-springboot.version>3.3.2</dubbo-springboot.version> <dubbo-nacos.version>3.3.2</dubbo-nacos.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>com.clay.dubbo</groupId> <artifactId>dubbo-lesson-01-api</artifactId> <version>1.0-SNAPSHOT</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-springboot.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>${dubbo-nacos.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
|
- 业务测试类,
@DubboReference
注解主要用于在服务消费者端引用远程服务提供者的服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import org.apache.dubbo.config.annotation.DubboReference;
@Slf4j @RestController public class DemoController {
@DubboReference(loadbalance = "random") private DemoService demoService;
@GetMapping("/sayHello/{name}") public String sayHello(@PathVariable("name") String name) { String result = demoService.sayHello(name); log.info("===> " + result); return result; }
}
|
1 2 3 4 5 6 7 8
| @SpringBootApplication public class ConsumerApplication {
public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| server: port: 9095
spring: application: name: dubbo-consumer-application
dubbo: application: name: ${spring.application.name} registry: address: nacos://127.0.0.1:8848 scan: base-packages: com.clay.dubbo.consumer consumer: check: false retries: 0 timeout: 1000
|
提示
若不希望在 YML 配置文件中指定 dubbo.scan.base-packages
参数,那么可以在主启动类上标注 @EnableDubbo(scanBasePackages = "xxx")
注解或者 @DubboComponentScan(basePackages = "xxx")
注解来替代。
测试代码
下载代码
- 完整的案例代码可以直接从 GitHub 下载对应章节
dubbo-lesson-01
。
使用 ZooKeeper 注册中心
若希望在 SpringBoot 整合 Dubbo 时,使用 ZooKeeper 作为注册中心,那么在上述案例的基础上,按照以下步骤进行更改即可。
- (1) 在 Provider 和 Consumer 模块中,移除 Nacos 的依赖,并添加 ZooKeeper 与 Curator 的依赖,其中 Curator 用于连接 ZooKeeper 注册中心(版本为
3.9.3
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <properties> <spring-boot.version>3.4.2</spring-boot.version> <dubbo-springboot.version>3.3.2</dubbo-springboot.version> <curator.version>5.7.1</curator.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependencies> <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-springboot.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>${curator.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-x-discovery-server</artifactId> <version>${curator.version}</version> </dependency> </dependencies>
|
- (2) 在 Provider 和 Consumer 模块中,指定 ZooKeeper 注册中心的地址
1 2 3 4
| dubbo: registry: address: zookeeper://127.0.0.1:2181
|
特别注意
如果使用 ZooKeeper 作为注册中心,那么在 Maven 的配置文件中,Curator 的版本必须与 ZooKeeper 服务器的版本相匹配,否则会导致兼容问题的出现。
参考资料