Yudao 框架增强能力
核心定位
一句話說清楚:在 Yudao 原生能力之上,RuoYiPlus 對框架基礎設施進行了 8 大維度的企業級增強,讓框架具備「開箱即用」的生產級能力。
解決什麼問題
| 痛點 | Yudao 原生 | RuoYiPlus 增強後 |
|---|---|---|
| 資料許可權不夠細 | 僅部門級過濾 | 使用者/角色/崗位/部門四層 + 欄位級 |
| 敏感資訊洩露風險 | 無脫敏機制 | 註解式自動脫敏 |
| 操作日誌不完整 | 基礎日誌 | 智慧變更追蹤 + 風險評分 + 區塊鏈存證 |
| API 缺乏保護 | 基礎路由 | 請求籤名 + 限流 + 熔斷 |
| 分散式能力弱 | 無 | 分散式事務 + 鎖 + 冪等 |
| 快取策略單一 | Redis 單層 | Caffeine + Redis 多級快取 |
| 資料庫擴充套件難 | 單庫 | 讀寫分離 + 分庫分表 + 資料歸檔 |
| 監控能力弱 | 無 | SkyWalking 全鏈路追蹤 + 自定義指標 |
適合什麼樣的使用者
mindmap
root((適合使用者))
軟體廠商
需要授權管理
需要商業化基礎設施
企業 IT 團隊
需要安全合規
需要多租戶隔離
系統整合商
需要快速交付
需要模組化組裝
SaaS 運營商
需要多租戶架構
需要計費體系
1. 資料許可權引擎
1.1 四層許可權模型
graph LR
subgraph "許可權來源"
F["使用者許可權
優先順序最高"] G["角色許可權"] H["崗位許可權"] I["部門許可權
優先順序最低"] F ~~~ G ~~~ H ~~~ I end subgraph "許可權決策引擎" A["使用者請求"] --> B["許可權解析"] B --> C["許可權合併"] C --> D["資料過濾"] D --> E["等級過濾"] end subgraph "許可權過濾" J["SQL 過濾"] --> K["返回結果"] end 許可權來源 --> 許可權決策引擎 許可權決策引擎 --> 許可權過濾 style B fill:#FFA500,color:#fff,font-weight:bold
優先順序最高"] G["角色許可權"] H["崗位許可權"] I["部門許可權
優先順序最低"] F ~~~ G ~~~ H ~~~ I end subgraph "許可權決策引擎" A["使用者請求"] --> B["許可權解析"] B --> C["許可權合併"] C --> D["資料過濾"] D --> E["等級過濾"] end subgraph "許可權過濾" J["SQL 過濾"] --> K["返回結果"] end 許可權來源 --> 許可權決策引擎 許可權決策引擎 --> 許可權過濾 style B fill:#FFA500,color:#fff,font-weight:bold
1.2 能力對比
| 能力項 | 原生支援 | 增強後 |
|---|---|---|
| 部門級資料過濾 | ✅ | ✅ |
| 角色級資料過濾 | ❌ | ✅ |
| 自定義 SQL 過濾 | ❌ | ✅ |
| 欄位級許可權控制 | ❌ | ✅ |
| 動態資料許可權規則 | ❌ | ✅ |
| 客戶等級過濾 | ❌ | ✅ |
1.3 使用方式
// 基於角色的資料許可權:銷售經理看團隊資料,區域總監看本區域資料
@DataPermission(roles = {"sales_manager", "region_director"})
public class CustomerServiceImpl { }
// 基於部門的層級許可權
@DataPermission(deptIds = "#{currentUser.deptId}")
public class ReportService { }
// 自定義資料範圍
@DataPermission(scope = "custom", sqlFilter = "region_id = #{currentUser.regionId}")
public class RegionService { }
// 欄位隱藏
@DataPermission(fields = {"salary", "bankCard"}, operation = DataPermission.Operation.HIDE)
public class EmployeeService { }
// 欄位只讀
@DataPermission(fields = {"createTime", "creator"}, operation = DataPermission.Operation.READONLY)
public class OrderService { }
2. 敏感欄位脫敏
2.1 脫敏架構
graph LR
A["資料查詢"] --> B["脫敏規則匹配"]
B --> C["欄位型別識別"]
C --> D["脫敏演算法應用"]
D --> E["返回脫敏結果"]
2.2 支援的脫敏型別
| 脫敏型別 | 示例 | 說明 |
|---|---|---|
| 手機號 | 138****1234 | 中間4位脫敏 |
| 郵箱 | a***@163.com | 使用者名稱脫敏 |
| 身份證 | 310***********1234 | 出生日期+後4位脫敏 |
| 銀行卡 | **** **** **** 1234 | 僅保留後4位 |
| 姓名 | 張* | 姓氏外脫敏 |
| 地址 | 上海市徐彙區**** | 詳細地址脫敏 |
| 密碼 | ****** | 完全脫敏 |
2.3 使用方式
// 註解式脫敏
public class Customer {
@SensitiveField(type = SensitiveType.PHONE)
private String phone;
@SensitiveField(type = SensitiveType.EMAIL)
private String email;
@SensitiveField(type = SensitiveType.ID_CARD)
private String idCard;
}
// 查詢時自動脫敏
@SensitiveQuery(fields = {"phone", "email"})
public List<Customer> getCustomerList(CustomerQuery query) { }
3. 操作日誌中心
3.1 日誌體系
graph TB
subgraph "日誌採集"
A["操作行為"]
B["登入事件"]
C["API 呼叫"]
end
subgraph "日誌處理"
D["日誌解析"]
E["變更對比"]
F["風險評分"]
end
subgraph "日誌儲存"
G["熱資料儲存"]
H["冷資料歸檔"]
I["區塊鏈存證"]
end
A --> D
B --> D
C --> D
D --> E
E --> F
F --> G
F --> H
F --> I
3.2 智慧變更追蹤
// 自動對比修改前後差異,僅記錄變更欄位
@OperateLog(title = "客戶管理", businessType = BusinessType.UPDATE)
public void updateCustomer(Customer customer) { }
3.3 敏感操作告警
aegis:
audit:
alert-rules:
- event: "資料匯出"
threshold: 10 # 10分鐘內超過10次
action: "notify_admin"
- event: "批次刪除"
action: "require_approval"
4. API 閘道器增強
4.1 閘道器架構
graph LR
A["客戶端請求"] --> B["API 閘道器"]
B --> C["請求籤名驗證"]
C --> D["流量控制"]
D --> E["熔斷降級"]
E --> F["請求快取"]
F --> G["協議轉換"]
G --> H["後端服務"]
4.2 增強特性
| 能力項 | 說明 |
|---|---|
| 請求籤名 | API 請求籤名驗證,防篡改 |
| 流量控制 | 多維度限流策略 |
| 熔斷降級 | 服務熔斷保護 |
| 請求快取 | API 響應快取 |
| 協議轉換 | SOAP → REST 轉換 |
5. 服務治理能力
5.1 分散式事務
基於 Seata 的分散式事務解決方案:
graph TB
A["業務請求"] --> B["事務發起方"]
B --> C["Seata TC"]
C --> D["分支事務1"]
C --> E["分支事務2"]
C --> F["分支事務3"]
D --> G["全域性提交/回滾"]
E --> G
F --> G
5.2 分散式鎖與冪等
// Redis + Redisson 分散式鎖
@DistributedLock(key = "order:lock:", waitTime = 30, leaseTime = 60)
public void processOrder(Order order) { }
// 冪等控制
@Idempotent(key = "order:create:{userId}:{productId}", expireTime = 60)
public Order createOrder(CreateOrderRequest request) { }
6. 快取增強
6.1 多級快取架構
graph LR
A["應用請求"] --> B["L1 Caffeine"]
B --> C["L2 Redis"]
C --> D["資料庫"]
D --> C
C --> B
B --> A
6.2 註解式快取
@Cacheable(name = "user:list:", expire = 300)
public List<User> getUserList() { }
@CacheEvict(name = "user:list:")
public void updateUser(User user) { }
@CachePut(name = "user:{id}")
public User getUser(Long id) { }
7. 資料庫增強
graph LR
A["寫請求"] --> B["主庫"]
C["讀請求"] --> D["從庫"]
B --> E["資料同步"]
E --> D
| 能力 | 說明 |
|---|---|
| 讀寫分離 | 自動路由讀寫請求,dynamic-datasource |
| 分庫分表 | ShardingSphere 分片策略 |
| 資料歸檔 | 自動冷熱資料分離,定時歸檔 |
8. 監控增強
graph TB
A["客戶端"] --> B["閘道器"]
B --> C["服務1"]
C --> D["服務2"]
D --> E["服務3"]
E --> F["資料庫"]
G["SkyWalking"] -.-> B
G -.-> C
G -.-> D
G -.-> E
- 全鏈路追蹤:整合 SkyWalking 分散式追蹤
- 自定義指標:
@CustomMonitor註解自動記錄 - 告警規則:支援多級閾值告警
技術架構總覽
graph TB
subgraph "RuoYiPlus 框架增強層"
P1["資料許可權引擎
四層許可權+欄位級"] P2["敏感欄位脫敏
註解式自動脫敏"] P3["操作日誌中心
變更追蹤+區塊鏈存證"] P4["API 閘道器
簽名+限流+熔斷"] P5["服務治理
分散式事務+鎖+冪等"] P6["多級快取
Caffeine+Redis"] P7["資料庫增強
讀寫分離+分庫分表"] P8["全鏈路監控
SkyWalking+自定義指標"] end subgraph "Yudao Framework Core" CORE["Spring Boot 3 + MyBatis-Plus + Redis"] end P1 --> CORE P2 --> CORE P3 --> CORE P4 --> CORE P5 --> CORE P6 --> CORE P7 --> CORE P8 --> CORE
四層許可權+欄位級"] P2["敏感欄位脫敏
註解式自動脫敏"] P3["操作日誌中心
變更追蹤+區塊鏈存證"] P4["API 閘道器
簽名+限流+熔斷"] P5["服務治理
分散式事務+鎖+冪等"] P6["多級快取
Caffeine+Redis"] P7["資料庫增強
讀寫分離+分庫分表"] P8["全鏈路監控
SkyWalking+自定義指標"] end subgraph "Yudao Framework Core" CORE["Spring Boot 3 + MyBatis-Plus + Redis"] end P1 --> CORE P2 --> CORE P3 --> CORE P4 --> CORE P5 --> CORE P6 --> CORE P7 --> CORE P8 --> CORE