Dubbo RPC通信实战
2026/5/24 15:52:51 网站建设 项目流程

Dubbo RPC通信实战

前言

Dubbo是阿里巴巴开源的高性能RPC框架,作为Spring Cloud Alibaba生态中的通信组件,提供了丰富的服务治理能力。本文将详细介绍Dubbo的配置和使用。

一、Dubbo核心概念

1.1 架构图

┌─────────────────────────────────────────────────────┐ │ Dubbo Architecture │ │ │ │ Consumer │ │ │ │ │ │ RPC Invocation │ │ ▼ │ │ ┌────────────────────────────────────────────────┐ │ │ │ ProxyFactory → Invoker → Protocol │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ │ ┌──────────────────────▼──────────────────────┐ │ │ │ Registry/Config │ │ │ │ (Nacos / Zookeeper) │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ │ Provider │ │ ┌────────────────────────────────────────────────┐ │ │ │ Protocol → Exporter → Filter │ │ │ └────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘

二、快速集成

2.1 依赖配置

<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.2.0</version> </dependency>

2.2 服务提供者配置

dubbo: application: name: product-service qos-enable: false metadata-report: address: redis://redis:6379 protocol: name: dubbo port: -1 threads: 200 iothreads: 16 queues: 0 serialization: dubbo registry: address: nacos://${spring.cloud.nacos.server-addr} group: DEFAULT_GROUP parameters: namespace: ${spring.cloud.nacos.discovery.namespace:} provider: timeout: 3000 retries: 0 delay: -1 loadbalance: roundrobin config-center: address: nacos://${spring.cloud.nacos.server-addr} metadata-report: address: nacos://${spring.cloud.nacos.server-addr}

2.3 服务消费者配置

dubbo: application: name: order-service consumer: timeout: 5000 check: false retries: 0 loadbalance: roundrobin actives: 200 reference: check: false timeout: 5000

三、服务定义与实现

3.1 API定义

public interface ProductDubboService { ProductDTO getProduct(Long id); List<ProductDTO> listProducts(int page, int size); ProductDTO createProduct(CreateProductRequest request); boolean updateStock(Long productId, Integer quantity); } @Data public class ProductDTO implements Serializable { private Long id; private String name; private BigDecimal price; private Integer stock; private String category; }

3.2 服务提供者实现

@Service(version = "1.0.0", group = "product-group") @Component @Slf4j public class ProductDubboServiceImpl implements ProductDubboService { @Autowired private ProductService productService; @Override public ProductDTO getProduct(Long id) { Product product = productService.findById(id) .orElseThrow(() -> new ProductNotFoundException(id)); return productMapper.toDTO(product); } @Override public List<ProductDTO> listProducts(int page, int size) { Pageable pageable = PageRequest.of(page, size); Page<Product> products = productService.findAll(pageable); return products.stream() .map(productMapper::toDTO) .collect(Collectors.toList()); } @Override public ProductDTO createProduct(CreateProductRequest request) { Product product = productService.createProduct(request); return productMapper.toDTO(product); } @Override public boolean updateStock(Long productId, Integer quantity) { return productService.updateStock(productId, quantity); } }

3.3 服务消费者调用

@Service @Slf4j public class OrderService { @Reference(version = "1.0.0", group = "product-group", check = false, timeout = 5000) private ProductDubboService productDubboService; public OrderDTO createOrder(Long productId, Integer quantity) { // 调用远程服务 ProductDTO product = productDubboService.getProduct(productId); if (product.getStock() < quantity) { throw new InsufficientStockException("Stock not enough"); } // 创建订单逻辑 Order order = createOrderEntity(product, quantity); return orderMapper.toDTO(order); } }

四、服务治理

4.1 负载均衡

@Reference(version = "1.0.0", loadbalance = "roundrobin") // 可选值: random, roundrobin, leastactive, consistenthash @Reference(version = "1.0.0", methods = { @Method(name = "getProduct", loadbalance = "roundrobin"), @Method(name = "listProducts", loadbalance = "random") })

4.2 超时与重试

dubbo: consumer: timeout: 5000 retries: 0 provider: timeout: 3000 retries: 0 # 方法级别配置 @Reference(version = "1.0.0", methods = { @Method(name = "getProduct", timeout = 3000), @Method(name = "createProduct", timeout = 5000, retries = 0) })

4.3 集群容错

@Reference(version = "1.0.0", cluster = "failover", retries = 2) // 集群策略: // - failover: 失败自动切换 // - failback: 失败自动恢复 // - failsafe: 失败安全 // - failfast: 快速失败 // - forking: 并行调用多个服务器

4.4 限流降级

@Reference(version = "1.0.0", actives = 200, // 最大并发调用数 executes = 100) // 服务提供者每服务最大并发

五、扩展点

5.1 Filter扩展

@Activate(group = Constants.PROVIDER) @Component @Slf4j public class DubboTraceFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { String traceId = RpcContext.getContext().getAttachment("traceId"); if (traceId == null) { traceId = UUID.randomUUID().toString(); } long startTime = System.currentTimeMillis(); try { Result result = invoker.invoke(invocation); long duration = System.currentTimeMillis() - startTime; log.info("Dubbo call: service={}, method={}, duration={}ms", invoker.getInterface().getName(), invocation.getMethodName(), duration); return result; } catch (Exception e) { log.error("Dubbo call failed", e); throw e; } } }

5.2 自定义负载均衡

public class CustomLoadBalance implements LoadBalance { @Override @SuppressWarnings("unchecked") public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) { if (invokers == null || invokers.isEmpty()) { return null; } if (invokers.size() == 1) { return invokers.get(0); } // 自定义负载均衡逻辑 return invokers.get(new Random().nextInt(invokers.size())); } }

六、总结

Dubbo作为高性能RPC框架,提供了丰富的服务治理能力,包括负载均衡、集群容错、限流降级等。与Nacos的深度集成使得服务发现和配置更加便捷,是构建高性能微服务系统的优秀选择。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询