Hero Image
分散式系統

Distributed System 分散式系統設計,Net 8 服務,啟用 nginx upstream 從單機到多實例後,遇到的設計問題。 核心概念:Stateless Service 什麼是 Stateless? 定義:服務的每個實例不保留任何與特定請求或使用者相關的狀態資訊。 為什麼需要 Stateless? ┌─────────┐ ┌──────────────┐ ┌──────────┐ │ Client │────▶│ Load Balancer│────▶│Instance A│ └─────────┘ └──────────────┘ ├──────────┤ │ │Instance B│ │ ├──────────┤ └─────────────▶ │Instance C│ └──────────┘ 當你的系統從 1 台機器擴展到 N 台時: 請求分散:用戶的連續請求可能落在不同實例 實例隨時變動:Auto-scaling 會新增/移除實例 故障轉移:某個實例掛掉,流量會轉到其他實例 ❌ 禁止使用的狀態儲存方式 方式 為什麼不行 實際案例 IMemoryCache 只存在單一實例 User A 的資料在 Instance A,但下次請求到 Instance B static 變數 無法跨實例共享 計數器在每個實例都是獨立的 Singleton 內部狀態 每個實例有自己的 Singleton Session 資料只存在啟動該請求的實例 檔案系統 本地儲存 上傳的檔案只在一台機器上 ✅ 狀態必須外部化 所有狀態都必須存放在所有實例都能存取的外部系統:

Hero Image
多租戶 JWT 驗證架構

LineCRM.CarCare 登入架構說明 Multi-Tenant JWT Authentication 多租戶(Multi-Tenant)JWT 雙 Token 認證機制(Access Token + Refresh Token),支援商店用戶(Store)與客戶用戶(Customer)兩種身份類型的獨立認證流程。透過泛型設計與介面抽象,實現了可擴展的多角色登入系統,並結合 Redis 快取機制管理 Refresh Token,提供安全且高效的身份驗證解決方案。 Key Features 雙 Token 機制:Access Token (短效) + Refresh Token (長效) 多角色支援:Store User 與 Customer User 獨立認證 自動 Token 更新:Middleware 自動偵測過期並刷新 分散式快取:Redis 管理 Refresh Token 狀態 安全性強化:HttpOnly Cookie + CSRF 防護 可擴展架構:新增用戶類型僅需實作兩個介面 1. Adapter Pattern (適配器模式) 位置: StoreInfo 、 CustomerInfo、 IClaimAdapter.cs public interface IClaimAdapter<CurrentUser> { IEnumerable<Claim> GetClaims(); static abstract CurrentUser? FromClaimsPrincipal(ClaimsPrincipal principal); } public class CustomerContext : AppDataContext<CustomerInfo> { public CustomerContext(IHttpContextAccessor httpContextAccessor, IBaseLogger log) : base(httpContextAccessor, log) { } public override CustomerInfo? CurrentUser { get { var user = _httpContextAccessor.HttpContext?.User; return CustomerInfo.FromClaimsPrincipal(user); } } } public class CustomerInfo : IClaimAdapter<CustomerInfo> { public IEnumerable<Claim> GetClaims(){} public static CustomerInfo? FromClaimsPrincipal(ClaimsPrincipal principal){} } 說明: