IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

后端

共 1964 篇文章

IT 2026-06-03 09:03:24 / 累计浏览 15

The Site-Search Paradox: Why The Big Box Always Wins

网站内部搜索常陷入一个矛盾:尽管数据和技术已大幅进步,用户仍倾向于使用全球搜索引擎来查找特定网站的内容。早期网站搜索功能仅作为导航的补充,类似书后索引,要求用户输入与数据库中完全一致的关键词才能找到结果,否则易返回零结果页面。如今用户期望更智能的搜索体验,但许多网站搜索仍停留在精确字符串匹配阶段,无法理解用户意图。 这种现象的核心原因是“语法税”——即用户被迫猜测网站内部的专有词汇或精确表述。研究表明约半数用户在进入网站后会直接使用搜索功能,若搜索因拼写错误或术语差异失败,用户往往转向Google进行“site:”查询或直接离开网站。作者指出,Google的优势并非仅靠技术实力,更在于其通过词干提取等技术实现上下文理解,而许多网站搜索对此“视而不见”。 传统信息架构常以二元逻辑设计搜索(匹配或不匹配),但现代用户期待概率性结果——即“可能”相关的模糊匹配。文章强调应设计“您是否要找?”状态,而非直接显示无结果。例如当搜索未命中时,可通过元数据建议其他相关类别,保持用户参与。 案例分析进一步证实信息架构对搜索效果的决定性影响。某企业因文档标题使用内部SKU编号导致搜索失效,改用受控词表映射用户语言后,搜索页面退出率下降40%。另一金融机构因“贷款结清”与“贷款释放”术语差异导致搜索零结果,添加隐藏关键词后解决了高昂的客服成本问题。 为优化搜索体验,作者提出四步审计框架:分析零结果查询以识别内容缺口、同义词缺口或格式缺口;根据查询意图(导航型、信息型、交易型)设计不同交互;测试模糊匹配能力;优化过滤器的相关性。最终应将搜索视为与用户的对话——通过语义关联、预测性建议和人性化设计,让搜索栏成为理解用户需求的桥梁,而非简单罗列链接的工具。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 12

Vibe新开源项目 - Vaala AI Gateway

Vaala AI Gateway 是一个开源的分布式AI网关项目,旨在解决现有方案在跨国、跨地域部署时面临的性能与架构问题。作者指出,当前主流网关(如One-API、New-API)在集群模式下依赖底层数据库(Redis/MySQL)进行数据同步,导致跨区域调用延迟高、优化困难,且难以灵活应对不同地域供应商的地理封锁。 该项目采用主从架构,分为 Master(控制面,管理数据与同步)和 Agent(数据面,处理用户请求)两种角色。设计核心是基于PACELC理论,在网络分区容忍性(P)前提下优先保证高可用性(A)与低延迟(L),接受一定程度的数据最终一致性。数据同步采用异步复制方式,通过WebSocket长连接实现Agent从Master获取所需数据,从而支持纯本地化的请求处理,大幅降低跨域调用延迟。 在协议支持方面,网关内置中间协议层,以统一处理OpenAI Chat、Response及Claude Messages等多种API格式,便于扩展与转换。作者强调该项目完全由AI生成代码,并分享了AI辅助开发的实践经验:AI擅长快速生成样板代码和原型,但架构决策、并发状态管理等核心设计仍需人工主导。项目部署简单,提供单二进制文件,无外部依赖。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 6

Skynet 升级到 Lua 5.5.0

Skynet 随 Lua 5.5.0 正式发布完成了版本升级。Skynet 维护的定制版 Lua 核心特性是允许跨虚拟机共享函数原型,以此节省服务初始化时间和内存。实现此功能的关键难点在于正确处理短字符串内部化(interning)与外部导入原型中字符串的共存问题,该问题通过专门的补丁解决,副产品是支持了跨虚拟机共享只读常量表(可通过 skynet.sharetable 使用)。然而,鉴于 Lua 5.5 引入的 external strings 特性已大幅提升字节码加载速度,建议新项目避免依赖该补丁功能,以降低维护成本。 Lua 5.5 基本兼容 5.4,大多数 Skynet 项目无需大改,但升级后务必充分测试,并使用 `make cleanall` 强制重新编译 Lua。此次升级带来了多项有益改进:新增 `global` 关键字有助于减少拼写错误;分代垃圾回收(GC)改为步进式执行,解决了过去处理大内存服务时的停顿问题;新的不定长参数语法 `...args` 允许以表格形式访问参数,能简化部分代码实现。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 6

