edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

Spring Boot 配置加载:环境变量与配置文件谁生效

修改配置文件以后应用仍使用旧地址,排查应确认最终生效值,而不是只比较仓库里的文本。启动参数、环境变量、Profile 与外置配置可能覆盖包内默认设置。

修改配置文件以后应用仍使用旧地址,排查应确认最终生效值,而不是只比较仓库里的文本。启动参数、环境变量、Profile 与外置配置可能覆盖包内默认设置。 配置来源有优先顺序,激活的 Profile 还会选择不同文件。打包产物与运行目录中的配置不一定相同,容器创建时读取的环境也不会因编辑 .env 自动刷新。 一、问题的范围与前提 应用配置、依赖注入、连接池和事务共同决定运行结果。启动...

Docker 服务名访问:为什么 localhost 找不到另一个容器

应用与数据库各自启动正常,但应用连接 localhost 失败。容器网络隔离让同一个地址在不同环境里代表不同目标,应先画出发起请求的一方。

应用与数据库各自启动正常,但应用连接 localhost 失败。容器网络隔离让同一个地址在不同环境里代表不同目标,应先画出发起请求的一方。 同一用户自定义 bridge 网络上的容器可以使用网络内服务名。localhost 指当前网络命名空间自身,发布端口面向宿主机入口,而容器间通信使用目标容器端口。容器重建还可能更换 IP。 一、问题的范围与前提 镜像、容器、网络和数据卷是不同对...

Redis 缓存更新:过期策略与数据库一致性

数据库已经修改,页面仍显示旧值,常见原因是缓存没有按同一个业务键失效。缓存提升读取速度,同时也增加了一份数据副本,需要写清什么时候可以使用旧值。

数据库已经修改,页面仍显示旧值,常见原因是缓存没有按同一个业务键失效。缓存提升读取速度,同时也增加了一份数据副本,需要写清什么时候可以使用旧值。 缓存旁路模式通常先读缓存,未命中再查数据库并填充;写入与缓存失效之间存在并发窗口。TTL 限制旧数据保留时间,却不能保证强一致。热点键同时过期还可能把大量请求打到数据库。 一、问题的范围与前提 数据库连接、事务、SQL 执行和数据结果应分...

数据库事务:提交、异常回滚与跨接口一致性

一个业务动作更新多张表,如果中间异常,只恢复页面提示还不够,数据库可能已经留下部分状态。事务设计应从完整业务动作开始,而不是每条 SQL 各自提交。

一个业务动作更新多张表,如果中间异常,只恢复页面提示还不够,数据库可能已经留下部分状态。事务设计应从完整业务动作开始,而不是每条 SQL 各自提交。 事务提供一组操作的提交边界,隔离级别决定并发可观察行为。应用异常不必然触发数据库回滚,连接复用也可能保留事务状态。跨数据库或外部接口不在同一本地事务的原子范围内。 一、问题的范围与前提 数据库连接、事务、SQL 执行和数据结果应分别验...

MySQL 慢查询:先读执行计划再添加索引

页面列表越来越慢时,给每个字段添加索引并不能保证改善。问题可能是扫描范围、排序、连接顺序或返回数据量,应先保留原 SQL 和实际查询条件。

页面列表越来越慢时,给每个字段添加索引并不能保证改善。问题可能是扫描范围、排序、连接顺序或返回数据量,应先保留原 SQL 和实际查询条件。 索引用于缩小定位和排序成本,但维护索引会增加写入开销。联合索引的列顺序影响可利用前缀,条件选择性和数据分布影响优化器判断。EXPLAIN 展示计划线索,不自动给出真实执行耗时。 一、问题的范围与前提 数据库连接、事务、SQL 执行和数据结果应分...

Nginx 反向代理路径:多一个斜杠为何请求不同

浏览器访问 /api 正常,经过反向代理以后后端却收到不同路径。很多此类问题来自 location 与 proxy_pass 的 URI 处理,不应首先怀疑数据库或鉴权。

浏览器访问 /api 正常,经过反向代理以后后端却收到不同路径。很多此类问题来自 location 与 proxy_pass 的 URI 处理,不应首先怀疑数据库或鉴权。 代理可以保留原 URI,也可以使用指定 URI 替换匹配前缀。尾部斜杠改变替换关系;应用还可能依赖 Host、客户端地址与协议头。路径路由、请求转发与响应跳转需要分别对照。 一、问题的范围与前提 浏览器所看到的页...

用 systemd 管理后台服务:启动、退出和日志

终端里长期运行的程序,需要在主机启动后自动运行,并能保留退出原因。把命令追加一个 &,只解决当前终端阻塞,无法明确描述运行用户、工作目录和恢复条件。

终端里长期运行的程序,需要在主机启动后自动运行,并能保留退出原因。把命令追加一个 &,只解决当前终端阻塞,无法明确描述运行用户、工作目录和恢复条件。 systemd 单元保存服务生命周期,Type=simple 的程序应在前台运行,由服务管理器跟踪主进程。WorkingDirectory、User、Environment 与 ExecStart 构成运行上下文;Restart 处理...

Docker 数据卷:容器删除后哪些数据还能保留

应用重建以后出现空目录,并不一定是数据被删除,也可能是卷名或挂载目标改变。部署前应先把程序文件、运行配置、可重建缓存和必须保存的业务数据分开。

应用重建以后出现空目录,并不一定是数据被删除,也可能是卷名或挂载目标改变。部署前应先把程序文件、运行配置、可重建缓存和必须保存的业务数据分开。 容器可写层随容器生命周期变化,命名卷独立保存数据,bind mount 则映射指定宿主机路径。挂载会遮蔽镜像中相同位置的内容;匿名卷、命名卷与目录映射也有不同的发现和管理方式。 一、问题的范围与前提 镜像、容器、网络和数据卷是不同对象。镜像...

Linux 服务访问失败:从监听端口找到实际进程

进程存在、启动脚本返回成功,浏览器却连接不上。排查需要先确定请求发送到哪里、哪个进程实际监听、监听范围是否包含目标网卡。仅比较进程名称,容易把旧进程与新实例混在一起。

进程存在、启动脚本返回成功,浏览器却连接不上。排查需要先确定请求发送到哪里、哪个进程实际监听、监听范围是否包含目标网卡。仅比较进程名称,容易把旧进程与新实例混在一起。 TCP 监听属于具体地址与端口的组合。127.0.0.1 只接受本机路径,0.0.0.0 表示 IPv4 的所有本机接口,二者与防火墙允许范围仍是不同条件。连接拒绝、连接超时和 HTTP 错误发生在不同层次,不能都解释为应用...

用 Docker Compose 部署 Web 服务:网络、数据与故障恢复

从一个可验证的小服务开始,把容器网络、持久化、健康检查和故障恢复的条件写清楚。

把程序放进容器并不难,难的是换一台机器仍能启动,重建服务以后数据还在,出了问题能够判断故障发生在哪一层。对于一套由 Web 应用和缓存组成的小系统,部署方案至少要回答四个问题:应用如何连接依赖,哪些端口对外开放,数据存在哪里,以及服务异常后怎样恢复。 这篇以一个简单的 Python Web 服务为例,讨论如何用 Docker Compose 管理应用与 Redis。重点放在部署边界和可验证...