架構實戰

来源:https://www.cnblogs.com/newton/p/18385754
-Advertisement-
Play Games

所謂架構,意即系統架構,廣義上它涵蓋業務架構、運維架構、組織架構等所有系統構建場景,本文特指一般開發人員主要關註的開發架構。 關於架構的理論有很多,每個人也都有各自的理解,筆者相信很多人在實際運用中也會遇到各種各樣的問題和困惑,本文拋開教條,從一個實際項目的演化看何為架構。 項目背景 開始之前,先了 ...


所謂架構,意即系統架構,廣義上它涵蓋業務架構、運維架構、組織架構等所有系統構建場景,本文特指一般開發人員主要關註的開發架構

關於架構的理論有很多,每個人也都有各自的理解,筆者相信很多人在實際運用中也會遇到各種各樣的問題和困惑,本文拋開教條,從一個實際項目的演化看何為架構。

項目背景

開始之前,先瞭解下項目背景。該項目原本是為某東南亞公司開發的圖庫,提供圖片使用授權服務,正規項目。無奈當地營商環境魚龍混雜,黑白手段層出不窮,有好幾個其它項目要麼被 DDOS,要麼流量被劫持,要麼莫名出現違規內容,搞得該公司苦不堪言,這回乾脆重金懸賞,遍求挑梁賢能。這不,被筆者一個在國內靈活就業的朋友揭了榜,幾年之後才回國,這中間發生的種種又是另外的故事了。

不管怎麼說,雖然項目看著不大,但除業務本身內容外,伺服器和數據安全也須重點考慮。

基礎版

顯然,用戶瀏覽網站需要一個site,如果採用前後端分離還得有api-server

為了防止惡意用戶上傳違規內容,所有圖片都由管理員上傳至圖床比如AWS-S3(公共讀私有寫模式)

S3 同步版

基礎版雖然在業務端保證了數據安全,但由於兩處伺服器(S3、site/api,即紅色節點)直接對外暴露,黑客能輕而易舉地實現定位進而展開攻擊。S3 是可靠的雲服務,倒也不用太擔心,然而驚弓之鳥的甲方要求管理員不能直接訪問 S3,防止黑客嗅探到管理端。

於是,在管理端和 S3 中間新加一個中轉節點minio,圖片先上傳到 minio,再同步給 S3,如此,管理端暴露的風險大大降低。

註意此時還沒有解決 site/api 暴露的問題,後面會講。

會員版

馬上新的需求出來了,甲方要求加入收費會員模式,但是不能出現任何關於公司的賬戶信息(看來甲方真的是怕了,要徹底地隱藏自己)。

要有會員體系,得先有賬號模塊,為防止惡意註冊,加上郵箱驗證即可。

收費不能體現公司賬號比較麻煩,常規走銀行流水肯定不行,第三方甚至套殼支付總是會被追蹤到,剩下的選擇只有加密貨幣了,所幸加密貨幣在當地是被廣泛使用的。

加密貨幣交易一般都是非同步的,所以要設計一個定時器,定時從鏈上獲取最新的交易記錄,同步給賬號中心處理。

圖中虛線表示連接的是內部服務。

CMS 版

管理員除管理圖片外,還需對網站本身進行管理,比如廣告投放、佈局調整、會員策略等。於是新增了CMS-Service

當然以後還會需要其它非 CMS 的站點管理功能比如會員管理、系統監控等,統一以admin-site對管理端提供服務。

CQRS 版

現在,把圖片管理一同併入站點管理,並對各服務應用CQRS模式,為以後做讀寫策略/集群/分散式打下良好基礎。

註意,其中 admin-site 兼具 site-command、album-command 職責。

IM 版

為了提升服務質量,甲方老闆要求加上線上客服,客戶訴求第一時間反饋,同時其它一些消息(比如客戶下單、圖片合約到期等),管理員也能第一時間收到。

這就不單單是一個即時聊天系統了,還得有消息推送的功能。

再考慮到當地朝九晚五懶散的工作狀態,想要管理員一直呆在電腦前也不現實,那麼客戶消息和系統消息就容易錯過。

還好,這裡有一個人人都離不開的聊天 App ——Telegram,這玩意兒類似國內的微信,但是開放了很多介面和協議,使第三方系統能方便地接入它。比如我們可以使用它的Telegram-Bot,當客戶發送消息時,IM 服務除向管理端實時推送外,還會推送給 Telegram-Bot,Telegram-Bot 再將消息推至 Telegram,如此,沉浸在美女頻道的管理員就能及時知道有待反饋消息了。

