基于 Spring Cloud Gateway + Sentinel 實現高并發限流保護機制

基于 Spring Cloud Gateway + Sentinel 實現視頻播放接口限流保護機制

作者:NovaTube 開發者 | 時間:2025-06
標簽:Spring Cloud Gateway、Sentinel、微服務、限流、接口保護


一、背景介紹

在我們開發的在線視頻分享平臺 NovaTube 中,用戶可以上傳、播放、點贊、彈幕、投幣等操作,其中 視頻播放接口心跳上報接口 是高頻訪問的核心接口,尤其在熱門視頻爆發流量時,這些接口成為系統性能瓶頸。

這類接口常與 Redis 實時計數器 緊密耦合,如果沒有限流保護,很容易造成:

  • Redis 寫入/續期壓力暴增
  • 計數不準或丟失
  • 系統雪崩或連鎖故障

為此,我們引入了 Spring Cloud Gateway + Alibaba Sentinel 的限流機制,對核心接口進行細粒度保護,顯著提升了系統在高并發場景下的穩定性。


二、系統架構演進圖

         ┌────────────┐│   Client   │└────┬───────┘│┌───────▼────────┐│ SpringCloud Gateway │  ? 【新增:Sentinel限流】└───────┬────────┘│┌───────▼────────────┐│ Video Play Service │  ? 視頻播放/心跳接口└────────────────────┘│┌───────▼────────┐│     Redis      │  ? 實時在線人數統計└────────────────┘

三、核心需求

  • ? 限制單位時間內的訪問頻率,防止突發流量沖擊
  • ? 對不同接口設置不同的限流策略(如 QPS、線程數)
  • ? 對不同用戶/設備實現細粒度限流
  • ? 降級策略支持熔斷、快速失敗等

四、技術選型

技術說明
Spring Cloud Gateway微服務統一入口網關,支持路由、認證、攔截、過濾
Alibaba Sentinel流控 + 熔斷 + 降級中間件,兼容網關流量控制

五、詳細實現步驟

1. 引入依賴(pom.xml)

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

2. Gateway 限流配置(application.yml)

spring:cloud:gateway:routes:- id: play_routeuri: lb://video-play-servicepredicates:- Path=/api/video/play/**filters:- name: RequestRateLimiterargs:key-resolver: "#{@ipKeyResolver}"redis-rate-limiter.replenishRate: 20  # 每秒生成20個令牌redis-rate-limiter.burstCapacity: 40  # 最大突發請求數

3. IP Key Resolver 限流維度配置

@Bean
@Primary
public KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}

4. Sentinel 限流控制(視頻播放接口)

我們對 /api/video/play/heartbeat 接口配置限流規則:

@PostConstruct
public void initSentinelRules() {FlowRule rule = new FlowRule();rule.setResource("/api/video/play/heartbeat");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(50); // QPS限制為50FlowRuleManager.loadRules(Collections.singletonList(rule));
}

也可通過控制臺動態配置,支持實時變更。


5. 降級處理(快速失敗返回)

@RestController
public class FallbackController {@RequestMapping("/fallback/video")public String videoFallback() {return "系統繁忙,請稍后重試。";}
}

并在 Gateway 中配置 fallback 路由:

filters:- name: CircuitBreakerargs:name: videoCBfallbackUri: forward:/fallback/video

六、實際效果

? 測試效果:

  • 模擬 1000+ 用戶并發播放請求
  • 限流前:Redis TPS 超過 10W/s,部分請求失敗
  • 限流后:系統平穩運行,無 Redis 異常,限流日志可查

? 結果總結:

項目限流前限流后
Redis 寫入 QPS>10w~5w
系統響應時間500ms+平均 180ms
請求成功率85%>98%
異常報警次數高頻幾乎無

七、總結與思考

在高并發場景下,僅靠緩存和數據庫支撐遠遠不夠。引入 網關級限流 + Sentinel 限流降級機制,為 NovaTube 系統加裝了 “安全氣囊”,有效防止核心服務在高壓下失效。

后續優化方向:

  • 按用戶 ID / Token 限流,更精細化
  • 接入 DashBoard 實時動態變更限流規則
  • 配合 Grafana 實現監控預警

