我做的基礎服務項目,是如何實現 API 安全與限流的(短信、郵件、文件上傳、釘釘通知)


我做的基礎服務項目,是如何實現 API 安全與限流的(短信、郵件、文件上傳、釘釘通知)


一、背景

最近我做了一個基礎服務項目,主要對外提供短信、郵件、文件上傳和釘釘通知等基礎功能。這些接口是多個業務系統都要調用的,所以安全性、穩定性、限流控制必須得做好。

這篇文章就記錄一下,我是怎么一步步設計這個系統,讓它既能安全對接多個項目,又能抗住高并發調用的。


二、我遇到了什么問題?

這個系統上線初期,其實就碰到了幾個問題:

  1. 接口被非法調用:沒有權限的系統也能調用我們的短信接口,導致誤發短信。
  2. 被刷接口:有個業務系統調用頻繁,導致我們服務被打崩,日志里全是超時。
  3. 多項目對接混亂:不同項目調用同一接口,但權限、限流、日志都不一樣,不好管理。

這些問題讓我意識到,必須從架構層面統一解決 API 安全、限流、多項目對接等問題。


三、我是怎么做的?

我最終設計了一套統一的安全和限流機制,結合 Redis、攔截器、Lua 腳本等技術,解決了這些問題。

1. API 接口安全設計:API Key + Redis 校驗

我給每個接入的項目分配一個唯一的 API Key,所有請求都必須在 Header 中帶上 X-API-Key

Key 信息存在 Redis 中,包括:

  • 租戶 ID(tenantId)
  • 是否啟用
  • 過期時間

每次請求進來,攔截器會先校驗 Key 是否有效。無效的直接返回 401。

實現亮點:
  • 使用 Redis 存儲 Key,讀取快,不影響性能
  • 攔截器統一處理,邏輯清晰
  • 可結合租戶 ID 做日志追蹤、限流隔離等
示例攔截器代碼:
@Component
public class ApiKeyInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String apiKey = request.getHeader("X-API-Key");if (StringUtils.isBlank(apiKey)) {response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Missing API Key");return false;}String value = redisTemplate.opsForValue().get("api_key:" + apiKey);if (value == null) {response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid API Key");return false;}JSONObject json = JSON.parseObject(value);boolean enabled = json.getBoolean("enabled");long expireTime = json.getLong("expireTime");if (!enabled || System.currentTimeMillis() > expireTime) {response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "API Key expired or disabled");return false;}return true;}
}

2. 限流設計:Redis + Lua 實現滑動窗口限流

一開始我用的是 Guava 的限流組件,但發現它只適用于單機。后來我換成了 Redis + Lua 腳本,實現了分布式的滑動窗口限流。

Lua 腳本:
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local windowSize = tonumber(ARGV[2])
local now = tonumber(ARGV[3])redis.call('ZREMRANGEBYSCORE', key, 0, now - windowSize * 1000)
local count = redis.call('ZCARD', key)if count >= limit thenreturn false
elseredis.call('ZADD', key, now, now)return true
end
Java 調用邏輯:
@Service
public class RateLimitService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;private static final Long LIMIT = 100L; // 每分鐘最多100次private static final Long WINDOW_SIZE = 60L; // 時間窗口60秒public boolean isAllowed(String apiKey) {String key = "rate_limit:" + apiKey;long now = System.currentTimeMillis();DefaultRedisScript<Boolean> script = new DefaultRedisScript<>(luaScript, Boolean.class);return redisTemplate.execute(script,Arrays.asList(key),LIMIT.toString(), WINDOW_SIZE.toString(), String.valueOf(now));}
}

然后我在攔截器中調用限流邏輯,拒絕超過限制的請求。

實現亮點:
  • 支持分布式限流,適合多節點部署
  • 滑動窗口比固定窗口更精準
  • Lua 腳本保證原子性,避免并發問題

3. 多項目對接策略

為了支持多個項目接入,我做了以下幾點:

  • 所有 API Key 綁定租戶 ID,便于日志追蹤、限流隔離
  • 統一網關(Nginx + Spring Cloud Gateway)做路由、鑒權、限流
  • 用 Nacos 管理 API Key、限流規則等配置,支持運行時熱更新

四、難點與亮點總結

難點:

  1. 如何在分布式環境下實現限流?
    答案是 Redis + Lua 腳本,保證原子性,避免并發問題。

  2. 如何防止非法調用?
    API Key + Redis 校驗機制,攔截器統一處理,簡單有效。

  3. 如何支持多項目對接?
    給每個項目分配獨立的 API Key,綁定租戶信息,限流、日志、權限都按租戶隔離。

