Spring Cloud 项目搭建实战(Nacos + Dubbo 完整版)
一、项目介绍
本教程基于Spring Cloud 2025.0.0、Spring Boot 3.2.12、Dubbo 3.3.6、Nacos 3.1.1,实现Spring Cloud 服务与Dubbo 服务互通,Nacos 同时作为注册中心 + 配置中心。
二、环境准备
IntelliJ IDEA、Docker Desktop、Maven、Dubbo、Nacos、JDK21。
三、创建项目
(一)创建父工程
创建 Maven 父工程,统一管理依赖版本,避免版本冲突
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-demo</name>
<description>spring-cloud-demo</description>
<packaging>pom</packaging> <!-- 父工程必须为 Pom -->
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<!--手动关联-->
<modules>
<module>spring-cloud-demo-api</module>
<module>spring-cloud-demo-dubbo-provider</module>
<module>spring-cloud-demo-dubbo-consumer</module>
</modules>
<properties>
<java.version>21</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.version>3.14.1</maven.compiler.version>
<!-- 手动添加Spring Boot版本 -->
<spring-boot.version>3.5.12</spring-boot.version>
<!-- 手动添加Spring Cloud版本 -->
<spring-cloud.version>2025.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2025.0.0.0</spring-cloud-alibaba.version>
<dubbo.version>3.3.6</dubbo.version>
</properties>
<!--手动更新依赖-->
<dependencyManagement>
<dependencies>
<!-- 手动显式指定,避免被dubbo-bom覆盖spring-core版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo 依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo Spring Cloud 集成依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-cloud-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
(二)创建公共模块
1.公共模块pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example.demo.api</groupId>
<artifactId>spring-cloud-demo-api</artifactId>
<name>spring-cloud-demo-api</name>
<packaging>jar</packaging>
</project>
2.公共模块服务接口
package com.example.demo.api.service;
/**
* 公共服务接口(供生产者实现,消费者调用)
*/
public interface UserService {
String getUser(Long userId);
}
(三)创建服务提供者模块
1.服务提供者pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 核心:关联父工程(父子关联关键) -->
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- 指向父工程 pom.xml -->
</parent>
<groupId>com.example.demo.dubbo.provider</groupId>
<artifactId>spring-cloud-demo-dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-demo-dubbo-provider</name>
<description>spring-cloud-demo-dubbo-provider</description>
<packaging>jar</packaging>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<dependencies>
<dependency>
<groupId>com.example.demo.api</groupId>
<artifactId>spring-cloud-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Spring Boot 基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 手动添加 Nacos 注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo Spring Cloud Starter 核心 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 1. 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<parameters>true</parameters>
</configuration>
</plugin>
<!-- 2. Spring Boot 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
</project>
2.服务提供者application.yml
server:
port: 8081 # 提供者端口
spring:
application:
name: spring-cloud-demo-dubbo-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos 地址
username: nacos # 默认用户名
password: nacos # 默认密码
# Dubbo 配置
dubbo:
application:
name: ${spring.application.name} # Dubbo应用名称
qos-enable: false # 关闭 QoS(解决22222端口冲突)
protocol:
name: dubbo # 协议类型
port: 20881 # Dubbo端口(默认20880,避免冲突)
registry:
address: nacos://127.0.0.1:8848 # 注册中心指向Nacos
username: nacos
password: nacos
scan:
base-packages: com.example.demo.dubbo.provider.service.impl # 扫描Dubbo服务实现类
3.服务提供者接口实现类
使用 Dubbo 官方 @DubboService 注解暴露服务:
package com.example.demo.dubbo.provider.service.impl;
import com.example.demo.api.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class UserServiceImpl implements UserService {
@Override
public String getUser(Long userId) {
return "Hello," + userId;
}
}
4.服务提供者启动类
package com.example.demo.dubbo.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudDemoDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDemoDubboProviderApplication.class, args);
}
}
(四)创建服务消费者模块
1.服务消费者pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 核心:关联父工程(父子关联关键) -->
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- 指向父工程 pom.xml -->
</parent>
<groupId>com.example.demo.dubbo.consumer</groupId>
<artifactId>spring-cloud-demo-dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-demo-dubbo-consumer</name>
<description>spring-cloud-demo-dubbo-consumer</description>
<packaging>jar</packaging>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<dependencies>
<dependency>
<groupId>com.example.demo.api</groupId>
<artifactId>spring-cloud-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 手动添加 Nacos 注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo Spring Cloud Starter 核心 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 1. 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<parameters>true</parameters>
</configuration>
</plugin>
<!-- 2. Spring Boot 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
</project>
2.服务消费者application.yml
server:
port: 8082
spring:
application:
name: spring-cloud-demo-dubbo-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos # 默认用户名
password: nacos # 默认密码
# Dubbo 配置
dubbo:
application:
name: ${spring.application.name}
qos-enable: false # 关闭 QoS(解决22222端口冲突)
registry:
address: nacos://127.0.0.1:8848
username: nacos
password: nacos
consumer:
check: false # 启动时不强制检查服务是否存在,避免启动失败
empty-protection: true
3.服务消费者调用类
使用 @DubboReference 注解远程注入服务:
package com.example.demo.dubbo.consumer.controller;
import com.example.demo.api.service.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@DubboReference
private UserService userService;
@GetMapping("/user/{userId}")
public String getUserInfo(@PathVariable Long userId) {
return userService.getUser(userId);
}
}
4.服务消费者启动类
package com.example.demo.dubbo.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudDemoDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDemoDubboConsumerApplication.class, args);
}
}
四、启动测试
(一)启动Nacos(此次使用Docker部署,Docker部署Nacos镜像可参考之前写的Spring Cloud 项目搭建实战(Nacos + OpenFeign + LoadBalancer完整版);
(二)启动spring-cloud-demo-dubbo-provider提供者;
(三)启动spring-cloud-demo- dubbo-consumer消费者;
(四)浏览器访问:http://localhost:8082/user/1001;
(五)返回结果:Hello,1001;

(六)登录 Nacos 控制台 → 服务管理 → 服务列表,能看到 spring-cloud-demo-dubbo-provider 服务注册成功。

五、注意事项
(一)Spring Cloud和Spring Boot的版本匹配关系;
(二)Spring Boot和Dubbo的版本匹配关系;
因Dubbo暂时没有支持Spring Boot4.x的版本,所以这里使用3.5.X。另外Spring Boot的引入方式采用spring-boot-dependencies + import引入,缺点是需要需要手动配置 Java 版本、插件等
(三)关闭 Dubbo QOS 端口:qos-enable: false,否则会报端口冲突。
六、配套源码
更多推荐



所有评论(0)