八、參考配置開源地址

可參考官方文檔:

  • Sentinel 官方文檔
  • Spring Cloud Gateway 限流指南

九、總結

  • 基于 Spring Cloud Gateway + Alibaba Sentinel 對高頻接口(如視頻播放與心跳上報)實現限流保護,有效防止 Redis 雪崩與系統崩潰,系統穩定性顯著提升,支持百萬級請求并發訪問。

最好對誰限流

NovaTube 在線視頻分享平臺 的場景中,限流的“最佳粒度”取決于希望保護 系統哪部分資源,目標是 防止濫用、高并發沖擊或熱點流量導致雪崩

業務維度、系統風險、實現復雜度 三方面來分析:


? 最推薦的限流維度:按設備 / 用戶 + 視頻 ID 限流(組合限流)

也就是說,對“某用戶在某視頻上的請求頻率”進行限流。

🎯 為什么這樣做最合理?

限流維度優勢適用場景
? 用戶/設備 + 視頻ID精準控制每個用戶對每個視頻的訪問頻率
防止刷流量、模擬心跳、惡意攻擊
心跳上報接口、播放請求接口、投幣等高頻操作
🚫 僅對接口限流過于粗糙,熱門視頻會影響冷門視頻導致誤傷其他正常請求
?? 僅對視頻ID限流會讓高并發用戶間“搶配額”,用戶體驗差不適合用戶量大的平臺
?? 僅對用戶限流同一用戶可以高頻刷多個視頻,視頻系統仍可能崩不能精確限制資源濫用

🛠 技術實現建議(基于 Spring Cloud Gateway + Redis + Sentinel)

? 推薦用法 1:Gateway + Redis 限流器 + 自定義 KeyResolver

@Bean
public KeyResolver userVideoKeyResolver() {return exchange -> {String videoId = exchange.getRequest().getQueryParams().getFirst("videoId");String userId = exchange.getRequest().getHeaders().getFirst("Authorization-UserId");return Mono.just(userId + ":" + videoId);};
}

YAML 配置中:

filters:- name: RequestRateLimiterargs:key-resolver: "#{@userVideoKeyResolver}"redis-rate-limiter.replenishRate: 5   # 每用戶對每個視頻每秒最多5次redis-rate-limiter.burstCapacity: 10

? 推薦用法 2:服務內部 Sentinel 手動限流(適合非網關限流)

String resourceKey = "videoPlay:" + userId + ":" + videoId;
try (Entry entry = SphU.entry(resourceKey)) {// 正常邏輯
} catch (BlockException e) {// 限流邏輯(返回提示或限流頁面)
}

? 限流維度設計建議總結

維度設計限流類型說明
用戶 + 視頻ID?推薦(精細化)精確控制單個用戶對單個視頻的訪問頻率
視頻ID??可選(防熱點)適用于突發大流量的視頻,防止Redis寫入量暴增
用戶ID??次選(防刷)防止某用戶頻繁發起請求,保護接口
接口級?不推薦粗粒度,誤傷大,性能浪費

🚦使用 Sentinel 實現基于設備 + 視頻維度的熱點參數限流 —— NovaTube 高并發場景下的穩定性優化實戰

在構建的在線視頻分享平臺 NovaTube 中,隨著平臺用戶數增長,視頻播放與心跳上報接口成為高頻調用的關鍵路徑,尤其在熱門視頻或刷流行為頻發時,可能對 Redis 與后端服務造成較大壓力。為此,我們引入了 Sentinel 熱點參數限流機制,按 設備 ID + 視頻 ID 的維度對高頻接口進行精細化控制。


📌 一、項目背景

在 NovaTube 中,客戶端每 5 秒上報一次視頻播放心跳數據至接口 /api/video/reportVideoPlayOnline,服務端通過 Redis 記錄用戶是否在線,并統計當前視頻的在線人數。

隨著用戶量增長,存在以下問題:

  • 熱點視頻過載: 熱門視頻訪問量集中,Redis 頻繁 setex/incr 可能造成瓶頸;
  • 刷流攻擊風險: 惡意設備頻繁上報心跳,刷流提升播放量;
  • 接口雪崩風險: 高并發壓垮接口,引發系統連鎖故障。

