技术文档 第2页
Nginx 配双向认证,用客户端证书卡住访客-柚熊闲记

Nginx 配双向认证,用客户端证书卡住访客

双向认证是服务端反过来校验客户端证书。 先备齐 CA 证书、服务端证书和客户端证书。 Nginx 里用 ssl_client_certificate 指向 CA 证书链、ssl_verify_client on 强制校验,ssl_verify_depth 限...
给容器加 healthcheck,别让假活着的进程接流量-柚熊闲记

给容器加 healthcheck,别让假活着的进程接流量

容器显示 Up 不等于服务可用:主进程还活着,但应用已经连不上数据库或端口没在监听,照样会被挂到负载均衡后面接流量。 加 HEALTHCHECK,用 curl 或专门的探活接口定期探测,四个参数都要写:i...
镜像几个 G,用多阶段构建和 .dockerignore 瘦身-柚熊闲记

镜像几个 G,用多阶段构建和 .dockerignore 瘦身

体积大头一般是构建工具链和缓存被留在了运行镜像里。 用多阶段构建:前一阶段装依赖、跑构建,后一阶段只 COPY --from=builder 拿产物,运行镜像换成 alpine 或 slim 这类小基础镜像。 再检查 ...
单元测试里把 HTTP 请求 mock 掉,不打真实网络-柚熊闲记

单元测试里把 HTTP 请求 mock 掉,不打真实网络

单元测试不打真实网络:真接口慢且不稳定,还会污染外部数据,失败原因也说不清。 Python 用 requests_mock 或 responses 把目标 URL 拦下返回固定响应,顺便断言调用参数对不对。 Node 用 nock...
提交信息按约定式写,方便回溯和生成变更日志-柚熊闲记

提交信息按约定式写,方便回溯和生成变更日志

格式是 type(scope): 描述。 type 用固定几个:feat 新功能、fix 修缺陷、docs 文档、refactor 重构、perf 性能、test 测试、chore 构建与杂项。 scope 写模块名。标题一行写完,控制在五十来个...
文件已被跟踪后再写 .gitignore 没用,要先取消跟踪-柚熊闲记

文件已被跟踪后再写 .gitignore 没用,要先取消跟踪

.gitignore 只对还没被跟踪的文件生效,已经进了索引的文件照样会被提交。 正确做法是把它从索引里移除但保留磁盘上的文件:git rm --cached 加路径,这个 --cached 是关键,少了它就是连本地文...
接口被刷,用令牌桶限流并返回 429-柚熊闲记

接口被刷,用令牌桶限流并返回 429

单机用令牌桶:桶容量决定能容忍多少突发,填充速率决定长期平均 QPS。 多实例部署就得把令牌放进 Redis,用 Lua 脚本把取令牌和回填做成一步原子操作,否则并发下必然超发。 超限不要静默丢包...
更新数据库后缓存不一致,先删缓存还是先写库-柚熊闲记

更新数据库后缓存不一致,先删缓存还是先写库

用先更新数据库再删缓存,不要先删缓存。 先删的话,删完之后、写库之前有个空窗,并发读会把旧值重新灌回缓存,脏数据就一直挂着了。 先写库再删,最坏也只是读到稍早的值,下一次读就被纠正。...
事务里调远程接口,长事务怎么划边界-柚熊闲记

事务里调远程接口,长事务怎么划边界

铁律:事务里不做网络调用。远程接口的耗时不可控,会把数据库连接和行锁一起占住,高峰期足以把连接池拖死。 做法是把调用挪到事务外,先提交本地写库,再去调远程;远程失败走补偿,靠重试、...
自定义组件上的 v-model 该怎么实现-柚熊闲记

自定义组件上的 v-model 该怎么实现

Vue 3 把 v-model 拆成 modelValue 属性和 update:modelValue 事件两件事,组件里声明这两个就够了。props 不能直接改,改值必须 emit 出去。 要自定义参数名就写 v-model:title,组件里对应接...
watch 监听对象内部字段变化不触发,deep 该怎么用-柚熊闲记

watch 监听对象内部字段变化不触发,deep 该怎么用

watch 默认只比较引用,同一个对象只改内部字段不会触发回调。 监听 ref 包裹的对象要显式传 deep: true。 监听 reactive 对象本身天然就是深度监听,不用加 deep,但一旦用 getter 写法就退回...
程序卡住不响应,用 strace 看它停在哪一步系统调用-柚熊闲记

程序卡住不响应,用 strace 看它停在哪一步系统调用

分两种情况。进程还在但毫无响应,直接挂上去看它停在哪:strace -p 加 -T 打印每次调用耗时、加 -f 跟住子线程。 屏幕上长时间停着不动的那个调用就是卡点,常见是 read 卡在网络、futex 卡在...
连不上到底是哪一层断的,用 tcpdump 抓包判断-柚熊闲记

连不上到底是哪一层断的,用 tcpdump 抓包判断

判断只看一件事:SYN 有没有被回应。 在客户端抓包,看到反复发 SYN 却收不到 SYN-ACK,说明包被丢在路上,去查安全组、防火墙和路由。 收到 SYN-ACK 但紧接着 RST,说明对端没有进程在监听或策...
系统文件损坏导致各种异常,sfc 和 DISM 的修复顺序-柚熊闲记

系统文件损坏导致各种异常,sfc 和 DISM 的修复顺序

顺序反了会白跑一遍。sfc 是拿本地组件存储里的文件去比对修复,如果组件存储本身已损坏,sfc 修不动。 所以先用 DISM 从微软的源把组件存储修回来,成功后再跑 sfc /scannow。两条都必须用管理...
开机越来越慢,用事件查看器找出拖慢启动的程序-柚熊闲记

开机越来越慢,用事件查看器找出拖慢启动的程序

别靠肉眼猜启动项。任务管理器的「启动」页先看「启动影响」列,把标「高」的非必要项禁用。 要精确定量就打开事件查看器,进应用程序和服务日志 → Microsoft → Windows → Diagnostics-Perfo...
日志平台丢数据,从采集端开始逐段排查-柚熊闲记

日志平台丢数据,从采集端开始逐段排查

日志丢了别猜,从源头一段段对:应用是不是真写了这条日志(本地文件里直接 grep)、采集 agent 有没有读到(看 agent 自身日志和 offset)/传输链路是否限流或断开、最后存储端的查询条件对不...
Nginx upstream 长连接没生效,TIME_WAIT 猛涨-柚熊闲记

Nginx upstream 长连接没生效,TIME_WAIT 猛涨

只写 upstream 里的 server 是不够的,默认对后端走短连接,请求一多后端侧 TIME_WAIT 就猛涨。要显式做三件事:upstream 块里加 keepalive 参数(按后端实例规模配)、proxy_http_version 设为...
单元测试依赖当前时间,怎么让它稳定可重复-柚熊闲记

单元测试依赖当前时间,怎么让它稳定可重复

直接调 datetime.now() 的代码没法稳定测试。做法是把它包一层,注入 Clock 或 now() 函数,测试时传固定时间——Python 用 freezegun 的 freeze_time、Java 用 Clock.fixed()、JS 用 vi.setSys...
配置分环境管理,别把密钥提交进仓库-柚熊闲记

配置分环境管理,别把密钥提交进仓库

密钥进仓库等于泄露,事后删文件也没用,历史里还在。做法:配置按环境拆开,本地用 .env 并加进 .gitignore,仓库只放 .env.example,生产走配置中心或平台 secrets 注入。如果已经提交过,第...
给每个请求打 traceId,把全链路日志串起来-柚熊闲记

给每个请求打 traceId,把全链路日志串起来

入口处生成一个 traceId(网关或第一个中间件),之后所有日志都带上它,这是排查分布式问题最划算的投入。落地要点:traceId 放进 MDC 或请求上下文,让日志框架自动打印,别在每个方法手写参...
只把某一个提交搬到另一个分支-柚熊闲记

只把某一个提交搬到另一个分支

