架构设计 文章

架构反思:引入 Redis 统计在线人数后,JWT 是否还有存在的意义?
c#后端
2024-10-16 0k

架构反思:引入 Redis 统计在线人数后,JWT 是否还有存在的意义?

在构建 .NET Web API 后台时,为了实现在线人数统计,我们通常会引入 Redis 来存储用户的活跃状态。 这时,一个非常敏锐且直击架构本质的问题往往会浮出水面: “既然为了统计在线人数,每次请求都要去 Redis 读写一次,那 JWT ‘无状态、不查库’ 的核心优势不就没了吗?干脆用一个短小的随机字符串(普通 Token),既能节省流量,又能节省计算资源,岂不更好?” 这是一个极好的问题。它触及了软件架构的核心——权衡 (Trade-off)。 答案是:在特定场景下,普通 Token 确实更好;但在大多数现代架构中,JWT + Redis 的组合依然具有不可替代的优势。 本文将从依赖性、性能、架构扩展性三个维度,深入剖析为什么我们依然推荐保留 JWT。 1. 核心区别:强依赖 vs. 弱依赖 这是两者最根本的区别,决定了系统的可用性 (Availability) 上限。 🔵 方案 A:普通 Token (Reference Token) + Redis 在这个方案中,Token 只是一个无意义的随机字符串(一把钥匙)。 流程: 请求到达 -> 解析 Token -> 必须请求 Redis 查找对应的 UserID -> 拿到身份 -> 执行业务。 风险: 这里 Redis 是强依赖。 如果 Redis 宕机、网络抖动或连接数耗尽,整个系统的认证模块瞬间瘫痪。

JWT Redis 认证授权
阅读更多
从机器指令到面向对象:编程思想的演进与领域驱动设计
后端
2024-07-24 0k

从机器指令到面向对象:编程思想的演进与领域驱动设计

面对领域驱动设计(DDD)的火热,很多熟悉面向对象(OOP)的开发者都会有一个疑问:这和我以前学的OOP是什么关系?是全新的东西,还是旧瓶装新酒?本文将带你回顾编程思想的演进历程,理清DDD与OOP的深刻联系,并展望现代编程思想的融合之道。 一、编程思想的演进脉络:一部与“复杂性”的斗争史 编程的发展史,就是一部工程师们如何不断地抽象和封装,以应对日益增长的软件复杂性的历史。让我们用一张时间线来直观感受这一历程: timeline title 编程思想演进历程 1950年代以前 : 面向机器编程 : 主要与硬件直接交互 1950-1960年代 : 面向过程编程 : 以步骤为中心<br>结构化程序设计 1960-1970年代 : 面向对象编程兴起 : 对象为核心<br>封装、继承、多态 2000年代 : 领域驱动设计提出 : 应对业务复杂性<br>强调领域建模 2000年代至今 : 多种思想并存 : 函数式编程复兴<br>响应式编程等 下面我们来详细解读每个阶段的核心思想与突破: 面向机器与面向过程:效率与结构的初探 面向机器:在计算机诞生初期,编程直接使用机器语言或汇编语言,程序员必须深入了解硬件细节。这种方式效率极低,难以维护,是“与硬件共舞”的时代。 面向过程:随着高级语言(如Fortran, C)的出现,面向过程的思想成为主流。它将程序看作一系列线性步骤(过程),通过函数来实现每个环节,其核心方法是“自顶向下、逐步求精”。然而,当系统变得复杂时,数据和操作分离的特性使得代码的复用和维护变得异常困难,全局变量的滥用等问题凸显。 面向对象编程的兴起:将现实世界映射入代码 为了解耦数据与操作,面向对象编程(OOP) 应运而生。它以类和对象作为基本程序单位,将数据和对数据的操作封装在一起。它通过三大特性来管理复杂性: 封装:收敛内部逻辑,只暴露必要的接口。 继承:实现代码的复用和层次的抽象。 多态:允许同一接口表现出不同的行为,极大地提高了系统的灵活性。 OOP通过对象的概念将现实世界映射到软件系统,更符合人类的思维方式,是程序设计方法学上的一次巨大飞跃。 领域驱动设计的深化:聚焦业务复杂性的战略工具 到了2004年,埃里克·埃文斯(Eric Evans)在其著作《领域驱动设计》中提出了DDD。这时,软件的规模和技术复杂性已经得到较好控制,但业务逻辑本身的复杂性成为了新的挑战。 DDD的核心是建立正确的领域模型,并让这个模型成为项目成员(包括领域专家、设计人员、开发人员)之间沟通的通用语言。它在OOP的基础上,进一步强调了边界的控制,引入了限界上下文和聚合等核心模式,来应对大型、复杂业务系统的设计和拆分问题。 二、DDD与OOP:是继承与发展,而非颠覆与取代 领域驱动设计并非一个全新的编程范式,它可以看作是面向对象思想在复杂业务系统分析和设计上的进一步发展和规范化应用。 1. 核心理念的继承

编程思想 面向对象 OOP
阅读更多