发布时间:2026-01-21
浏览次数:0
这7个库正在重塑后端开发的底层逻辑
处于当下的后端开发范畴内,开发者常常会遭遇两种差异显著的状况,其一为具备多年经验,可敏锐察觉到系统何时开始演变成“过度工程”;其二是仍在费劲地把Flask、JWT逻辑、定时任务(cron jobs)、序列化工具以及后台工作进程借助各类方式拼凑起来,并且在心底默默祈祷生产环境千万别出现故障。
不管处于哪一个阶段,最终都会形成一个共同的一致看法。那就是,极其多数的后端代码实际上并非是真正意义上的“业务逻辑”,而仅仅只是所说的“管道工程” 。
身份验证,数据验证,消息队列,调度器,配置管理,序列化sublime text 3 key,这些算是于不同项目里反复出现的一样问题,一样模式,跟着伴生来临的一样 Bug 通过过去 4 年多构建并实际交付系统的经验获取一个极为深刻的教训是假若一个库能够替换整个后端组件那就让它去替代开发者的职责是解决新问题而非用增多的代码行数去重写那些早就被解决的问题。
本文会深入予以探讨,有7个库,它们可以从根本之处消除掉整个后端子系统,它们并非是那种简单的辅助工具,而是能够用来替换完整组件的解决方案 。
1. :重塑验证、序列化与错误追踪系统
话说倘若你当下依旧是通过手动的方式去验证请求负载,或者验证数据库输入,又或是验证配置文件,那么你不但正在耗费时间,而且还在为 Bug 打开通道。
那个东西所具备的核心价值存在于这样的情况之中,即它并非仅仅是对数据进行验证,它事实上是在对系统的契约予以定义,借助简单的代码定义,就像这样:
从 pydantic 导入 BaseModel,EmailStr,Field有。
class User(BaseModel):
id: int
email: EmailStr
年龄,整型,由字段限定,大于零,小于一百三十 。
这段简洁的代码能够直接替代以下多个复杂的环节:
需要留意的是,其整个请求以及响应层都是搭建在什么之上的。鉴于什么v2在内部是运用Rust进行编写的,所以它的性能相较于传统的什么验证方式而言,快了好几个数量级。能够毫不夸张地讲,要是你的后端涉及到数据接收,然而却没有运用什么,那么你的系统架构就仿佛是构建在沙堆之上一样。
2. :重新定义 HTTP 层的简洁性
要是讲 Flask 让开发者知晓了 Web 框架的工作相应原理,那么sublime text 3 key,就呈示出达成这些功能实际上究竟仅需何等少的代码。
from fastapi import FastAPI
app = FastAPI()
@app.get("/health")
def health():
return {"status": "ok"}
通过这种极简的方式,开发者可以免费获得以下核心能力:
消除了那种复杂的像错综复杂的丝线般缠绕难以理清且需要多方处理的胶水代码,以及如层层叠叠像叠加的积木般大量堆砌的装饰器以此种方式。当下,已然成为运行速度最为快速的Web框架当中数得上号排在前沿位置的其中之一,在面对处理IO为密集型的任务这个时候,框架所展现出它的性能完全具备那个与Node.js以及和它能力相对比不相上下的Go相媲美匹敌的程度。当框架不再是成为阻碍开发进程的存在的时候,大部分所谓的如重重迷雾般让人摸不着头脑的“后端复杂性”就会跟着随之一起消失不见。
3. :终结 ORM 与验证之间的裂痕
尽管其具备强大功能,然而它却有着冗长之态,呈现碎片化状况,并且易于出现被误用的情形。它的出现,把某事物、另一事物以及类型提示(Type Hints)精妙地融合至一个连贯的模型当中。
从sqlmodel导入SQLModel,从sqlmodel导入Field 。
定义一个名为User的类,它继承自省SQLModel类,并且具备table为真的特性,。
Id可以是一个整数类型,也可以是无值,它由字段默认设定为无值,并且作为主键,其值在数据库中唯一标识一条记录。
email: str
借助这一个类,你便能拥有那独一无二的真理来源(of Truth),且顺利实现了对如下内容的替代:
在实际项目案例里,运用了缩减操作,曾使模型层代码从大约1200行走至不足300行,并且并无任何表达能力的损失发生。代码的减少直接表明Bug藏身之处的减少 。
4. :轻量级的后台任务解决方案
虽然它功能俱全,然而它太过沉重,太过复杂,并且极其容易配置出错。 那么就给出了一种可实现的后台作业方案,该方案无需深入钻研分布式系统的相关论文。
import dramatiq
@dramatiq.actor
def send_email(user_id: int):
对用户编号为user_id的用户发送电子邮件这件事进行打印输出,打印的内容是"Sending email to user {user_id}" 。
只需运行一个 即可完成部署。它直接替代了:
有着这样的设计初衷,其作用在于避规,那是常见的失效模式。要是你并不需要那般极度复杂的功能,这般情况通常算得上是更正确的一种选择。
5. :应用内的调度中心
传统的Cron于某些场景之下表现还算可以,然而在现代后端架构当中却显得力不从心,它能让开发者于应用程序内部去调度作业,并且还能提供持久化方面的支持以及可见性,。
从apscheduler.schedulers.背景中,导入背景调度器那一个,其中背景调度器是后台的那种调度器,以这种方式进行导入 。
调度器,等于,后台调度器,括号内为空,所表达的是,创建一个后台调度器,并将其赋值给调度器变量 。
把一个 lambda 表达式所对应的任务添加到调度器中,该 lambda 表达式作用是打印 “cleanup”,添加的任务执行周期是时间间隔为 1 小时的那种,由调度器来进行添加 。
scheduler.start()
这样的方式,消除了针对、特定的服务器配置,以及各类部署脚本的依赖。它完全解决了,“在生产环境运行正常然而在预发布环境失效”的配置偏差问题。要是配合数据库驱动的任务存储库,这些调度任务,甚至能够在应用重启之后继续运行。
6. :终结配置层的混乱
众多后端项目遭遇失败,常常起始于配置层出现失控的状况,.env 文件,环境变量,硬编码的默认值,还有散落在各处的密钥,共同组成了维护方面犹如噩梦般的情形,达成了针对所有配置逻辑的集中化的管理。
from dynaconf import Dynaconf
创建一个名为settings的对象,该对象通过Dynaconf来进行设置,其设置文件为包含settings.toml的列表 。
print(settings.DB_URL)
它为开发者提供了:
难以调试的是配置 Bug,原因在于它们通常不会致使程序马上崩溃,而是要借助显式管理才能让这些问题暴露出来。
7. :消除框架胶水代码
身为一个遭受低估的现代种类驱动后端框架,其目的在于完全清除框架层面的样板代码。
从litestar导入Litestar,从litestar导入get 。
@get("/ping")
def ping() -> dict:
return {"ping": "pong"}
app等于,由Litestar创建,其路由处理程序列表为,包含ping 。
它主要替代了:
于关键环节之中,维持了清晰显著之观点,此乃大型后端项目急切所需之特质 。
核心启示:后端开发的杠杆效应
后端开发的复杂程度,通常不是源自“难题”自身,而是源自对已被解决问题的糟糕重写了 。
文中提及的每个库,其目的在于,将成百上千行的冗余代码予以替换,把整类的 Bug 加以消除,还要减轻开发者的认知负担。优秀的后端开发者,并非以编写更多代码当作荣耀之事,反而是谋求凭借更好的杠杆作用,去编写更少的代码 。
要是你的后端系统给予你一种沉重之感,且显得缓慢,又或者表现出脆弱之态,这不见得是架构自身的问题所在,而是你的语句层面出现了状况。作出选取更具杠杆用途的库的决策,将精力投放至真正的业务创新范畴当中。
你将会发觉,在你停止忙于“修水管”这件事的时候,你才拥有能够去构建真正价值酌时间。 ,。
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码