soluna 外挂 C 模块

soluna 默认静态链接 Lua 虚拟机,导致无法直接外挂动态链接的 C 扩展,因为动态链接会引入多份 Lua 实现,引发运行时错误。根源在于 Lua 中全局空对象的静态引用机制:多份实现会生成多个空对象,运行时比较时出现不一致。虽然 Lua 5.4 后将空对象移入运行期结构以缓解问题,但作者仍强调应避免多份实现。Windows 平台因 DLL 必须编译时绑定所有符号,问题尤为突出。 为解决此问题,soluna 采用新方案:外部 C 扩展库链接代理模块 extlua.c,该模块不依赖 Lua 内部实现,而是利用 lua_getextraspace 宏注入 Lua C APIs。外部库需定义 extlua_init 入口函数,在其中调用 luaapi_init 注入 APIs,再通过 luaL_newlib 注册模块函数。soluna 的加载器通过创建临时虚拟机、传递 APIs 引用并复制入口表来完成动态加载。这种方法同时兼容动态库

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 12

Cloudflare 创业扶持计划申请经验

该文详细记录了作者申请并成功获批Cloudflare创业扶持计划5000美元额度的全过程。该计划自2023年9月起提供最高25万美元的云资源,额度在审批后一年内有效。申请核心条件包括公司成立不超过5年、处于软件产品开发阶段、获得5万至500万美元融资,以及拥有有效官网和公司域名邮箱;实际审核较为灵活,无需额外营业执照。 作者分享的关键经验是:申请时需准备可访问的产品官网,并最好已有Cloudflare服务使用记录(如R2、Workers)以增加可信度。在申请表的Comments部分应详细阐述产品定位、团队及未来规划。审核周期约两周。 获批额度主要用于抵扣Workers、Argo流量、R2存储等按量计费产品的费用。值得注意的是,Pro/Business等订阅类产品的月费会直接显示为0美元但不消耗该额度;域名注册费完全不覆盖,且R2或Cache服务的额度消耗上限为5000美元。目前,用户无法在控制台直接查看余额,只能通过账单左上角的剩余额度信息来确认使用情况。作者建议面向海外市场的创业者积极申请,但务必合规使用。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 8

Go之禅 - 基于Rob Pike思想的Go语言哲学

本文系统阐述了 Rob Pike 思想下 Go 语言的核心设计哲学,其精神可凝练为对简单、清晰与组合的极致追求。哲学强调代码应直接解决问题,拒绝过度聪明的炫技,优先保障可读性。在架构上,Go 抛弃了传统的类继承,转而采用更灵活的接口和结构体嵌入来实现组合。对于接口,推崇小而专注的设计,主张通过实际使用来发现接口,避免预先设计庞大复杂的契约。并发模型是其另一大支柱,明确区分了并发(结构)与并行(执行),并通过“通过通信共享内存”的 channel 机制,为安全高效的并发提供了原生支持,避免了昂贵的互斥锁开销。错误处理上,Go 将错误作为一等值进行显式返回与处理,而非依赖异常机制,这使得程序的控制流和异常路径更加清晰可见。此外,哲学还包括拥抱 gofmt 实现的强制代码风格统一、在简单重复与引入复杂依赖间做出务实权衡、聚焦于优化算法与选择恰当数据结构等实践准则。总体而言,Go 之禅体现了一种实用主义语言设计观,它不追求语言特性的繁复,而是致力于提供一套简洁有效的工具组合,以帮助开发者写出可靠、高效且易于维护的系统。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 45

SmartPerfetto 架构文章 Q&A:8 个深度技术问答

文章深入解析了SmartPerfetto架构的核心设计哲学,重点阐述了其在确定性约束与Agent自主性之间的平衡策略。关键机制在于三层配合:Strategy文件以声明式规则定义分析必须完成的步骤与硬性约束,Planning Gate强制Agent在执行前提交计划以确保规划纪律,而Verifier则在事后对关键分析动作进行多维度检查与纠错。这使得系统对核心分析路径(如滑动卡顿的根因深钻)施加强约束,而在探索性环节保留灵活度。 文章澄清了Agent与Workflow的本质区别,指出决策权分配应因环节而异。SmartPerfetto在数据收集阶段采用类似SOP的确定性策略(Workflow),而在需要因果推理和归纳的归因阶段充分信任LLM的自主能力(Agent)。其最终架构选择基于Claude Agent SDK,并叠加了场景分类、策略注入、验证纠错等自建约束层,而非固定控制流的ReAct或LangGraph。这一选择源于性能分析路径的不可预测性,使LLM能根据运行时数据自主选择分析路径,同时通过约束框架确保分析深度与完整性,定义了由观测能力、约束框架与反馈质量共同决定的Agent能力边界。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 19

