Skip to content
作者:daily5am创建:-更新:-
字数:预计阅读: 分钟访问量:--

Apache Dubbo

AI生成声明: 本文档由AI辅助生成,旨在提供Apache Dubbo RPC框架的完整指南。

🎯 概述

Apache Dubbo是阿里巴巴开源的高性能Java RPC框架,提供了服务注册与发现、负载均衡、容错、监控等完整的微服务解决方案。

📚 核心概念

架构组件

  • Provider: 服务提供者
  • Consumer: 服务消费者
  • Registry: 注册中心
  • Monitor: 监控中心
  • Container: 服务容器

调用流程

Consumer -> Registry -> Provider

  Monitor

🔧 核心功能

服务定义

java
// 服务接口
public interface UserService {
    User getUser(Long id);
    List<User> listUsers();
}

// 服务实现
@Service
public class UserServiceImpl implements UserService {
    @Override
    public User getUser(Long id) {
        return userRepository.findById(id);
    }
    
    @Override
    public List<User> listUsers() {
        return userRepository.findAll();
    }
}

服务提供者

java
// Provider配置
@Configuration
public class DubboProviderConfig {
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig config = new ApplicationConfig();
        config.setName("user-service");
        return config;
    }
    
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig config = new RegistryConfig();
        config.setAddress("zookeeper://localhost:2181");
        return config;
    }
    
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig config = new ProtocolConfig();
        config.setName("dubbo");
        config.setPort(20880);
        return config;
    }
}

// 服务暴露
@Service
public class UserServiceImpl implements UserService {
    // 实现方法
}

服务消费者

java
// Consumer配置
@Configuration
public class DubboConsumerConfig {
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig config = new ApplicationConfig();
        config.setName("order-service");
        return config;
    }
    
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig config = new RegistryConfig();
        config.setAddress("zookeeper://localhost:2181");
        return config;
    }
}

// 服务引用
@Service
public class OrderService {
    @Reference(version = "1.0.0", timeout = 3000)
    private UserService userService;
    
    public Order createOrder(OrderRequest request) {
        User user = userService.getUser(request.getUserId());
        // 创建订单逻辑
        return order;
    }
}

🚀 高级特性

负载均衡

java
// 负载均衡策略
@Reference(loadbalance = "roundrobin")  // 轮询
@Reference(loadbalance = "random")      // 随机
@Reference(loadbalance = "leastactive") // 最少活跃
@Reference(loadbalance = "consistenthash") // 一致性哈希
private UserService userService;

容错机制

java
// 容错策略
@Reference(cluster = "failover")    // 失败重试
@Reference(cluster = "failfast")     // 快速失败
@Reference(cluster = "failsafe")     // 失败安全
@Reference(cluster = "failback")     // 失败自动恢复
@Reference(cluster = "forking")      // 并行调用
@Reference(cluster = "broadcast")    // 广播调用
private UserService userService;

服务分组

java
// 服务分组
@Reference(group = "user-service-v1")
private UserService userServiceV1;

@Reference(group = "user-service-v2")
private UserService userServiceV2;

服务版本

java
// 版本控制
@Reference(version = "1.0.0")
private UserService userServiceV1;

@Reference(version = "2.0.0")
private UserService userServiceV2;

异步调用

java
// 异步调用
@Reference(async = true)
private UserService userService;

public void asyncGetUser(Long id) {
    CompletableFuture<User> future = RpcContext.getContext()
        .getCompletableFuture();
    userService.getUser(id);
    future.whenComplete((user, throwable) -> {
        if (throwable == null) {
            // 处理结果
        } else {
            // 处理异常
        }
    });
}

参数回调

java
// 参数回调
public interface CallbackService {
    void addListener(String key, CallbackListener listener);
}

// 使用
@Reference
private CallbackService callbackService;

public void registerCallback() {
    callbackService.addListener("foo", new CallbackListener() {
        @Override
        public void changed(String msg) {
            // 处理回调
        }
    });
}

🔧 配置方式

XML配置

xml
<!-- provider.xml -->
<dubbo:application name="user-service"/>
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.example.UserService" ref="userService"/>

注解配置

java
// 使用@DubboService和@DubboReference
@DubboService(version = "1.0.0")
public class UserServiceImpl implements UserService {
    // 实现
}

@DubboReference(version = "1.0.0")
private UserService userService;

属性配置

yaml
# application.yml
dubbo:
  application:
    name: user-service
  registry:
    address: zookeeper://localhost:2181
  protocol:
    name: dubbo
    port: 20880
  consumer:
    timeout: 3000
    retries: 2

📊 监控与管理

Dubbo Admin

Dubbo Admin是Dubbo的管理控制台。

yaml
# 访问地址
http://localhost:8080

监控指标

  • QPS: 每秒请求数
  • RT: 响应时间
  • 成功率: 请求成功率
  • 连接数: 连接数量

💡 最佳实践

1. 服务设计

  • 接口设计: 接口粒度适中
  • 参数设计: 避免大对象传递
  • 返回值: 使用DTO而非Entity

2. 性能优化

  • 连接池: 合理配置连接池大小
  • 序列化: 选择合适的序列化方式
  • 压缩: 大数据传输使用压缩

3. 容错设计

  • 超时设置: 设置合理的超时时间
  • 重试策略: 配置重试次数和间隔
  • 降级处理: 实现服务降级逻辑

4. 安全配置

  • 认证授权: 使用Token认证
  • IP白名单: 配置IP白名单
  • 数据加密: 敏感数据加密传输

📖 学习资源

💡 下一步


最后更新时间: 2025-01-20