当前位置: 首页 > news >正文

混合架构(SpringCloud+Dubbo)的整合方案与适用场景(二)

二、混合架构(SpringCloud+Dubbo)整合方案(实战落地)

2.1 核心整合思路:“分工明确,优势互补”

通过分层架构设计,让 SpringCloud 负责 “宏观治理”,Dubbo 负责 “微观性能”:

  • SpringCloud 层:承担网关路由(Gateway)、配置中心(Nacos Config)、分布式追踪(Sleuth+SkyWalking)、全局限流(Sentinel)、服务注册发现(Nacos)等 “基础设施” 功能。

  • Dubbo 层:聚焦核心业务服务(如订单、支付、库存)的 RPC 调用,提供高性能通信与细粒度服务治理(如负载均衡、容错)。

  • 通信桥接:通过 Nacos 实现服务元数据统一管理,SpringCloud 服务与 Dubbo 服务可双向调用(SpringCloud 通过@Reference调用 Dubbo 服务,Dubbo 通过RestTemplate调用 SpringCloud 服务)。

2.2 整合架构图

在这里插入图片描述

2.3 分步整合实战(附完整代码)

前提条件
  • 环境准备:Nacos Server 2.2.0(下载地址:https://github.com/alibaba/nacos/releases),启动命令:sh ``startup.sh`` -m standalone

  • 技术版本:Spring Boot 2.7.10,Spring Cloud Alibaba 2021.0.5.0,Dubbo 3.2.0

步骤 1:统一依赖管理(父 POM)
\<parent>\<groupId>org.springframework.boot\</groupId>\<artifactId>spring-boot-starter-parent\</artifactId>\<version>2.7.10\</version>\<relativePath/>\</parent>\<dependencyManagement>\<dependencies>\<!-- Spring Cloud Alibaba 依赖管理 -->\<dependency>\<groupId>com.alibaba.cloud\</groupId>\<artifactId>spring-cloud-alibaba-dependencies\</artifactId>\<version>2021.0.5.0\</version>\<type>pom\</type>\<scope>import\</scope>\</dependency>\<!-- Dubbo 依赖管理 -->\<dependency>\<groupId>org.apache.dubbo\</groupId>\<artifactId>dubbo-dependencies-bom\</artifactId>\<version>3.2.0\</version>\<type>pom\</type>\<scope>import\</scope>\</dependency>\</dependencies>\</dependencyManagement>
步骤 2:开发 Dubbo 核心服务(以订单服务为例)
2.2.1 定义 Dubbo 服务接口(公共模块)
// 公共接口模块:dubbo-apipublic interface OrderService {/\*\*\* 创建订单\* @param orderId 订单ID\* @param userId 用户ID\* @param productIds 商品ID列表\* @return 订单创建结果\*/OrderResult createOrder(String orderId, String userId, List\<String> productIds);}// 订单结果模型@Datapublic class OrderResult implements Serializable {private String orderId;private Boolean success;private String message;}
2.2.2 实现 Dubbo 服务提供者
  1. 依赖配置(pom.xml)
\<dependencies>\<!-- Spring Boot 基础 -->\<dependency>\<groupId>org.springframework.boot\</groupId>\<artifactId>spring-boot-starter\</artifactId>\</dependency>\<!-- Dubbo + Spring Boot 整合 -->\<dependency>\<groupId>org.apache.dubbo\</groupId>\<artifactId>dubbo-spring-boot-starter\</artifactId>\</dependency>\<!-- Dubbo + Nacos 注册中心 -->\<dependency>\<groupId>org.apache.dubbo\</groupId>\<artifactId>dubbo-registry-nacos\</artifactId>\</dependency>\<!-- 公共接口模块 -->\<dependency>\<groupId>com.example\</groupId>\<artifactId>dubbo-api\</artifactId>\<version>1.0.0\</version>\</dependency>\<!-- Sentinel 整合(容错限流) -->\<dependency>\<groupId>com.alibaba.csp\</groupId>\<artifactId>sentinel-apache-dubbo3-adapter\</artifactId>\<version>1.8.6\</version>\</dependency>\</dependencies>
  1. 配置文件(application.yml)
server:port: 8081 # 服务端口spring:application:name: dubbo-order-service # 服务名称(Nacos注册用)cloud:nacos:discovery:server-addr: 127.0.0.1:8848 # Nacos地址dubbo:application:name: dubbo-order-serviceprotocol:name: dubbo # 通信协议port: 20881 # Dubbo服务端口registry:address: nacos://127.0.0.1:8848 # 注册中心地址scan:base-packages: com.example.dubbo.service # Dubbo服务扫描路径consumer:check: false # 启动时不检查服务是否存在(避免依赖服务未启动导致报错)provider:filter: sentinel # 集成Sentinel过滤器(实现限流熔断)
  1. 服务实现类
@DubboService(version = "1.0.0", group = "order-service-group") // Dubbo服务注解public class OrderServiceImpl implements OrderService {// 调用Dubbo库存服务(本地RPC调用)@DubboReference(version = "1.0.0", group = "inventory-service-group")private InventoryService inventoryService;@Overridepublic OrderResult createOrder(String orderId, String userId, List\<String> productIds) {OrderResult result = new OrderResult();result.setOrderId(orderId);try {// 1. 调用库存服务扣减库存(Dubbo RPC调用)InventoryResult inventoryResult = inventoryService.deductStock(productIds, orderId);if (!inventoryResult.isSuccess()) {result.setSuccess(false);result.setMessage("库存不足:" + inventoryResult.getMessage());return result;}// 2. 模拟订单入库逻辑System.out.println("订单创建成功:" + orderId + ",用户:" + userId);result.setSuccess(true);result.setMessage("订单创建成功");} catch (Exception e) {result.setSuccess(false);result.setMessage("订单创建失败:" + e.getMessage());}return result;}}
  1. 启动类
@SpringBootApplication@EnableDubbo // 开启Dubbo服务自动配置public class DubboOrderServiceApplication {public static void main(String\[] args) {SpringApplication.run(DubboOrderServiceApplication.class, args);}}
步骤 3:开发 SpringCloud 周边服务(以用户服务为例)

2.3.1 服务实现(REST 接口)

  1. 配置文件(application.yml)
server:port: 8082 # SpringCloud用户服务端口spring:application:name: sc-user-service # 服务名称(Nacos注册用)cloud:nacos:discovery:server-addr: 127.0.0.1:8848 # 接入Nacos注册中心\# 集成Sleuth实现分布式追踪sleuth:sampler:probability: 1.0 # 采样率100%(生产环境可设0.1)\# 配置SkyWalking(需先启动SkyWalking OAP服务)skywalking:agent:service-name: sc-user-serviceoap-server:urls: http://127.0.0.1:12800\# Dubbo客户端配置(调用Dubbo服务)dubbo:application:name: sc-user-service-consumerregistry:address: nacos://127.0.0.1:8848 # 与Dubbo服务共用注册中心consumer:timeout: 3000 # 调用超时时间(避免RPC调用卡顿)retries: 1 # 重试次数(核心服务建议重试1次,非核心0次)
  1. 服务实现类(调用 Dubbo 订单服务)
@Servicepublic class UserOrderService {// 注入Dubbo订单服务(通过@DubboReference注解)@DubboReference(version = "1.0.0",group = "order-service-group",cluster = "failfast", // 集群容错策略:快速失败(失败后不重试)loadbalance = "leastactive" // 负载均衡:最少活跃调用数(优先分配给压力小的实例))private OrderService dubboOrderService;/\*\*\* 用户创建订单(SpringCloud服务调用Dubbo服务)\* @param userId 用户ID\* @param productIds 商品ID列表\* @return 订单创建结果\*/public OrderResult createUserOrder(String userId, List\<String> productIds) {// 生成唯一订单ID(雪花算法)String orderId = IdUtil.getSnowflake().nextIdStr();try {// 调用Dubbo订单服务创建订单return dubboOrderService.createOrder(orderId, userId, productIds);} catch (DubboException e) {// 捕获Dubbo调用异常(如服务不可用、超时等)log.error("Dubbo order service call failed, userId: {}, orderId: {}", userId, orderId, e);OrderResult failResult = new OrderResult();failResult.setOrderId(orderId);failResult.setSuccess(false);failResult.setMessage("订单创建失败,请稍后重试");return failResult;}}}
  1. REST 接口控制器
@RestController@RequestMapping("/api/user")public class UserController {@Autowiredprivate UserOrderService userOrderService;/\*\*\* 前端调用接口:用户创建订单\* @param userId 用户ID\* @param productIds 商品ID(多个用逗号分隔,如"prod1,prod2")\* @return 订单结果\*/@PostMapping("/order")public ResponseEntity\<OrderResult> createOrder(@RequestParam String userId,@RequestParam String productIds) {// 解析商品ID列表List\<String> productIdList = Arrays.asList(productIds.split(","));OrderResult result = userOrderService.createUserOrder(userId, productIdList);return ResponseEntity.ok(result);}/\*\*\* 提供给Dubbo服务调用的接口(获取用户等级)\* @param userId 用户ID\* @return 用户等级(如VIP1、VIP2)\*/@GetMapping("/level/{userId}")public String getUserLevel(@PathVariable String userId) {// 模拟数据库查询用户等级(实际项目需对接用户中心)return userId.startsWith("VIP") ? "VIP2" : "普通用户";}}
  1. 启动类
@SpringBootApplication@EnableDiscoveryClient // 开启SpringCloud服务注册发现@EnableDubbo // 开启Dubbo客户端功能(用于调用Dubbo服务)public class ScUserServiceApplication {public static void main(String\[] args) {SpringApplication.run(ScUserServiceApplication.class, args);}// 配置RestTemplate(用于Dubbo服务调用SpringCloud接口)@Bean@LoadBalanced // 开启负载均衡(调用SpringCloud服务时自动分发请求)public RestTemplate restTemplate() {return new RestTemplate();}}
步骤 4:配置 SpringCloud Gateway(统一网关)

网关作为混合架构的入口,负责路由转发、鉴权、限流等功能,需同时支持 SpringCloud 和 Dubbo 服务的接入。

  1. 依赖配置(pom.xml)
\<dependencies>\<!-- SpringCloud Gateway -->\<dependency>\<groupId>org.springframework.cloud\</groupId>\<artifactId>spring-cloud-starter-gateway\</artifactId>\</dependency>\<!-- Nacos服务发现(网关需感知所有服务) -->\<dependency>\<groupId>com.alibaba.cloud\</groupId>\<artifactId>spring-cloud-starter-alibaba-nacos-discovery\</artifactId>\</dependency>\<!-- Sentinel网关限流 -->\<dependency>\<groupId>com.alibaba.cloud\</groupId>\<artifactId>spring-cloud-alibaba-sentinel-gateway\</artifactId>\</dependency>\</dependencies>
  1. 网关配置(application.yml)
server:port: 8080 # 网关端口(对外暴露)spring:application:name: sc-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:\# 路由规则配置routes:\# 1. 路由至SpringCloud用户服务\- id: route-sc-useruri: lb://sc-user-service # lb=负载均衡,指向SpringCloud服务名predicates:\- Path=/api/user/\*\* # 匹配路径filters:\- StripPrefix=1 # 移除路径前缀(/api/user/order → /user/order)\- name: Sentinel # 限流过滤器args:resource: route-sc-user # 限流资源名limitApp: default # 限制来源(default=所有来源)grade: 1 # 限流维度(1=QPS,0=线程数)count: 100 # QPS阈值(每秒最多100请求)\# 2. 路由至Dubbo订单服务(通过代理层)\- id: route-dubbo-orderuri: lb://dubbo-order-servicepredicates:\- Path=/api/order/\*\*filters:\- StripPrefix=1\- name: Sentinelargs:resource: route-dubbo-ordercount: 200 # Dubbo服务性能更高,阈值设更高sentinel:transport:dashboard: 127.0.0.1:8080 # Sentinel控制台地址
  1. 启动类
@SpringBootApplication@EnableDiscoveryClientpublic class ScGatewayApplication {public static void main(String\[] args) {SpringApplication.run(ScGatewayApplication.class, args);}}
步骤 5:双向调用时序图(Mermaid 可视化)
5.1 SpringCloud 服务调用 Dubbo 服务
ClientGatewaySC_UserNacosDubbo_OrderDubbo_InventoryNacosPOST /api/user/order?userId=1&productIds=prod1,prod2询问sc-user-service实例地址返回SC用户服务地址(127.0.0.1:8082)转发请求询问dubbo-order-service(group=order-service-group)地址返回Dubbo订单服务地址(127.0.0.1:20881)Dubbo RPC调用 createOrder(orderId, userId, productIds)询问dubbo-inventory-service地址返回库存服务地址(127.0.0.1:20882)RPC调用 deductStock(productIds, orderId)返回库存扣减结果(成功/失败)返回订单创建结果返回JSON结果返回响应(订单ID+状态)ClientGatewaySC_UserNacosDubbo_OrderDubbo_InventoryNacos
5.2 Dubbo 服务调用 SpringCloud 服务
Dubbo_OrderNacosSC_UserDubbo_OrderNacos询问sc-user-service地址(SpringCloud服务)返回SC用户服务地址列表(8082、8083)HTTP GET /user/level/1(通过RestTemplate+负载均衡)返回用户等级(VIP2)根据用户等级计算折扣(VIP2享9折)Dubbo_OrderNacosSC_UserDubbo_OrderNacos
http://www.dtcms.com/a/389265.html

相关文章:

  • centos的hadoop的允许hdfs命令覆盖linux系统目录文件或生成副本
  • 跨平台开发框架全景分析:Flutter、RN、KMM 与腾讯 Kuikly 谁更值得选择?
  • 燃料电池负载均衡测试:解锁高效供能密码
  • ip地址在哪里查看?怎样查询自己电脑ip?如何找到使用内网ip,判断看本地有无公网ip?内网ip怎么给外网访问?
  • 设计模式-模板方法模式详解
  • Red Hat 8.5.0-18 部署ceph文件系统
  • 将ceph文件存储挂载给k8s使用
  • ENVI系列教程(七)——自定义 RPC 文件图像正射校正
  • 「Java EE开发指南」如何用MyEclipse开发Java EE企业应用程序?(二)
  • Linux -- 传输层协议UDP
  • 使用Android Studio中自带的手机投屏功能
  • LeetCode:19.螺旋矩阵
  • Windows 命令行:在 cd 命令中使用绝对路径与相对路径
  • 图片修改尺寸
  • 《嵌入式硬件(十五):基于IMX6ULL的统一异步收发器(UART)的操作》
  • Python爬虫实战:研究Pandas,构建苏宁易购月饼销售数据采集与智能推荐系统
  • 导购app佣金模式的分布式计算架构:实时分账与财务对账
  • Linux Bash脚本自动创建keystore和生成公钥
  • 数据库管理员偏爱哪些MySQL数据库连接工具?
  • 大数据毕业设计选题推荐-基于大数据的农产品交易数据分析与可视化系统-Spark-Hadoop-Bigdata
  • MySQL C API 的“连接孵化器”-`mysql_init()`
  • oracle 数据库导入dmp文件
  • 第二部分:VTK核心类详解(第28章 vtkMatrix4x4矩阵类)
  • JDK、JRE、JVM 是什么?有什么关系?【Java】
  • Visual Studio 2022创建CPP项目
  • Nginx反向代理+负载均衡
  • React Suspense底层原理揭秘
  • 关于pycharm高版本导入torch的问题
  • 【硬件研讨】【笔记本电脑】给老ThinkPad升级内存
  • 论文Review 3DGS SuGaR | CVPR 2024 | 3DGS 转 Mesh 开源方案!!