从「能用」到「好用」:LLM 流式响应实现方式的探索之路

在LLM应用开发中,Server-Sent Events已成为实现流式响应的事实标准,它基于HTTP协议轻量地实现实时数据推送。文章深入探讨了如何将SSE接口从基础的“能用”状态优化至“好用”层面。传统请求-响应模式需等待完整生成结果,而流式输出能实时展示模型的思考过程、工具调用及逐字生成内容,显著提升交互体验。基础实现虽简单——仅需设置正确的Content-Type和逐块写入事件流,但生产级应用需解决事件抽象、组件复用及优雅取消请求等挑战。作者通过实际编码演示,逐步拆解设计思路,引导读者掌握构建高效、可维护流式响应架构的方法,最终实现从功能演示到工程化实践的跨越。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 11

1Panel 部署 FastAdmin 管理端访问 302 解决方案

最近使用 1Panel 面板部署 FastAdmin 项目用于测试,站点的伪静态选择 thinkphp,在部署完成后发现用户端可以正常访问,而管理端则会无限制重定向到 login/index,最终提示 “重定向次数过多...” 如下图所示:

69512629b7d35.png

经过排查 发现问题出现在 1Panel 自带的 fastcgi-php.conf 上这个文件上,如图 21 行:

6951265f7e3d7.png

解决方案是注释掉这一行,然后使用 fastadmin 官方推荐的 fastcgi 配置,代码如下:

location ~ [^/]\.php(/|$) {
        fastcgi_pass 127.0.0.1:9000; 
        # include fastcgi-php.conf;  # 注释掉这一行或者直接复制我的示例代码
        include fastcgi_params; 
        fastcgi_index index.php; 
        fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
        fastcgi_param PATH_INFO $fastcgi_path_info; 
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    }

保存修改的配置后,fastadmin 管理端入口即可正常访问:

695126aa44428.png

使用版本为 1Panel 2.0.16, OpenResty 版本为 1.27.1.2-2-3-focal

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 11

解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题

在常见的Nginx反向代理后端Java应用的部署架构中,客户端与Nginx之间为HTTPS,但Nginx转发至后端服务器的请求协议为HTTP。这会导致后端应用通过`HttpServletRequest.getRequestURL()`获取到的URL为内网HTTP地址,且`HttpServletResponse.sendRedirect()`生成的重定向地址也为HTTP,无法反映真实的客户端访问协议。 解决此问题需结合Nginx配置与后端代码调整。对于URL获取问题,需在Nginx中通过`proxy_set_header Host $host`和`proxy_set_header X-Forwarded-Proto $scheme`向后端传递原始主机名与协议信息。后端Java应用则需通过自定义Servlet过滤器,读取`X-Forwarded-Proto`头并重写请求的`getScheme()`与`getRequestURL()`方法,确保返回正确的HTTPS URL。对于重定向问题,可通过Nginx的`proxy_redirect http:// $scheme://`指令,将后端响应中的Location头协议自动修正。 当架构中Nginx前存在负载均衡器时,需由负载均衡器透传`X-Forwarded-Proto`头,同时将Nginx配置中相关的`$scheme`变量替换为`$http_x_forwarded_proto`,以正确识别和传递最前端的访问协议。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 12

第一章:分布式系统概述

本文从集中式单机系统与分布式系统的对比切入,阐述了分布式系统的基本概念与核心动机。集中式系统简单直接,但受限于单点故障和硬件扩展瓶颈。分布式系统通过网络连接的多节点协作,实现了横向扩展、高可用性、地理位置亲和性等优势,能够满足高性能、大容量数据存储及业务天然分布等需求。文章明确定义了分布式系统:其组件分布于不同计算机上,通过消息传递进行通信与协调。系统主要特点包括:节点独立拥有资源并通过网络通信,缺乏全局统一时钟,需协同完成共同任务。然而,这种架构也引入了网络不可靠、时钟不同步和部分失效等典型挑战,要求设计者从追求绝对确定性转向在一致性与可用性间进行权衡。理解这些基础概念是构建可靠分布式系统的前提。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 10