為應對這些問題,我們決定通過 Sentinel 進行熱點參數限流優化。


🎯 二、優化目標

我們希望:

  1. 對接口進行限流保護,避免 Redis 過載;
  2. 支持細粒度限流:按 deviceId + fileId 維度限流;
  3. 具備動態調控能力,支持線上實時調整限流策略;
  4. 兼容 Spring Cloud Gateway 網關架構

🛠? 三、技術選型

組件用途說明
Spring Cloud GatewayAPI 網關所有接口流量入口
Alibaba Sentinel流量防護框架支持熱點參數限流、熔斷、降級等功能
Redis實時數據統計存儲用戶在線狀態與視頻觀看人數

🧩 四、限流實現方案

我們使用 Sentinel 熱點參數限流(Hot Parameter Flow Control),其核心思路是:

  • 對請求參數(如 fileIddeviceId)進行統計;
  • 每個參數值設置 QPS 限制(例如,某個視頻最多 100 次/s);
  • 當達到閾值時自動拒絕請求,保護系統核心路徑。

? 示例接口定義

POST /api/video/reportVideoPlayOnline?fileId=abc123&deviceId=device001

?? 1. 添加依賴

在網關服務中添加 Sentinel Starter:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

🧱 2. 啟用 Sentinel Gateway 支持

spring:cloud:sentinel:transport:dashboard: localhost:8080gateway:enabled: true

🛣? 3. 配置 Gateway 路由

spring:cloud:gateway:routes:- id: video-heartbeaturi: lb://video-servicepredicates:- Path=/api/video/reportVideoPlayOnlinefilters:- name: SentinelGatewayFilter

🎮 4. 配置熱點參數限流規則

訪問 Sentinel 控制臺(默認 localhost:8080),配置如下規則:

  • 資源名稱/api/video/reportVideoPlayOnline

  • 參數索引:0 表示 fileId,1 表示 deviceId

  • 限流 QPS

    • fileId: 30 QPS
    • deviceId: 10 QPS
    • 支持組合限流(高階配置)

?? 5. 限流處理(業務服務中可選)

若希望自定義限流后的返回邏輯:

@SentinelResource(value = "reportVideoPlayOnline", blockHandler = "blockHandler")
public Integer reportVideoPlayOnline(String fileId, String deviceId) {// 原有邏輯略...
}public Integer blockHandler(String fileId, String deviceId, BlockException ex) {log.warn("限流觸發:fileId={}, deviceId={}", fileId, deviceId);return -1; // 或返回自定義限流提示
}

網關層的限流處理也可以通過 Sentinel 網關回調接口實現。


🧠 五、設計優勢

特性描述
? 精細化限流支持參數級限流,區分視頻和設備
? 實時可控Sentinel 控制臺支持動態規則修改
? 降壓保護防止 Redis 和后端接口被過載
? 拓展性強可結合熔斷、降級策略構建完整流控體系

🧪 六、實戰效果

  • 高峰期 Redis CPU 使用率降低 30%+
  • 單視頻刷流場景被有效攔截
  • 接口 99.9 分位響應時間降低至 30ms 內
  • 支持根據熱點視頻動態調整限流閾值

🔧 七、可擴展方向

  • 動態規則持久化到 Nacos,自動下發
  • 將熱點參數規則結合報警策略進行監控
  • 結合 IP 維度進一步精細限流
  • 配合 Bucket4j、RateLimiter 實現組合策略限流

📝 結語

通過 Sentinel 的熱點參數限流能力,我們成功對 NovaTube 中的關鍵高頻接口實現了穩定性加固,尤其是按 deviceId + fileId 的組合限流設計,既保護了系統,又不犧牲用戶體驗,是值得推薦的高并發防護方案。


好的,下面是一篇完整技術文檔,詳細介紹了在你的在線視頻播放系統中,如何使用 Sentinel 對單個參數進行限流,分別對視頻ID和設備ID限流的優勢、適用場景及示例配置。


基于 Sentinel 的單參數限流方案在在線視頻播放系統中的應用

1. 背景介紹

在在線視頻分享平臺中,視頻播放及心跳上報接口承載著極高的訪問壓力。為了防止熱點視頻或惡意設備刷接口,保護后端服務和緩存(如 Redis)不被壓垮,系統需要引入限流機制。

