Files
aiot-platform-cloud/docs/technical-overview/04-技术架构设计.md

146 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Part 4: 技术架构设计
> **文档定位**:深入剖析系统关键技术组件的选型策略、实现原理及落地实践,为解决高并发、分布式一致性等复杂工程问题提供标准方案。
## 4.1 服务治理体系 (Service Governance)
基于 **Alibaba Nacos 2.x** 构建统一的注册中心与配置中心,解决微服务架构下的服务发现与配置管理难题。
### 4.1.1 动态配置管理
* **设计原则**:配置即代码,环境隔离。
* **命名空间 (Namespace)**严格按照环境划分Dev/Test/Prod确保环境间配置物理隔离。
* **配置共享**
* **通用配置**`application-common.yaml`Redis、MyBatis Plus、Swagger 等基础中间件配置)。
* **应用配置**`viewsh-module-{app}-{profile}.yaml`(业务专属配置)。
* **热更新机制**:基于 Spring Cloud `@RefreshScope` 注解,实现日志级别调整、限流阈值变更等场景的**零停机动态刷新**。
### 4.1.2 服务注册与发现
* **领域模型隔离**:微服务实例启动时自动注册至 Nacos通过 `Group` 区分子略(如 `DEFAULT_GROUP`支持基于元数据Metadata的版本灰度路由。
* **健康检查**:开启 Nacos 临时实例模式Ephemeral=true基于心跳机制5s/次)自动剔除亚健康实例。
---
## 4.2 异步消息体系 (Messaging Architecture)
采用 **Apache RocketMQ 5.x** 作为核心消息总线,承担**削峰填谷**与**领域解耦**重任。
### 4.2.1 Topic 规划设计
遵循“业务域.类型.动作”的命名规范:
* **IoT 遥测数据**`IOT_DEVICE_UP` (Tag: `Telemetry`, `Event`)
* *特征*:高吞吐,允许少量丢失,使用普通消息。
* **业务状态变更**`OPS_WORK_ORDER` (Tag: `Create`, `Complete`)
* *特征*:低延迟,强一致性,使用事务消息或同步重试机制。
### 4.2.2 可靠性保证
1. **生产端**开启同步发送模式Sync Send配置重试次数 `retryTimesWhenSendFailed=2`
```java
// 消息发送示例
@Resource
private RocketMQTemplate rocketMQTemplate;
public void sendDeviceEvent(DeviceEvent event) {
// 构建消息
Message<DeviceEvent> message = MessageBuilder.withPayload(event)
.setHeader(RocketMQHeaders.KEYS, event.getEventId()) // 设置 Key 方便检索
.build();
// 同步发送,等待结果
SendResult result = rocketMQTemplate.syncSend("IOT_DEVICE_UP:Telemetry", message);
log.info("Send result: {}", result.getSendStatus());
}
```
2. **消费端**
* **幂等处理**:在消费者业务逻辑中必须校验 `BizKey`如工单号、消息ID是否已处理。
* **死信队列 (DLQ)**:消费失败重试 16 次后自动进入 DLQ需人工介入排查。
---
## 4.3 高并发防护 (System Resilience)
引入 **Sentinel** 实现全方位的流量控制与熔断降级。
### 4.3.1 网关层防护
* **流量清洗**:针对 API Gateway 设置集群限流规则Cluster Flow Control限制单 IP 或单用户的 QPS防止恶意刷接口。
* **热点参数限流**:针对 SKU ID、Device ID 等热点参数配置特例化限流规则。
### 4.3.2 服务层熔断
* **微服务调用**Feign Client 集成 Sentinel 熔断器,当调用错误率超过 50% 或响应时间 > 1s 时自动熔断,快速失败,防止雪崩效应。
**配置示例 (bootstrap.yaml)**
```yaml
feign:
sentinel:
enabled: true # 开启 Feign Sentinel 支持
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
scg:
fallback:
mode: response
response-body: '{"code": 429, "msg": "服务繁忙,请稍后重试"}'
```
* **降级策略**:核心业务(如登录)必须配置 `fallback` 降级逻辑,返回友好的兜底数据。
---
## 4.4 分布式锁与幂等性 (Distributed Lock & Idempotency)
针对分布式环境下的并发竞争问题,提供标准化的解决方案组件。
### 4.4.1 分布式锁 (`Lock4j`)
集成 `Lock4j` 框架,基于 **Redis (Redisson)** 实现。
**使用示例**
```java
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
// 锁住 orderId防止并发修改
// expire: 锁过期时间 60s
// acquireTimeout: 获取锁超时时间 1s
@Lock4j(keys = {"#orderId"}, expire = 60000, acquireTimeout = 1000)
public void updateOrderStatus(Long orderId, String status) {
OrderDO order = orderMapper.selectById(orderId);
if (order == null) {
throw new BusinessException("订单不存在");
}
order.setStatus(status);
orderMapper.updateById(order);
}
}
```
* **看门狗机制**对于长耗时业务Redisson Watchdog 自动续期锁过期时间,防止业务未执行完锁被释放。
* **应用场景**:定时任务防重、库存扣减、设备指令下发。
### 4.4.2 幂等性组件 (`@Idempotent`)
自研幂等性切面 `com.viewsh.framework.idempotent`。
* **实现原理**
1. **Key 生成**:支持多种策略,包括 HTTP Header 值、SpEL 表达式、请求参数 MD5。
2. **原子操作**:利用 Redis `setNX` 指令占位,设置较短的过期时间(默认 1s
3. **异常处理**:重复请求直接抛出 `IdempotentException`,全局异常处理器统一拦截返回 `429 Too Many Requests`。
* **应用场景**:表单重复提交、支付回调接口。
---
## 4.5 数据一致性设计 (Data Consistency)
### 4.5.1 最终一致性 (Saga/MQ)
绝大多数业务场景采用基于 MQ 的最终一致性方案。
* **本地事务表**:核心业务(如工单)执行本地事务时,记录“待发送消息”至本地表。
* **异步投递**:通过定时任务扫描本地表,投递至 MQ确保消息不丢失。
* **消费确认**:下游服务消费成功后,回调更新状态。
### 4.5.2 强一致性 (Seata)
对于资金转账等极其敏感的跨库场景,预留 **Seata AT** 模式支持。
* *注*当前核心业务流IoT设备上报、Ops工单流转设计上规避了强一致性需求优先保障高可用与吞吐量。