第三章:分布式系统中的时间和顺序

在分布式系统中,事件顺序决定系统最终状态,是核心问题。由于节点间缺乏统一的物理时间基准,依赖物理时钟对比事件先后既不精确又易出错,一旦顺序错乱将导致状态不一致。因此,引入逻辑时钟来定义事件的逻辑先后顺序。文中进一步澄清了偏序与全序的数学概念,解释并发事件的存在,并指出向量时钟是逻辑时钟的扩展,能更精细地捕获因果关系。文章还阐释了状态、事件与快照的定义:状态是数据值的集合,事件是改变状态的操作(如写请求),快照则是特定时刻的状态切片。其核心在于,如同状态机复制思想所述,只要保证多个副本以相同顺序处理相同事件,就能获得一致的状态,而逻辑时钟正是为跨节点维护这种顺序提供了理论基础。

本机暂存
IT 2026-06-03 09:03:24 / 累计浏览 9

有惊无险的一次网站系统升级

本次系统升级涉及操作系统、PHP、Apache及MySQL等多个组件的跨版本升级。作者将运行超过十年的老旧系统从Ubuntu早期版本逐步升级至2024 LTS,其中MySQL从4.x版本强制升至8.x版本引发的字符集问题尤为棘手。博客数据库原采用GBK编码存储,升级后字段编码信息丢失导致内容显示为乱码。作者通过查阅官方文档、社区求助及本地实验,最终采用二进制模式导出数据库,并编写Lua脚本智能解析导出文件,准确识别并转换其中的GBK内容,同时保留混杂的UTF-8数据片段,成功完成向UTF-8的迁移。整个过程体现了对历史遗留数据的审慎处理,包括备份验证、分段转换、语法校验等关键步骤。升级后系统运行稳定,预计可支持长期使用。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 10

扫描全国的公网IP需要多久?

作者基于个人兴趣,在一台旧款4核迷你主机的家庭网络环境下,测试了扫描中国大陆所有公网IP地址的耗时。最终扫描约3.43亿个地址,发现其中约592万个IP可达,总耗时约1小时2分58秒。该测试旨在探索使用单台设备探测全国范围内运营商与云服务商网络连通性、识别故障或劫持情况的技术可行性。 文章核心是介绍了一款由作者重构的网络扫描程序的实现。新版本摒弃了之前依赖libpcap库的gopacket方案,完全基于Go标准库中的icmp与ipv4扩展包构建,无需启用CGO,便于部署与编译。程序架构采用并发模型,主要由三个goroutine协作:一个负责解析APNIC提供的IP网段列表并分发任务;一个负责批量构造并发送ICMP回显请求报文;一个负责监听并接收ICMP回显应答,最终将存活IP输出。代码通过设置BPF过滤器优化性能,并使用进程ID作为ICMP报文标识以准确匹配响应。整个扫描引擎仅约200行代码,展示了使用Go语言进行高效网络编程的典型范例。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 9

啥时候等到Go官方支持SIMD?

Go语言目前缺乏官方的SIMD(单指令多数据流)支持,这一议题在官方问题追踪中持续讨论但进展缓慢。SIMD能显著提升图像处理、机器学习等计算密集型任务的性能,是C++、Rust等语言已具备的能力。Go语言追求简洁性与可移植性,而SIMD实现需针对不同硬件架构进行优化,两者存在设计冲突,导致官方支持犹豫不决。当前,标准库中已局部引入SIMD指令(如Go 1.24中Swiss Tables的实现以及crypto/sha256包),但编译器并未提供自动向量化功能。社区为弥补空缺,开发了第三方库如kelindar/simd、alivanz/go-simd和pehringer/simd,它们通过汇编或自动向量化技术在Go中实现了SIMD操作,但这些方案需要开发者自行管理,可移植性和维护性有限。总体而言,Go在高性能计算领域的潜力受限于SIMD支持的缺失,未来官方的整合将对性能优化至关重要。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 9

zerotier moon server