亮點:

  1. 模塊清晰,易于擴展:短信、郵件、文件上傳等功能模塊化,方便維護。
  2. 統一安全機制:API Key + 限流,保障系統安全。
  3. 支持高并發:Redis + Lua 腳本應對分布式限流,性能穩定。
  4. 可擴展性強:后續可接入 Nacos、Prometheus、日志系統等,形成完整生態。

五、效果如何?

這套方案在我們公司已經上線使用幾個月了,日均調用量幾萬次,沒出過安全問題,也沒被刷崩過,效果還不錯。

  • 接口安全性大幅提升
  • 限流機制有效防止了刷接口
  • 多項目接入統一管理,效率提高

如果你也在做類似的平臺,或者想搭建一個對外的基礎服務系統,可以參考這套架構,親測可用。


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

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

相關文章

(Python)類和類的方法(基礎教程介紹)(Python基礎教程)

源代碼&#xff1a;class Students:stats"大學"def __init__(self,name,age,sex,credit):self.namenameself.ageageself.sexsexself.creditcreditdef tell(self):return f"{self.name}說&#xff1a;你好"class Teachers(Students):stats"教師"d…

網絡智能體研究綜述

網絡智能體研究綜述1.什么是網絡智能體1.1.核心特征1.2.分類方式1.2.1.按功能定位1.2.2. 按網絡結構1.2.3.按應用場景1.3.典型應用場景1.4.技術基礎1.5.發展趨勢與挑戰1.5.1.發展趨勢1.5.2.核心挑戰2.網絡智能體盤點3.阿里的WebSailor3.1.WebSailor的主要功能和技術特點3.2.技術…

git 介紹與使用教程

Git 是一個 分布式版本控制系統&#xff0c;每個開發者都有一個完整的本地倉庫&#xff08;包含完整歷史記錄&#xff09;&#xff0c;而遠程倉庫&#xff08;如 GitHub、GitLab、Gitee&#xff09;是團隊共享的中央倉庫。它們的關系如下&#xff1a;本地倉庫&#xff08;Local…

[AI風堇]基于ChatGPT3.5+科大訊飛錄音轉文字API+GPT-SOVITS的模擬情感實時語音對話項目

[AI風堇]最近利用工作日的晚間和周末時間&#xff0c;我完成了一個有趣的Python編程小項目。這個項目的靈感來源于上個月在B站看到的"科技怪咖"UP主分享的一個視頻&#xff0c;視頻中展示了一個名為"DataMagic"的自動化數據處理工具&#xff0c;能夠智能分…

物聯網-規則引擎的定義

構建物聯網系統中的規則引擎是一個系統性的工程&#xff0c;它需要處理來自海量設備的實時數據流&#xff0c;并根據預定義的邏輯觸發動作。以下是構建一個高效、可靠、可擴展的物聯網規則引擎的關鍵步驟和考慮因素&#xff1a; 核心目標 實時性&#xff1a; 快速處理設備事件并…

SIMATIC WinCC Unified 使用 KPI 優化流程

大家好&#xff0c;我是東哥說-MES基本知識 33.1 KPI組態簡介現有工廠結構表示在面向對象的組態中定義標準化 KPI 概念的起點。 可通過在工廠視圖中用作實例的工廠對象類型來映射工廠的各組件。在“性能指 標”(Performance indicators) 全局編輯器中&#xff0c;可定義全局操作…

機器學習-多重線性回歸和邏輯回歸

目錄 1. 多重線性回歸 1.1 多元線性回歸 1.2 向量化&#xff08;矢量化&#xff09; 1.3 多元線性回歸的梯度下降算法 1.4 正規方程 2. 特征縮放 2.1 特征縮放 2.2 檢查梯度下降是否收斂 2.3 學習率的選擇 2.4 特征工程 2.5 多項式回歸 3. 邏輯回歸 3.1 Motivatio…

編程思想:程序自身的模型/函數模型硬件標準如何實現

前言前面提到過寫程序的過程:根據各種需求,構建程序模型(邏輯模型),再用代碼實現.本貼關于程序自身的模型以及函數模型,以及推導硬件標準從邏輯到代碼的思路.程序自身的模型如圖應用APP接受輸入---鼠標動作,鍵盤輸入的字符等,得到結果---畫面,顯示數據等.工具包括框架和編程語言…

基于JAVA Spring Boot物理實驗考核系統設計與實現 (文檔+源碼)

