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白名单
- 数据加密: 敏感数据加密传输
📖 学习资源
💡 下一步
- Spring Cloud - Spring Cloud微服务生态
- 分布式事务解决方案 - Seata、LCN等
- 服务治理 - 限流、熔断、降级
最后更新时间: 2025-01-20