该教程详细介绍了如何在自有服务器上部署ZeroTier Moon服务器及其Web管理界面ztncui。首先需开放UDP 9993端口,通过官方脚本安装ZeroTier并生成服务器身份文件。核心步骤是在moon.json配置文件中添加服务器的公网IP地址作为稳定端点,随后生成签名后的moon文件并将其放入moons.d目录以重启服务生效。 管理界面部署部分依赖Node.js环境,通过克隆ztncui项目并安装依赖完成。关键配置在于.env文件中需填入ZeroTier认证令牌,并可通过修改参数控制Web服务监听端口及网络暴露范围。教程强调了通过SSH端口转发或HTTPS进行安全访问的必要性,以避免HTTP明文传输风险。最后,使用pm2实现服务常驻运行,并通过Web界面创建网络、生成地址,最终在客户端加入网络并经批准完成组网。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 10

解析到本地127的神奇域名

本文探讨了 Web 本地开发中,除 `127.0.0.1` 与 `localhost` 外,可专门解析到本地回环地址的实用域名及其应用场景。作者梳理了多个稳定可用的选项:**localhost** 及其子域名作为 IETF 官方规范,通用性最强;**lvh.me** 因其极短长度和泛域名支持,成为日常开发优选;**nip.io** 及其 **local.gd** 服务则提供了基于 IP 生成域名的灵活方案;此外还有如 **fbi.com** 等趣闻域名。这些本地域名主要解决了使用纯 IP 地址开发时面临的局限:它们能更好地模拟真实环境,支持 **Cookie 的子域名共享**;满足 OAuth 等服务商要求必须使用域名作为回调地址的强制规定;在同时开发多项目或多租户系统时,能通过清晰的子域名(如 `project-a.lvh.me`)进行区分,避免端口号混乱;同时也有助于构建与生产环境一致的多模块(如 admin、api)访问结构,实现代码逻辑的无缝迁移。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 7

Java|FreeMarker 复用 layout

在 FreeMarker 项目中,页面布局的重复代码会随着页面增多而扩散,导致维护困难。常规的 include 指令可以提取公共头部和底部等元素,但每个页面仍需手动组合完整结构,一旦布局变更,修改成本较高。为消除这种重复,可以通过抽象布局模板来优化:利用 FreeMarker 的 macro 功能,定义一个统一的页面布局文件,其中包含固定组件并接收页面内容和脚本作为参数。具体页面只需导入该模板,并通过变量分配填充内容,从而实现布局与内容的分离。进一步,借助编辑器的代码片段功能,如 VSCode 的 code

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 15

MinIO 社区版 Web 管理界面被删事件全解析

MinIO社区版近期通过删除11万行代码,移除了其Web管理界面的核心功能。更新后,界面仅保留基础对象浏览能力,用户无法再通过浏览器进行用户管理、策略配置等关键运维操作,所有管理任务被强制迁移至mc命令行工具。 官方解释此举是为了减轻同时维护社区版与商业版图形界面的成本负担。然而,社区普遍质疑这一决定缺乏事先沟通,认为其本质是通过削弱开源版本功能来引导用户转向付费产品的商业策略。此举显著增加了非技术用户和团队的管理门槛,引发了用户不满与生态信任危机。 事件发生后,社区迅速行动,发起了OpenMaxIO等分支项目以尝试恢复被移除的功能,同时SeaweedFS、Garage等其他对象存储方案也获得了更多关注。这一事件凸显了开源项目在商业化进程中平衡社区利益与商业目标所面临的挑战。对于现有用户,如需继续使用Web界面,可暂时回退至部署镜像标签为 minio/minio:RELEASE.2025-04-22T22-12-26Z 的旧版本。

本机暂存
IT 2026-06-03 09:03:23 / 累计浏览 11

利用短信模板提取短信变量

本文针对业务系统需兼容不同短信平台(部分要求传递模板变量,部分要求传递原文)的需求,提出一种基于正则表达式自动从短信原文中提取模板变量的解决方案。核心思路分为三步:首先,利用正则匹配模板中的变量标签(如 `${...}`),提取出所有变量名组成键数组;其次,将模板中的变量标签部分替换为通用正则捕获组 `(.*)`,形成一个用于匹配短信原文的正则表达式,并提取出对应值数组;最后,将键数组与值数组组合,生成平台所需的参数格式。文章以一个包含多个变量的复杂短信为例,详细展示了PHP实现过程,并指出使用该方法时需注意变量标签需转义正则字符、模板变量不可连续或嵌套等约束条件,为多平台短信发送场景提供了一种灵活的适配思路。

本机暂存