Dubbo 入门极简教程:从搭建到测试

我将以通俗易懂的语言,先讲解Dubbo核心概念,再按环境准备、项目搭建、代码编写、运行测试的步骤,搭配极简代码实例,写出一篇新手友好的Dubbo入门博客,避开复杂理论,聚焦实战落地。

Dubbo入门极简教程:从零搭建分布式服务调用

对于刚接触分布式开发的小伙伴来说,Dubbo是绕不开的高性能RPC框架,很多人觉得它晦涩难懂,其实核心逻辑和使用方式非常简单。这篇博客就用大白话+极简实例,带你快速上手Dubbo,看懂分布式服务怎么实现远程调用。

一、什么是Dubbo?

先一句话说清:Dubbo是Apache开源的分布式RPC框架,核心作用是让不同服务之间,像调用本地方法一样调用远程服务,不用手动写HTTP请求、处理网络通信,帮我们搞定服务注册、发现、负载均衡、远程调用等问题。

简单理解:

  • 服务提供者(Provider):提供接口服务,把自己注册到注册中心

  • 服务消费者(Consumer):从注册中心找服务,调用远程接口

  • 注册中心:服务的“通讯录”,常用Nacos,记录服务地址,方便提供者注册、消费者发现

  • 温馨提醒:为简化入门理解,本教程代码示例将生产者、消费者角色拆分演示;但实际开发中,一个服务通常既是生产者也是消费者——既对外提供自己的接口服务(生产者),也需要调用其他服务的接口完成自身业务(消费者),而非单纯只做其中一种。

二、核心依赖引入

前提:已准备好JDK8+、Maven3.6+环境,且启动Nacos注册中心(访问http://localhost:8848/nacos,账号密码默认nacos/nacos),创建Maven多模块项目(分3个模块:api接口模块、provider服务提供者、consumer服务消费者)

在父工程pom.xml中统一管理Dubbo和Nacos依赖,版本选用稳定的3.2.x。


<!-- 父工程pom -->
<properties>
    <dubbo.version>3.2.10</dubbo.version>
    <nacos.version>2.2.1</nacos.version>
</properties>

<dependencies>
    <!-- Dubbo核心依赖 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
    <!-- Dubbo集成Nacos注册中心 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-registry-nacos</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
</dependencies>
          

三、三步搭建极简实例

说明:本实例拆分“服务提供者、服务消费者”角色演示,核心是帮助新手快速掌握Dubbo基础用法;实际开发中,单个服务可同时兼具两种角色,灵活实现接口提供与远程调用。

第一步:创建API模块(公共接口层)

API模块只定义服务接口,给提供者和消费者共用,实现解耦。

创建接口HelloService


package com.dubbo.api;

/**
 * 公共服务接口
 */
public interface HelloService {
    // 简单的远程调用方法
    String sayHello(String name);
}
          

第二步:搭建服务提供者(Provider)

  1. 引入API模块依赖
<!-- provider模块pom -->
<dependency>
    <groupId>com.dubbo</groupId>
    <artifactId>provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
          
  1. 编写application.yml配置

配置Dubbo服务名称、注册中心(含账号密码)、协议端口,告诉Dubbo要暴露服务并通过账号密码验证连接Nacos,完成服务注册。


server:
  port: 8081 # 服务端口
dubbo:
  application:
    name: dubbo-provider # 服务名
  registry:
    address: nacos://127.0.0.1:8848 # Nacos注册中心地址
    username: nacos # Nacos账号(默认nacos)
    password: nacos # Nacos密码(默认nacos)
  protocol:
    name: dubbo # 通信协议
    port: 20880 # Dubbo通信端口

  1. 实现API接口

@DubboService注解标记实现类,告诉Dubbo这个类是对外提供的服务,需要暴露出去。


package com.dubbo.provider.service;

import com.dubbo.api.HelloService;
import org.apache.dubbo.config.annotation.DubboService;

/**
 * 服务提供者实现类
 */
@Service // 标识为Spring业务组件,支持本服务内部注入
@DubboService // 暴露Dubbo远程服务,注册到Nacos
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name + ",我是Dubbo服务提供者!";
    }
}

  1. 启动类

package com.dubbo.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DubboProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
        System.out.println("Dubbo服务提供者启动成功!");
    }
}

第三步:搭建服务消费者(Consumer)

  1. 引入API模块依赖(和提供者一致)

<!-- consumer模块pom -->
<dependency>
    <groupId>com.dubbo</groupId>
    <artifactId>provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
          
  1. 编写application.yml配置

配置服务名和Nacos地址(含账号密码),消费者通过账号密码验证连接Nacos,从注册中心发现服务,无需配置通信端口。


server:
  port: 8082
dubbo:
  application:
    name: dubbo-consumer
  registry:
    address: nacos://127.0.0.1:8848 # 必须和提供者Nacos地址一致
    username: nacos # Nacos账号(与提供者一致,默认nacos)
    password: nacos # Nacos密码(与提供者一致,默认nacos)
          
  1. 编写调用类

@DubboReference注解注入远程服务,像调用本地方法一样调用远程接口。


package com.dubbo.consumer.controller;

import com.dubbo.api.HelloService;
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 HelloController {

    // 核心注解:引用远程Dubbo服务
    @DubboReference
    private HelloService helloService;

    @GetMapping("/hello/{name}")
    public String hello(@PathVariable String name) {
        // 调用远程服务方法
        return helloService.sayHello(name);
    }
}

  1. 启动类

package com.dubbo.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DubboConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
        System.out.println("Dubbo服务消费者启动成功!");
    }
}

四、运行测试

  1. 启动Nacos注册中心

  2. 启动Dubbo服务提供者(Provider)

  3. 启动Dubbo服务消费者(Consumer)

  4. 浏览器访问:http://localhost:8082/hello/小白

  5. 页面返回结果:Hello 小白,我是Dubbo服务提供者!

看到这个结果,说明远程调用成功!消费者成功通过Nacos找到提供者服务,完成了RPC调用。

五、核心知识点总结

  1. 两大核心注解

  2. @DubboService:提供者端,暴露服务,注册到注册中心

  3. @DubboReference:消费者端,发现服务,注入远程接口代理

  4. 注册中心作用:提供者注册服务,消费者发现服务,两者都必须配置Nacos账号密码(默认nacos/nacos),否则无法连接Nacos完成服务交互

  5. API模块意义:公共接口层,避免代码重复,实现服务契约统一

  6. 调用逻辑:提供者注册→消费者发现→本地缓存服务地址→直接远程调用,不用每次查注册中心

  7. 实际开发补充:本教程拆分生产者、消费者角色是为了简化入门;实际开发中,一个服务通常既是生产者也是消费者,比如:订单服务会对外提供订单查询接口(生产者),同时需要调用用户服务获取用户信息(消费者),无需严格拆分两个独立服务。

六、常见问题

  1. 报错No provider available:检查Nacos是否启动、配置地址/账号/密码是否正确、提供者是否正常启动

  2. 服务没注册到Nacos:检查@DubboService是否添加、Dubbo依赖是否引入完整

  3. 调用超时:检查提供者端口是否被占用、网络是否通畅

Dubbo入门其实很简单,核心就是服务注册+服务发现+远程调用,先把这个极简案例跑通,再深入学习负载均衡、集群容错、熔断降级等高级特性,就会轻松很多。需要记住:实际开发中,一个服务几乎不会单纯作为生产者或消费者,通常两者都是,灵活兼顾接口提供与远程调用需求。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容