目錄 一.研究目的 二.需求分析 三.數據庫設計 四.系統頁面展示 五.源碼獲取方式 一.研究目的 信息數據的處理完全依賴人工進行操作&#xff0c;會耗費大量的人工成本&#xff0c;特別是面對大量的數據信息時&#xff0c;傳統人工操作不僅不能對數據的出錯率進行保證&…

【國內電子數據取證廠商龍信科技】安卓鏡像提取與解析

前言隨著智能手機更新迭代越來越快&#xff0c;手機廠家對手機系統安全性要求也越來越嚴格。系統安全性提高對公民的隱私是一件好事&#xff0c;但是對于取證行業確實一個大難題&#xff0c;手機系統安全性的提高意味著我們能對犯罪嫌疑人手機的提取數據和恢復數據越來越少&…

Java+Ollama 本地部署 DeepSeek-R1 對話機器人:從 0 到 1 實戰指南

作為 Java 開發者&#xff0c;想在本地搭建一個能理解代碼、支持多輪對話的 AI 機器人&#xff1f;DeepSeek-R1 這款開源大模型絕對值得一試。今天就帶大家用 OllamaJava 實現本地化部署&#xff0c;全程實操&#xff0c;新手也能跟著做&#xff01; 一、先搞懂&#xff1a;為…

Java Web項目Dump文件分析指南

目錄 1. Dump文件的類型與作用 2. 生成Dump文件的方法 3. 分析Dump文件的工具 4. 分析步驟與常見問題解決 5. 最佳實踐與預防 在Java Web項目中&#xff0c;dump文件是JVM&#xff08;Java虛擬機&#xff09;在發生崩潰、內存溢出或特定事件時生成的內存快照文件&#xff0…

Ubuntu網卡驅動無效,不能連接wifi上網

一、現象及臨時網絡準備 我的另一篇博客詳細介紹了前期準備工作&#xff1a; 知乎&#xff1a;Ubuntu網卡驅動無效&#xff0c;不能連接wifi上網知乎&#xff1a;Ubuntu網卡驅動無效&#xff0c;不能連接wifi上網 在此基礎上&#xff0c;還得給Ubuntu配好鏡像源&#xff0c;…

LeetCode Hot 100 二叉搜索樹中第 K 小的元素

給定一個二叉搜索樹的根節點 root &#xff0c;和一個整數 k &#xff0c;請你設計一個算法查找其中第 k 小的元素&#xff08;從 1 開始計數&#xff09;。示例 1&#xff1a;輸入&#xff1a;root [3,1,4,null,2], k 1 輸出&#xff1a;1示例 2&#xff1a;輸入&#xff1a…

5-大語言模型—理論基礎:注意力機制優化

目錄 1、稀疏注意力機制&#xff08;Sparse Attention&#xff09; 1.1、核心問題&#xff1a;傳統注意力的 “效率瓶頸” 1.2、具體稀疏策略&#xff08;詳細計算邏輯&#xff09; 1.2.1、局部窗口稀疏&#xff08;Local Window Sparse&#xff09; 1.2.2、基于內容的稀疏…

輕松學習C++:基本語法解析

基本語法解析引言基本語法變量和數據類型運算符控制結構函數示例代碼&#xff1a;計算圓的面積引言 C是一種功能強大的通用編程語言&#xff0c;由Bjarne Stroustrup于1979年創建。它在C語言的基礎上進行了擴展&#xff0c;支持面向對象編程、泛型編程和過程式編程。C以其高性…

Python Pandas讀取Excel表格中數據并根據時間字段篩選數據

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄Python Pandas讀取Excel表格中數據并根據時間…

CS231n-2017 Lecture3線性分類器、最優化筆記

圖片向量與標簽得分向量&#xff1a;上節講到&#xff0c;圖片可以被展開成一個向量&#xff0c;對于這個向量&#xff0c;假設它有D維&#xff0c;那么它就是D維空間的一個點&#xff0c;又假設我們的標簽集合總共有K種&#xff0c;我們可以定義一個K維標簽得分向量&#xff0…

windows wsl ubuntu 如何安裝 open-jdk8

安裝步驟 jdk dhd:~$ java -version Command java not found, but can be installed with: sudo apt install openjdk-11-jre-headless # version 11.0.20.11-0ubuntu1~22.04, or sudo apt install default-jre # version 2:1.11-72build2 sudo apt install op…

Javascript進程和線程通信

JavaScript 中的進程通信&#xff08;IPC&#xff09;和線程通信是實現高性能、高并發應用的核心技術&#xff0c;尤其在處理 CPU 密集型任務或跨環境數據交互時至關重要。以下從底層機制到應用場景的詳解&#xff1a;&#x1f9e9; ??一、進程通信&#xff08;Inter-Process…