Cloudflare 版

系統的主要功能基本都實現了,但甲方心心念念的安全問題反倒隨著功能的擴展顯得更加嚴峻。如之前所述,直接暴露給用戶的節點風險等級最高,其次為管理員使用節點,進而會影響到整個系統內部。

自己搭建一套安全體系成本太高,實力也不允許,幸好市面上有免費的午餐,比如Cloudflare

Cloudflare 是全球知名的網路服務商,提供保護、優化、加速網站等相關服務。本項目中至少可以考慮如下服務:

  • 源站 IP 隱藏
  • Bots - 自動屏蔽惡意爬蟲
  • Turnstile - 人機驗證
  • S3 功能變數名稱重寫為本站功能變數名稱(做了 cname 解析)

同時要求管理員在所使用的設備上安裝VPN,將風險降到最低。

可以看到,圖中的紅黃線塊都沒了,整個系統只要內部不出問題,從外部攻破的可能性不大。

CI/CD 版

還有一個漏洞,甲方意味深長地說。他指的是從本地開發/測試機部署至生產環境這道工序,同樣會出現本地設備直連線上節點的情況。雖然現在伺服器已經藏得夠深,直接登錄被髮現的幾率不大,但安全起見,甲方還是要求每次都採用跳板機中轉一下。

對於經常發版的任務,跳板中轉屬實也有點麻煩,可以採用CI/CD方案,自動化部署,既輕鬆又安全。

至此,開發架構與運維架構產生了交集,前者也總算可以告一段落了。


總結

架構,既是名詞,亦是動詞,既是實體,亦是變化,它是一種理念,也是一種實施。但它肯定不是一套模板 —— 如果所有的房屋都千篇一律,那也不存在架構師了。

整個項目,甲方對安全的要求簡直到了偏執的程度,很多要求看似無理,聰明的你也許能看出些端倪:)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 此“華仔”,不是彼“華仔”,你懂的! 先來了個截圖 緊跟著,實現步驟也來了 1. 安裝 Node.js,終端運行 npm create vue@latest,項目名 vue-to-do,後面的選項全選 No; 2. cd vue-to-do 進入項目目錄,npm install 安裝依賴,npm r ...
  • title: 使用 Nuxt 的 showError 顯示全屏錯誤頁面 date: 2024/8/26 updated: 2024/8/26 author: cmdragon excerpt: 摘要:本文介紹Nuxt.js中的showError方法用於顯示全屏錯誤頁面,包括其參數類型及使用方式,並演 ...
  • 信息系統設計速查表需求收集功能性需求:通過用戶訪談、問卷調查和市場分析來確定系統必須實現的功能。 非功能性需求:定義性能基準(如響應時間)、安全性要求(如數據加密標準,傳輸加密)、可靠性標準(如系統的正常運行時間, MTTR)。 用戶故事:使用敏捷方法論,如Scrum,來創建和優先順序排序用戶故事。 ...
  • @目錄1.流程2.自定義發佈數據2.1 std_msgs內置類型2.2 編寫.msg文件2.3 修改package.xml文件2.3.1 完整的package.xml文件2.4 修改CMakeLists.txt文件2.4.1 修改find_package指令2.4.2 添加add_message_f ...
  • IOC與DI的理解 1.1、IoC是什麼 Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什 ...
  • @目錄1.launch文件有哪些標簽2.node標簽2.1 必選屬性2.2 可選屬性2.3 可選子級標簽3.include標簽3.1 必選屬性3.2 可選屬性3.3 可選子級標簽4.remap標簽4.1 必選屬性5.param標簽5.1 必選屬性5.2 可選屬性6.rosparam標簽6.1 必選屬 ...
  • @目錄1.工作空間目錄2.載入環境變數3.打開CLion4.配置CLion5.編譯和調試軟體包 1.工作空間目錄 我們的一個工作空間目錄應該是這樣的 2.載入環境變數 先進入工作空間再載入 source ./devel/setup.bash 3.打開CLion 一定要在第二步的同一個終端下 clio ...
  • @目錄1.流程2.自定義請求和響應的數據2.1 std_msgs內置類型2.2 編寫.srv文件2.3 修改package.xml文件2.4 修改CMakeLists.txt文件2.4.1 修改find_package指令2.4.2 添加add_message_files指令2.4.3 添加gene ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...