Sentinel 作為阿里巴巴開源的流量防護框架,支持基于接口和參數的細粒度限流。本文重點探討針對單個參數(視頻ID或設備ID)進行限流的設計方案及其優勢。


2. 單參數限流設計思路

單參數限流即只針對調用接口的某一個參數維度做QPS或線程數限制。常見的限流參數選項有:

  • 視頻ID(fileId)
  • 設備ID(deviceId)

2.1 為什么只對單參數限流?

  • Sentinel 熱點參數限流默認只支持單個參數(通過參數索引)配置,操作簡單易用。
  • 只針對最關鍵的熱點參數限流,既能有效防止系統過載,也避免限流規則過于復雜。
  • 便于規則維護和監控,降低運維成本。

3. 視頻ID限流方案

3.1 限流理由

  • 視頻為核心資源,熱點視頻訪問量巨大。
  • 針對視頻ID限流,能有效限制某個熱門視頻的接口調用頻率,防止集中流量沖擊。
  • 保護Redis和轉碼、存儲等下游服務資源,避免雪崩效應。

3.2 適用場景

  • 防止爆款視頻引發接口過載。
  • 限制單個視頻的最大并發訪問,保證服務整體可用性。
  • 支持運營策略,如對部分付費或高流量視頻限流。

3.3 Sentinel 配置示例

配置項說明
資源名reportPlayOnline
限流參數索引0 (假設接口第一個參數為 fileId)
限流閾值100 QPS(視服務器承載能力調整)

3.4 代碼示例

@SentinelResource(value = "reportPlayOnline", blockHandler = "handleBlock")
public Integer reportPlayOnline(String fileId, String deviceId) {// 業務處理邏輯return 1;
}public Integer handleBlock(String fileId, String deviceId, BlockException ex) {// 限流降級處理邏輯return -1;
}

4. 設備ID限流方案

4.1 限流理由

  • 設備代表唯一用戶終端,單設備發起大量請求可能為惡意刷接口行為。
  • 針對設備ID限流,能防止單個設備過度頻繁請求,保障系統整體穩定。
  • 有助于實現反刷機制,防止刷單、刷票等作弊行為。

4.2 適用場景

  • 防刷單:限制單設備的最大請求頻率。
  • 保護服務器免受異常設備請求攻擊。
  • 降低因異常設備產生的資源浪費。

4.3 Sentinel 配置示例

配置項說明
資源名reportPlayOnline
限流參數索引1 (假設接口第二個參數為 deviceId)
限流閾值10 QPS(根據實際業務調整)

4.4 代碼示例

@SentinelResource(value = "reportPlayOnline", blockHandler = "handleBlock")
public Integer reportPlayOnline(String fileId, String deviceId) {// 業務處理邏輯return 1;
}public Integer handleBlock(String fileId, String deviceId, BlockException ex) {// 限流降級處理邏輯return -1;
}

5. 兩者對比及推薦實踐

維度視頻ID限流設備ID限流
保護對象熱點視頻資源及其后端服務單設備防刷及異常流量控制
典型閾值較大(幾十至幾百QPS)較小(個位至十幾QPS)
業務影響限制熱門視頻流量,影響視頻觀看體驗限制惡意設備請求,保護系統穩定
運維難度規則相對簡單,易于監控需配合反刷策略和設備識別機制
推薦使用場景大規模視頻播放平臺,防止熱點視頻擠兌防刷單、異常請求攔截

6. 總結

  • 單參數限流是 Sentinel 實現熱點限流的主流方式,簡單高效。
  • 視頻ID限流,有效防止熱點視頻帶來的壓力峰值,保護服務端資源。
  • 設備ID限流,有助于防刷及控制單設備異常請求,保障系統安全。
  • 生產環境中建議兩者結合使用,實現多維度流量保護,確保系統穩定和良好用戶體驗。

7. 附錄:Sentinel 控制臺限流規則配置示例

資源名參數索引閾值類型閾值 (QPS)說明
reportPlayOnline0QPS每秒請求數100視頻ID限流
reportPlayOnline1QPS每秒請求數10設備ID限流

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909474.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CountDownLatch入門代碼解析

