Dubbo RPC通信实战

Dubbo RPC通信实战 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 groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version3.2.0/version /dependency2.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); ListProductDTO 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 ListProductDTO listProducts(int page, int size) { Pageable pageable PageRequest.of(page, size); PageProduct 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 InvokerT select(ListInvokerT 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的深度集成使得服务发现和配置更加便捷是构建高性能微服务系统的优秀选择。