代理伺服器與後端服務如何處理請求的 IP來源?
在服務面前擺一台 Nginx 進行反向代理是常見的操作,但當我們要做應用層的限流機制、紀錄 Log、一切與來源請求 IP 相關的功能時要如何拿到正確的資訊?記錄一下我根據 Go Gin 受信任代理設置官方文件的最佳範例。
在服務面前擺一台 Nginx 進行反向代理是常見的操作,但當我們要做應用層的限流機制、紀錄 Log、一切與來源請求 IP 相關的功能時要如何拿到正確的資訊?記錄一下我根據 Go Gin 受信任代理設置官方文件的最佳範例。
還記得小時候的電腦都是 32-bits 的系統,大約在 win7 的時代已經逐步的替換成 64-bits 系統了,但我還是不了解具體來說有什麼差異,只記得有段時間有兩種軟體規格可以選擇,或是某些軟體需要用「兼容模式」來執行。
當處理多個加解密應用時我納悶:「多一份金鑰需要管理,意味著多一個需要防守的東西」、「如何避免用戶使用一串非常簡單的金鑰讓破解變得非常容易」。而正好有個專門的算法:金鑰衍生函式 Key Derivation Function 正是為此類問題而生。
在學習 Go 時會了解到 `struct` 其實就是一串自訂的資料結構,而其中欄位的「順序」將直接影響到在記憶體中所佔用的實際大小甚至程式的速度。了解記憶體對齊的概念除了「節省空間」外也能為打造「更佳的緩存局部性(Cache locality)」。
近期在開發 Go 專案時發現到提交代碼流程總是有些摩擦,像是開發時習慣用 Tab 到 GitLab 上寬度就會變得很奇怪,或是一些簡單的對齊問題都在無形消耗專注力。所以透過把一些原生的 Go 靜態檢查工具搬到 CI 上執行,確保統一的開發體驗。
最近有較多的時間思考開發上的最佳實踐,考慮到目前開發的一個後端項目基本就是拿 go 原生的 log 到處打印儲存片面狀態而已。在閱讀一些文件與最佳實踐後,我想著手改善現有的 logging 體驗透過導入 Go 1.21 引入的原生 slog 庫。
大多程式都可以採取「並行 Concurrency」的方式來達成簡單安全且高效的運行,但隨著多核 CPU 出現以及特定場景對於效率的追求「平行 Parallelism」運行程式是另一個提高運行效率方向。本文練習透過 Go 複習平行程式開發下資料存取相關技巧:原子操作、鎖、信號量⋯⋯
Redis 是十分常見的 In-Memory 資料庫,工作上時不時會碰到它但很少仔細從頭了解它,所以透過撰寫重現一些案例達成更深刻的理解。快取就是把常存取的資料放在能夠快速獲取的地方,缺點是記憶體不像硬碟適合長久保存資料,但不管是提高速度、降低延遲、降低負擔或減輕成本⋯⋯快取都是很棒的選擇。
相較於 C 讀取未定義數值的變數會造成安全漏洞或崩潰,或是動態語言如 JavaScript 沒有數值型別初始化的問題,Go 的設計上就自動賦予了確定意義的數值避免出錯與創建即可使用。具體來說在例如使用 json 反射的標籤中 `omitempty` 也正是運用了 Zero Value 的概念來判斷。
雖然在 AI 出現之前很難想像,但 2026 年工作上我已經很少「手寫程式」而是透過 AI 更有效率的輔助開發,我相信在 AI 百家爭鳴的時代不用特別執著用哪個模型或工具,挑個最新順手的免費方案就夠了,未來模型只會更便宜更有效率。
前端測試主要重點在與瀏覽器打交道(Jsdom、Headless Browser)且通常只與單一後端進行溝通,而後端測試則是面臨截然不同的難題:分散服務與狀態。這篇文章介紹實戰上我如何透過 Testcontainers 創建 Docker 測試環境來達成完整的後端整合測試流程。
AES(Advanced Encryption Standard)是最廣泛使用的對稱加密,HTTPS/TLS、Wi-Fi(WPA2/3)、全硬碟加密(BitLocker、FileVault)⋯⋯透過理解 AES 如何運作有助於了解現代安全加密如何實踐。
不同網站的密碼需要管理,不僅容易忘記,也存在被竊取或重複使用帶來的風險。如果只需要掃描指紋或使用臉部識別,就能立即完成註冊與登入——這正是 FIDO(Fast IDentity Online)所推動的「無密碼身分驗證」願景。
最近在寫 Go 測試時發現官方與社群中有一種大力推崇的慣例:TableDrivenTest,我一直以為測試應該要保持簡單愚蠢,但這種做法讓我想到程式人的三大美德之一:「懶惰」。可能是因為這種模式通常只是測試框架包裝下的方便手段,而 Go 社群文化下人人對於追求簡單程式有一種莫名的執著。
紀錄近期從 JavaScript 遷移到 Go 的過程中實踐 Set 資料結構的方式。先前代碼使用 JavaScript Set 來實現不重複資料定義,但在 Go 語言當中並沒有實踐 Set 資料結構,但我們可以透過改造 map 來實踐。