文章目錄 核心思想&#xff1a;火箭發射倒計時 &#x1f680;最簡單易懂的代碼示例代碼解析運行流程分析 核心思想&#xff1a;火箭發射倒計時 &#x1f680; 想象一下發射火箭的場景&#xff0c;在按下最終的發射按鈕之前&#xff0c;必須有好幾個系統同時完成自檢&#xff0…

用Python寫一個可視化大屏

用Python打造可視化大屏&#xff1a;數據洞察新視界 在當今數據爆炸的時代&#xff0c;數據可視化成為了理解和傳達復雜信息的關鍵工具。Python作為一門強大且靈活的編程語言&#xff0c;提供了豐富的庫和工具&#xff0c;讓我們能夠創建出令人驚嘆的可視化大屏。本文將帶你逐步…

20250611讓NanoPi NEO core開發板在Ubuntu core16.04系統下開機自啟動的時候拉高GPIOG8

rootNanoPi-NEO-Core:/# touch open_4g_ec20.sh rootNanoPi-NEO-Core:/# vi open_4g_ec20.sh 【打開使能引腳200 IOG8】 echo 200 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio200/direction echo 1 > /sys/class/gpio/gpio200/value 【切記&#xff1a…

解惑1、為何大容量電容濾低頻,小容量電容濾高頻

一、電容的種類&#xff1a; 鏈接&#xff1a; 二、疑惑 理論推算&#xff1a; 1&#xff09;Zc1/wc&#xff0c;那么大容量和小容量的電容&#xff0c;不應該都是 越高頻越阻抗低&#xff0c;越容易通過&#xff1f; 2&#xff09;大容量&#xff0c;積蓄電荷速度慢&#…

如何有效監控JVM環境,保障應用性能

緩慢的Java應用程序、意外崩潰和晦澀的內存問題——這些都是JVM可能在默默承受壓力的信號。JVM監控對于保障Java應用的正常運行時間和最佳性能至關重要&#xff0c;它提供了對Java虛擬機內存、線程和CPU資源使用情況的可見性&#xff0c;使管理員能夠在影響終端用戶之前識別性能…

python:PyQt5 開發一個郵件客戶端,能編寫郵件,發送郵件及附件

PyQt5 郵件客戶端 下面是一個簡潔高效的郵件客戶端實現&#xff0c;支持編寫郵件、添加附件和發送郵件功能&#xff1a; 編寫 eMailClient_qt.py 如下 # -*- coding: utf-8 -*- """ 用 PyQt5 開發一個郵件客戶端&#xff0c;能編寫郵件&#xff0c;發送郵件及…

React【回顧】 深層次面試詳解:函數式組件核心原理與高級優化