cherry-pick 会把指定提交的改动当作一个新提交打到当前分支。先切到目标分支,再 git cherry-pick <提交号>,可以连着给多个号按顺序应用。有冲突就按普通冲突改,改完 git add 再 git c...
误 reset 或误删分支后,用 reflog 把提交找回来-柚熊闲记

误 reset 或误删分支后,用 reflog 把提交找回来

reflog 记录的是本地 HEAD 的每次移动,误操作后一般 90 天内都还能捞回来。先 git reflog 找到误操作前那一步的提交号,再 git reset --hard <提交号> 回到当时状态。如果是误删分支,用...
调用外部接口时快时慢,先查 DNS 和连接复用-柚熊闲记

调用外部接口时快时慢,先查 DNS 和连接复用

接口时快时慢,先排除 DNS 和连接复用。DNS 慢的特征是偶发几百毫秒、且集中在首次调用,可以本地缓存解析结果并设 TTL,或改用内网直连地址。连接复用看抓包有没有反复出现三次握手就能判断;H...
接口返回超大 JSON,网关直接超时,怎么改-柚熊闲记

接口返回超大 JSON,网关直接超时,怎么改

接口一次返回几十 MB 的 JSON,序列化、传输、前端解析三处都慢,网关也容易超时。按优先级改:一分页,让前端按需拉;二瘦身字段,列表只返回真正用到的列;三确实要全量就改流式输出(NDJSON ...
柚熊的头像-柚熊闲记柚熊3天前
02314
token 一过期前端集体 401,怎么做无感续期-柚熊闲记

token 一过期前端集体 401,怎么做无感续期

常见做法是 access token 设短(15 分钟到 1 小时),另配一个有效期长的 refresh token 只用来换新。前端在响应拦截器里识别 401,判断是「过期」而不是「无效」,就调刷新接口换新 token 再重...
柚熊的头像-柚熊闲记柚熊3天前
03611
分布式锁没释放导致接口全卡住,怎么兜底-柚熊闲记

分布式锁没释放导致接口全卡住,怎么兜底

锁没释放通常不是忘了写释放逻辑,而是释放逻辑没被执行到。两个必做:一是加锁时就设过期时间(Redis 的 SET 带 EX,或 Redisson 的 leaseTime),绝不能设成永不过期;二是释放前校验持有者,...
下游变慢引发雪崩,超时和重试参数怎么设-柚熊闲记

下游变慢引发雪崩,超时和重试参数怎么设

雪崩往往不是下游挂了,而是它变慢之后上游的线程全被占住。三条线:一,超时要短,一般取下游 P99 的 1.5 倍左右,绝不无限等;二,重试要克制,只对幂等且属于网络抖动的错误重试,次数一到两...
柚熊的头像-柚熊闲记柚熊3天前
05512
连接池被打满,请求全部排队超时-柚熊闲记

连接池被打满,请求全部排队超时

先分清是池太小还是连接不还。抓一次线程栈,大量线程卡在获取连接上就是池被打满;再看 active 计数,长期贴着上限不降,多半是慢 SQL 或长事务占住了连接。应急把池上限和数据库 max_connecti...
柚熊的头像-柚熊闲记柚熊3天前
02410
图片没写宽高导致页面抖动,怎么修-柚熊闲记

图片没写宽高导致页面抖动,怎么修

CLS 是元素加载过程中来回跳,主因都是「先渲染后撑开」。修法:给 img 和 iframe 显式写 width 和 height,或者外层套一个 aspect-ratio 容器;字体用 font-display 配合 size-adjust,减少字...
柚熊的头像-柚熊闲记柚熊3天前
03214
快速切换页面导致请求竞态,把旧请求取消掉-柚熊闲记

快速切换页面导致请求竞态,把旧请求取消掉

竞态的表现是后发的请求先返回,先发的结果反而把页面覆盖了。axios 从 0.22 起用 AbortController:组件里建一个 controller,把 signal 放进请求配置,切换页面或重新请求前调用 abort()。取...
柚熊的头像-柚熊闲记柚熊3天前
03611