Dubbo系列:Dubbo入门

2025-02-02 11:47
353
0

一、Dubbo简介

Apache Dubbo 是一款轻量级高性能的开源Java RPC框架,主要用于构建分布式服务架构。它提供了服务治理、负载均衡、服务注册与发现、容错机制等功能,帮助开发者轻松构建高性能、可扩展的分布式应用。Dubbo官网

Dubbo 的核心特性:

  • 透明化的远程方法调用: 像调用本地方法一样调用远程服务。
  • 软负载均衡及容错机制: 提供多种负载均衡策略和容错机制,保证服务的高可用性。
  • 服务自动注册与发现: 服务提供者自动注册服务,消费者自动发现服务,简化服务治理。
  • 高度可扩展: 支持多种协议、序列化方式、注册中心等,方便扩展和定制。

更多核心特性可查看官网文档

二、Dubbo架构

Dubbo 架构主要由以下几个角色组成:

  • Provider: 服务提供者,暴露服务接口,处理消费者请求。
  • Consumer: 服务消费者,调用远程服务接口。
  • Registry: 注册中心,负责服务注册与发现。
  • Monitor: 监控中心,统计服务调用次数和调用时间。
  • Container: 服务运行容器,负责启动、加载、运行服务提供者。

图例说明:

  • 图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互。
  • 图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点。
  • 图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。
  • 图中只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中。

各模块的调用关系:

  1. 服务容器Container负责启动、加载、运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
     

三、Dubbo的使用方式介绍

  • 基于Spring Boot集成:适合 Spring Boot 项目,配置简单,开发效率高。官方文档
  • 基于Spring XML集成:适合传统 Spring 项目,配置灵活,功能强大。官方文档
  • 基于原生API集成:适合不依赖 Spring 的项目,直接使用 Dubbo 的核心 API。官方文档

可以根据项目需求选择合适的集成方式,官方文档都有详细的说明,在此仅介绍下Spring Boot的集成。

3.1、基于Spring Boot集成

Dubbo 提供了对 Spring 框架的完整支持,官方提供的 dubbo-spring-boot-starter 可以高效开发 Dubbo 微服务应用。

开发步骤

  1. 添加Maven依赖:在 pom.xml 中添加 Dubbo 和 Spring Boot 的依赖。
  2. 配置 Dubbo:在 application.properties 或 application.yml 中配置 Dubbo 的相关属性。
  3. 编写服务接口和实现:定义服务接口,并在服务提供者中实现接口。
  4. 使用 @DubboService 和 @DubboReference 注解:暴露服务和引用服务。
  5. 启动服务时添加@EnableDubbo注解:服务启动者和消费者都需要添加此注解,以启用Dubbo的自动配置,使得Spring Boot能够自动扫描和注入Dubbo的服务接口。

3.1.1、示例

按企业项目开发的结构划分模块如下,源码地址

my-dubbo-project
│
├── dubbo-api
│   ├── src/main/java
│   │   └── org/example/dubbo/api
│   │       └── DemoService.java
│   └── pom.xml
│
├── dubbo-provider
│   ├── src/main/java
│   │   └── org/example/dubbo/provider
│   │       ├── DemoServiceImpl.java
│   │       └── ProviderApplication.java
│   └── pom.xml
│
├── dubbo-consumer
│   ├── src/main/java
│   │   └── org/example/dubbo/consumer
│   │       ├── DemoController.java
│   │       └── ConsumerApplication.java
│   └── pom.xml
│
└── pom.xml (父POM文件)
  • dubbo-api模块:这个模块定义了服务接口。DemoService.java文件中定义了一个简单的服务接口,接口内容如下:
  • dubbo-provider模块:这个模块是服务的提供者,实现了dubbo-api模块中定义的接口。DemoServiceImpl.java文件中实现了DemoService接口。
  • dubbo-consumer:这个模块是服务的消费者,使用dubbo-api模块中定义的接口。DemoController.java文件中通过@DubboReference注解注入了DemoService接口的实例。

运行项目

  1. 启动 Zookeeper:确保 Zookeeper 已启动并运行在 127.0.0.1:2181。
  2. 启动服务端:运行 ProviderApplication,启动服务提供者。
  3. 启动客户端:运行 ConsumerApplication,启动服务消费者。
  4. 测试接口:访问 http://localhost:8080/hello?name=world,可以看到返回结果 Hello, world。

3.2、Dubbo注解

Dubbo的常用注解有:@DubboService、@DubboReference 与 @EnableDubbo 。其中 @DubboService 与 @DubboReference 用于标记 Dubbo 服务,@EnableDubbo 启动 Dubbo 相关配置并指定 Spring Boot 扫描包路径。

3.2.1、@DubboService注解

@Service 注解从 3.0 版本开始就已经废弃,改用 @DubboService,以区别于 Spring 的 @Service 注解

定义好 Dubbo 服务接口后,提供服务接口的实现逻辑,并用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露

@DubboService
public class DemoServiceImpl implements DemoService {}

如果要设置服务参数,@DubboService 也提供了常用参数的设置方式。如果有更复杂的参数设置需求,则可以考虑使用其他设置方式

@DubboService(version = "1.0.0", group = "dev", timeout = 5000)
public class DemoServiceImpl implements DemoService {}

3.2.2、@DubboReference注解

@Reference 注解从 3.0 版本开始就已经废弃,改用 @DubboReference,以区别于 Spring 的 @Reference 注解

@DubboReference 注解将自动注入为 Dubbo 服务代理实例,使用 demoService 即可发起远程服务调用

@Component
public class DemoClient {
    @DubboReference
    private DemoService demoService;
}

3.2.3、@EnableDubbo注解

@EnableDubbo 注解必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 可以定义在主类上

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

默认只会扫描 main 类所在的 package,如果服务定义在其它 package 中,需要增加配置 

@EnableDubbo(scanBasePackages = {"org.apache.dubbo.springboot.demo.provider"})

全部评论