以下是對 React 深層次內容的全面解析,涵蓋函數式組件的核心原理、性能優化、設計模式和最新特性: ?? 一、React 核心機制剖析 1. Fiber 架構深解 Fiber 節點結構:function FiberNode(tag, pendingProps, key) {this.tag = tag; // 組件類型(函數組件=0, 類…

視覺語言模型的“視而不見“

這項研究發現&#xff0c;號稱能“看圖說話”的視覺語言模型&#xff08;VLMs&#xff09;&#xff0c;在處理需要真正“看”懂圖片的純視覺任務&#xff08;如判斷深度、找對應點、認物體材質等&#xff09;時&#xff0c;表現遠不如它們自己內部的“眼睛”&#xff08;視覺編…

Wyn 商業智能與 3D 大屏的深度融合應用

引言 在當今數字化快速發展的時代&#xff0c;數據可視化對于企業的決策和管理變得至關重要。商業智能軟件作為數據可視化的重要工具&#xff0c;能夠幫助企業將海量的數據轉化為直觀、易懂的信息。而 3D 大屏以其沉浸式、立體的展示效果&#xff0c;為數據可視化帶來了全新的…

使用docker compose部署netmaker打通內網

準備 我看官網推薦都是使用ssl然后要ssl證書&#xff0c;不想走彎路了 一、docker-compose.yml version: "3.4"services:netmaker:container_name: netmakerimage: gravitl/netmaker:v0.90.0restart: unless-stoppedports:- "18081:18082"- "50051…

Linux集市采購指南[特殊字符]:yum和apt的“搶貨”大戰!

Linux集市采購指南&#x1f345;&#xff1a;yum和apt的“搶貨”大戰&#xff01; ? 歡迎來到 Linux軟件生態集市&#xff01;這里分兩大陣營&#xff1a; &#x1f96c; CentOS/RHEL傳統菜市場&#xff1a;派穩重的 yum 大叔當采購員&#xff0c;做事一板一眼&#xff1b;?…

DataX 框架學習筆記

官方倉庫&#xff1a; https://github.com/alibaba/DataX?tabreadme-ov-file 1. 介紹 1.1. 基本介紹&#xff1a; DadaX 是阿里云 DataWorks 數據集成 的開源版本&#xff08;異構數據同步、離線數據同步工具 / 平臺&#xff09;。主要抽象為 Reader 和 Writer 插件&#…

MaxCompute的Logview分析詳解

文章目錄 一、Logview簡介1、概述2、標題與功能3、基礎信息 二、作業詳情1、Job Details2、Fuxi Sensor3、Result①當前作業運行成功&#xff0c;顯示的為運行結果。②當前作業運行失敗&#xff0c;顯示的為失敗原因。 4、SourceXML5、SQL Script6、History7、SubStatusHistory…

HTML5白云飄飄動態效果教程

HTML5白云飄飄動態效果教程 這里寫目錄標題 HTML5白云飄飄動態效果教程效果介紹實現步驟步驟一&#xff1a;創建HTML結構步驟二&#xff1a;設計CSS樣式步驟三&#xff1a;添加JavaScript交互 代碼解析HTML結構解析CSS樣式解析JavaScript功能解析 自定義調整總結 效果介紹 本教…

tcp高難度問題

以下是針對這些問題&#xff0c;在面試場景下&#xff0c;既保證理論扎實、邏輯清晰&#xff0c;又具備交流延展性的回答思路與內容&#xff0c;可根據實際面試節奏和面試官反饋靈活調整展開&#xff1a; 1. 客戶端端口號如何確定的&#xff1f; 面試官您好&#xff0c;客戶端…

廣東省省考備考(第二十八天6.13)—資料分析(第二節課)

基期與現期 官方定義&#xff1a;作為對比參照的是基期&#xff0c;而相對于基期比較的是現期 通俗說法&#xff1a;時間靠前的為基期&#xff0c;時間靠后的為現期 增長量與增長率 增長量用來表述基期量與現期量變化的絕對量&#xff1b; 增長率用來表述基期量與現期量變化…

pytorch 中前向傳播和后向傳播的自定義函數

系列文章目錄 文章目錄 系列文章目錄一、torch.autograd.function代碼實例 在開始正文之前&#xff0c;請各位姥爺動動手指&#xff0c;給小店增加一點訪問量吧&#xff0c;點擊小店&#xff0c;同時希望我的文章對你的學習有所幫助。本文也很簡單&#xff0c;主要講解pytorch的…

【項目實訓#08】HarmonyOS知識圖譜前端可視化實現

【項目實訓#08】HarmonyOS知識圖譜前端可視化實現 文章目錄 【項目實訓#08】HarmonyOS知識圖譜前端可視化實現一、背景簡介二、技術方案與架構設計2.1 技術選型2.2 組件架構設計 三、知識圖譜可視化組件實現3.1 KGResultTab組件設計組件模板結構不同狀態的處理用戶交互控制節點…

【軟件開發】什么是DSL

什么是DSL DSL&#xff08;Domain-Specific Language&#xff0c;領域特定語言&#xff09;是一種為特定領域或任務設計的編程語言&#xff0c;目的在于提高該領域中的表達能力與開發效率。 1 在腳本語言中的 DSL 是什么&#xff1f; 在腳本語言&#xff08;如 Python、Lua、…

JasperReport生成PDF/A類型文檔

當JasperReport導出的文檔為PDF/A模式時&#xff0c;該PDF為只讀可以防止被修改。 設置導出參數 JRPdfExporter exporter new JRPdfExporter();exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrints));exporter.setExporterOutput(new SimpleOutputStre…