我将以通俗易懂的语言,先讲解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)
- 引入API模块依赖
<!-- provider模块pom -->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 编写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通信端口
- 实现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服务提供者!";
}
}
- 启动类
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)
- 引入API模块依赖(和提供者一致)
<!-- consumer模块pom -->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>provider-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 编写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)
- 编写调用类
用@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);
}
}
- 启动类
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服务消费者启动成功!");
}
}
四、运行测试
启动Nacos注册中心
启动Dubbo服务提供者(Provider)
启动Dubbo服务消费者(Consumer)
页面返回结果:
Hello 小白,我是Dubbo服务提供者!
看到这个结果,说明远程调用成功!消费者成功通过Nacos找到提供者服务,完成了RPC调用。
五、核心知识点总结
两大核心注解
@DubboService:提供者端,暴露服务,注册到注册中心@DubboReference:消费者端,发现服务,注入远程接口代理注册中心作用:提供者注册服务,消费者发现服务,两者都必须配置Nacos账号密码(默认nacos/nacos),否则无法连接Nacos完成服务交互
API模块意义:公共接口层,避免代码重复,实现服务契约统一
调用逻辑:提供者注册→消费者发现→本地缓存服务地址→直接远程调用,不用每次查注册中心
实际开发补充:本教程拆分生产者、消费者角色是为了简化入门;实际开发中,一个服务通常既是生产者也是消费者,比如:订单服务会对外提供订单查询接口(生产者),同时需要调用用户服务获取用户信息(消费者),无需严格拆分两个独立服务。
六、常见问题
报错
No provider available:检查Nacos是否启动、配置地址/账号/密码是否正确、提供者是否正常启动服务没注册到Nacos:检查
@DubboService是否添加、Dubbo依赖是否引入完整调用超时:检查提供者端口是否被占用、网络是否通畅
Dubbo入门其实很简单,核心就是服务注册+服务发现+远程调用,先把这个极简案例跑通,再深入学习负载均衡、集群容错、熔断降级等高级特性,就会轻松很多。需要记住:实际开发中,一个服务几乎不会单纯作为生产者或消费者,通常两者都是,灵活兼顾接口提供与远程调用需求。