一、项目介绍

本教程基于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,否则会报端口冲突。

六、配套源码

配套源码下载链接:Spring Cloud 项目搭建实战(Nacos + Dubbo完整版)案例源码

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