<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[daihaoxin的专栏]]></title><description><![CDATA[学习是一条令人时而喜极若狂、时而郁郁寡欢的道路。]]></description><link>https://blog.youkuaiyun.com/daihaoxin</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; daihaoxin]]></copyright><item><title><![CDATA[脱离 Spring Boot 官方 Parent 之后，我才弄懂 Maven 的 -D 参数真相]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/161122335</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/161122335</guid><author>daihaoxin</author><pubDate>Fri, 15 May 2026 22:44:07 +0800</pubDate><description><![CDATA[摘要：本文揭示了Java开发中常见的Maven命令参数-D的本质，指出它只是向Maven上下文注入全局属性，而非Java或Spring的特殊指令。作者通过重构企业框架的经历，剖析了参数传递的三层机制：JVM系统属性、Maven全局属性和插件中转。文章还解释了maven.test.skip等"魔法"参数的工作原理，并分享了企业框架设计中的"紧急逃生口"实践。最后强调，从"使用轮子"到"理解轮子"是技术进阶的必经之路。]]></description><category></category></item><item><title><![CDATA[MySQL 软删除 (Soft Delete) 与唯一索引 (Unique Constraint) 的冲突与解决]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/110238557</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/110238557</guid><author>daihaoxin</author><pubDate>Thu, 04 Dec 2025 14:29:12 +0800</pubDate><description><![CDATA[本文探讨了MySQL中软删除与唯一性约束的冲突问题及解决方案。当数据被软删除（标记而非物理删除）时，传统唯一索引会导致无法重新创建同名记录。常见方法如联合唯一索引或应用层校验都存在缺陷。作者提出利用MySQL生成列的特性：创建一个虚拟列，仅在未删除时存储原值（触发唯一约束），删除时设为NULL（允许重复）。通过在该列建立唯一索引，完美实现了保留删除记录的同时确保活跃数据的唯一性。文章还提供了SQL实现方案和Spring Data JPA的适配建议，为类似场景提供了最佳实践。]]></description><category></category></item><item><title><![CDATA[解密 `StringHttpMessageConverter` 如何破坏你的 `Result＜T＞` 封装]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/106445495</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/106445495</guid><author>daihaoxin</author><pubDate>Mon, 27 Oct 2025 23:20:35 +0800</pubDate><description><![CDATA[Spring Boot 应用中，当使用 ResponseBodyAdvice 统一封装 API 响应时，返回 String 类型会出现异常，响应变成 text/plain 格式的字符串而非预期的 JSON 结构。]]></description><category></category></item><item><title><![CDATA[构建优雅的 Spring Boot Starter：Bean 注册与属性绑定的两大机制]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/105474036</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/105474036</guid><author>daihaoxin</author><pubDate>Mon, 20 Oct 2025 04:31:23 +0800</pubDate><description><![CDATA[本文深入解析了Spring Boot Starter中Bean初始化和配置属性绑定的核心机制，指出最佳实践。1）避免直接在Starter中使用@Component注解，因其依赖组件扫描且不可控；2）推荐使用自动配置机制，通过@AutoConfiguration和条件注解实现按需加载；3）配置属性绑定需配合@ConfigurationProperties和@EnableConfigurationProperties使用，确保条件化注册。文章强调自动配置是Starter开发的唯一推荐方案，能提供可控组件集成方式]]></description><category></category></item><item><title><![CDATA[构建优雅的 Spring Boot Starter：深入掌握国际化与配置覆盖的最佳实践]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/131471988</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/131471988</guid><author>daihaoxin</author><pubDate>Sun, 19 Oct 2025 19:40:21 +0800</pubDate><description><![CDATA[在微服务与组件化盛行的时代，Spring Boot Starter 已成为封装通用能力的首选。但一个优秀的 Starter 不仅要功能强大，更应具备良好的灵活性。本文将直面一个经典挑战：如何为 Starter 内的提示与异常信息提供默认的国际化（i18n）支持，同时允许使用它的主应用（Consumer）轻松覆盖这些翻译？我们将深入 Spring `MessageSource` 的核心，揭示其强大的父子级联机制 (Parent-Child Chaining)，并提供一套经过实战检验的“可覆盖”国际化方案。]]></description><category></category></item><item><title><![CDATA[告别混乱，拥抱有序：为什么你的下一个ID生成器应该是ULID，而不是UUID]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/105159879</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/105159879</guid><author>daihaoxin</author><pubDate>Sun, 19 Oct 2025 04:40:50 +0800</pubDate><description><![CDATA[还在忍受UUID的无序之痛吗？其纯随机性是日志追踪和数据库性能的噩梦。ULID作为现代替代方案，巧妙结合48位时间戳与80位随机数，实现了ID的字典序排序。这不仅让日志分析一目了然，还因其单调递增特性，大幅提升数据库写入性能，避免索引破碎。无论是追踪ID还是数据库主键，ULID都是追求有序与高效的卓越之选。]]></description><category></category></item><item><title><![CDATA[告别环境地狱，拥抱“零摩擦”：为什么 Volta + pnpm 是你下一代 Node.js 工作流的终极答案]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/105161494</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/105161494</guid><author>daihaoxin</author><pubDate>Wed, 01 Oct 2025 02:53:45 +0800</pubDate><description><![CDATA[传统Node.js开发中，频繁手动nvm use以及版本切换导致pnpm等全局工具失效是常见痛点。
本文主张用Volta替代NVM，打造自动化、零摩擦的工作流。Volta能根据项目package.json的配置，在你进入目录时自动无感切换Node与pnpm版本，无需任何手动命令。它彻底解耦了工具与Node的绑定，确保团队环境的绝对一致与稳定。结合pnpm的高效依赖管理，这套方案能让开发者彻底告别环境混乱，专注于核心工作。]]></description><category></category></item><item><title><![CDATA[LLM：语言的模仿大师，而非世界的理解者——对“幻觉”本质与工程边界的再思考]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/152299417</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/152299417</guid><author>daihaoxin</author><pubDate>Tue, 30 Sep 2025 04:56:49 +0800</pubDate><description><![CDATA[摘要： 大语言模型（LLM）常被拟人化地比作能“思考”或“创造”的智能体，但其本质是概率预测引擎，缺乏真正的世界认知。这种误读导致应用中产生矛盾：LLM既能展现复杂推理能力，又会犯基本错误。其“幻觉”并非记忆失误，而是统计生成的必然结果。要驾驭LLM，需通过检索增强生成（RAG）、思维链推理（CoT）和情境切换等工程方法，构建外部约束系统，将LLM从语言模仿者转变为可靠工具。核心在于接受其概率本质，以外置逻辑弥补其“世界模型”的缺失，实现可控应用。]]></description><category></category></item><item><title><![CDATA[解决 `registry.k8s.io` 拉取镜像慢或失败：配置 Docker 代理一劳永逸]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/150554602</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/150554602</guid><author>daihaoxin</author><pubDate>Mon, 25 Aug 2025 01:38:48 +0800</pubDate><description><![CDATA[本文介绍了如何通过配置Docker全局网络代理解决从registry.k8s.io等国外镜像仓库拉取镜像缓慢的问题。方法包括：创建代理配置文件设置HTTP/HTTPS代理，重载systemd并重启Docker服务，以及验证配置生效。相比手动使用国内镜像源，配置代理能永久生效、适用于所有国外仓库，且部署环境友好。通过简单的四步操作，即可实现稳定快速的镜像拉取，提升开发和运维效率。]]></description><category></category></item><item><title><![CDATA[从手动到自动：我的 Kubernetes NFS 存储之旅]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/150738140</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/150738140</guid><author>daihaoxin</author><pubDate>Mon, 25 Aug 2025 01:23:05 +0800</pubDate><description><![CDATA[Kubernetes存储管理从手动到自动化的实践指南 本文分享了Kubernetes存储管理的实践经验，从静态存储到动态供应的完整解决方案。文章首先介绍了NFS服务器的搭建步骤。然后深入讲解了PV和PVC的静态绑定机制，通过房产中介的比喻形象说明自动匹配逻辑，并对比了手动绑定和自动匹配两种模式的区别。最后，文章将引导读者实现基于StorageClass的NFS动态存储供应，解决手动创建PV的低效问题，充分发挥Kubernetes的自动化优势。整个实践过程循序渐进，适合Kubernetes初学者理解存储管理。]]></description><category></category></item><item><title><![CDATA[k8s之 Pod 资源管理与 QoS]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/110099919</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/110099919</guid><author>daihaoxin</author><pubDate>Sat, 23 Aug 2025 20:14:16 +0800</pubDate><description><![CDATA[本文深入解析Kubernetes Pod资源配置的关键概念，包括资源需求(requests)和限制(limits)的作用区别。资源需求确保Pod获得最低保障资源，影响调度决策；资源限制则防止Pod过度消耗资源。Kubernetes根据这些配置将Pod划分为三种服务质量(QoS)等级：保证型(Guaranteed)、突发型(Burstable)和尽力而为型(BestEffort)，它们决定了资源紧张时Pod的终止优先级。]]></description><category></category></item><item><title><![CDATA[容器安全实践（三）：信任、约定与“安全基线”镜像库]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/102872314</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/102872314</guid><author>daihaoxin</author><pubDate>Sat, 23 Aug 2025 17:50:29 +0800</pubDate><description><![CDATA[本文探讨了容器安全实践中的关键问题与解决方案。针对官方镜像默认以root身份运行的安全隐患，提出通过重构Dockerfile构建安全基线镜像的方法。文章详细展示了如何为Nginx创建非root用户镜像，包括修改配置文件、设置文件权限等具体步骤，并配套Kubernetes的安全部署配置。强调容器安全是一个完整体系，需从镜像构建阶段就开始权限管理，通过信任和约定建立内部的安全基线镜像库。这种安全责任前置的做法，既能确保容器安全，又能简化后续运维流程。]]></description><category></category></item><item><title><![CDATA[容器安全实践（二）：实践篇 - 从 `Dockerfile` 到 Pod 的权限深耕]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/103132713</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/103132713</guid><author>daihaoxin</author><pubDate>Sat, 23 Aug 2025 16:44:47 +0800</pubDate><description><![CDATA[本文深入探讨容器安全实践，重点分析runAsNonRoot的本质意义、镜像构建与运行时权限的契约关系。文章指出runAsNonRoot不仅是简单的安全开关，更是彻底放弃root权限的安全理念。在镜像构建环节，强调&quot;构建时用root，运行时用非root&quot;的黄金法则，详细说明Dockerfile中创建非root用户、处理文件权限等关键步骤。最后，提出Kubernetes部署时的安全配置组合拳，强调容器安全是从镜像构建到Pod运行的全生命周期防护过程。]]></description><category></category></item><item><title><![CDATA[解密 Kubernetes 权限管理：supplementalGroups 的魔力与 fsGroup 的选择]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/105846645</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/105846645</guid><author>daihaoxin</author><pubDate>Sat, 23 Aug 2025 15:55:37 +0800</pubDate><description><![CDATA[本文探讨了Kubernetes中supplementalGroups的作用与使用方法。作为Pod安全上下文字段，它允许为容器进程添加额外组ID，使其能够访问主组之外的资源，而无需更改主身份。supplementalGroups作用于进程组列表，不修改文件；而fsGroup则修改挂载卷的文件所有权。建议根据需要组合使用runAsUser、runAsGroup和fsGroup管理数据卷权限，仅对特殊场景使用suppl]]></description><category></category></item><item><title><![CDATA[容器安全实践（一）：概念篇 - 从“想当然”到“真相”]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/102778607</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/102778607</guid><author>daihaoxin</author><pubDate>Sat, 23 Aug 2025 15:21:26 +0800</pubDate><description><![CDATA[容器安全不能依赖默认配置，共享内核机制使其存在安全风险。默认情况下容器以root用户运行，可能危及宿主机。特权容器(privileged)更危险，几乎等同宿主机root权限。Kubernetes提供了Pod安全策略(PSA)和安全上下文双重防护，建议：1)强制非root用户运行(runAsUser)；2)丢弃所有非必要特权(capabilities)；3)禁止权限提升；4)使用只读文件系统(readOnlyRootFilesystem)。通过Pod级别通用策略和容器级精细配置，构建深度防御体系。]]></description><category></category></item><item><title><![CDATA[告别硬编码：用 Command 和环境变量动态配置 Kubernetes 应用]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/106070605</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/106070605</guid><author>daihaoxin</author><pubDate>Sat, 23 Aug 2025 12:51:07 +0800</pubDate><description><![CDATA[本文探讨了容器镜像中的ENTRYPOINT和CMD指令与Kubernetes Pod配置中command和args字段的关系，介绍了如何通过环境变量实现灵活配置。文章首先解释了Dockerfile中ENTRYPOINT定义主程序、CMD提供默认参数的作用，以及docker run命令如何覆盖这些设置。随后详细说明了Kubernetes中command覆盖ENTRYPOINT、args覆盖CMD的机制，并提供了多个配置示例。最后强调了使用环境变量解耦配置的最佳实践]]></description><category></category></item><item><title><![CDATA[深入理解Kubernetes核心：标签与标签选择器实战解析]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/115400110</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/115400110</guid><author>daihaoxin</author><pubDate>Fri, 22 Aug 2025 21:32:05 +0800</pubDate><description><![CDATA[Kubernetes标签（Labels）和标签选择器（Label Selectors）是资源编排的核心机制。标签是附加到资源的键值对，用于组织和筛选对象，遵循[前缀/]名称的格式规范。标签选择器分为基于等值关系（如=、!=）和基于集合关系（如in、exists）两种，用于查询符合条件的资源。标签用于程序筛选，而注解用于记录非识别性元数据。掌握标签和选择器是高效管理Kubernetes集群的关键。]]></description><category></category></item><item><title><![CDATA[k8s标签深度解析：别再混淆 metadata 和 template 了！]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/117389246</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/117389246</guid><author>daihaoxin</author><pubDate>Fri, 22 Aug 2025 21:02:04 +0800</pubDate><description><![CDATA[Kubernetes YAML文件中顶层metadata.labels和spec.template.metadata.labels的区别： 顶层metadata：标识资源对象本身（如Deployment），用于资源管理和分类 template metadata：定义由控制器创建的Pod的标签，必须包含selector.matchLabels中指定的所有标签。理解这两者的区别对Kubernetes资源管理至关重要。]]></description><category></category></item><item><title><![CDATA[使用 YAML 文件，如何优雅地删除 k8s 资源？]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/103158804</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/103158804</guid><author>daihaoxin</author><pubDate>Fri, 22 Aug 2025 20:19:16 +0800</pubDate><description><![CDATA[本文介绍了两种基于文件删除Kubernetes资源的方法：1）kubectl delete -f直接删除YAML文件中定义的资源，操作简单安全；2）kubectl apply --prune通过比较集群状态与本地文件实现同步删除，适用于GitOps场景但需谨慎使用标签选择器。第一种方法适合日常删除操作，第二种更适合自动化集群管理。两种方法各有优势，可根据实际需求选择使用。]]></description><category></category></item><item><title><![CDATA[深入理解 Kubernetes 网络：四种核心通信模型详解]]></title><link>https://blog.youkuaiyun.com/daihaoxin/article/details/103099043</link><guid>https://blog.youkuaiyun.com/daihaoxin/article/details/103099043</guid><author>daihaoxin</author><pubDate>Fri, 22 Aug 2025 01:02:07 +0800</pubDate><description><![CDATA[本文深入解析Kubernetes网络四大核心通信模型：1)同一Pod内容器间通过共享网络命名空间通信；2)Pod间通过CNI插件实现直接通信；3)Pod通过Service的稳定地址访问服务，由kube-proxy提供负载均衡；4)外部流量通过NodePort/LoadBalancer/Ingress访问集群服务。Kubernetes网络遵循&quot;每个Pod拥有唯一IP&quot;原则，确保透明通信，为微服务架构奠定基础。理解这些模型对构建可靠云原生应用至关重要。]]></description><category></category></item></channel></rss>