<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CYK_byte的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/CYK_byte</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; CYK_byte]]></copyright><item><title><![CDATA[SpringBoot 基建篇 - 在企业中如何写好一个分页查询（面试加分）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/154609587</link><guid>https://blog.csdn.net/CYK_byte/article/details/154609587</guid><author>CYK_byte</author><pubDate>Sun, 09 Nov 2025 16:24:51 +0800</pubDate><description><![CDATA[本文介绍了SpringBoot结合DDD领域驱动设计的分页查询实现方案。主要内容包括：1）定义了分页查询通用模型PageResp，封装查询结果、是否有更多数据、下次查询偏移量等关键信息；2）说明代码分层架构（API层、业务编排层、领域层、仓储层和服务层）；3）提供MyBatis Plus集成所需的Maven依赖配置。该方案既支持常规分页查询，也优化了不需要总数统计的场景，为后续DDD实践奠定基础。]]></description><category></category></item><item><title><![CDATA[SpringBoot 基建篇 - 统一返回数据类型、统一异常处理（超详细，可直接使用）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/154288128</link><guid>https://blog.csdn.net/CYK_byte/article/details/154288128</guid><author>CYK_byte</author><pubDate>Sun, 02 Nov 2025 16:49:12 +0800</pubDate><description><![CDATA[本文介绍了如何统一API返回数据类型和异常处理的最佳实践。首先定义了ApiStatus枚举类统一管理状态码，避免魔法数字。然后设计了通用的ApiResp响应结构，包含状态码、消息和可空数据字段，并使用注解优化JSON序列化。最后通过@RestControllerAdvice和@ExceptionHandler实现统一异常处理：将参数错误抛出IllegalArgumentException，其他业务异常抛出IllegalStateException，并自动转换为标准API响应格式。这种设计能提高前后端协...]]></description><category></category></item><item><title><![CDATA[WSL2 - 让 IDEA 的 SpringBoot 应用跑在 Win 的 Linux 子系统中（全流程）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/148714697</link><guid>https://blog.csdn.net/CYK_byte/article/details/148714697</guid><author>CYK_byte</author><pubDate>Tue, 17 Jun 2025 14:13:06 +0800</pubDate><description><![CDATA[本文详细介绍了在Windows 10/11中安装和配置WSL2(Ubuntu子系统)的完整流程。内容包括：1) 检查并开启CPU虚拟化；2) 启用Windows相关功能；3) 安装Ubuntu子系统及设置用户名；4) 管理子系统的启动、停止与切换；5) Windows访问Linux文件系统；6) 子系统备份迁移方法；7) 将IDEA中的SpringBoot项目运行在子系统中。]]></description><category></category></item><item><title><![CDATA[Neovim - 常用插件，提升体验（三）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/148459651</link><guid>https://blog.csdn.net/CYK_byte/article/details/148459651</guid><author>CYK_byte</author><pubDate>Thu, 05 Jun 2025 21:56:01 +0800</pubDate><description><![CDATA[本文介绍了四个Neovim插件配置及其使用：

nvim-tree - 提供文件目录侧边栏，支持文件操作快捷键（新建/删除/重命名等），通过Alt+1切换显示。

lualine - 底部状态栏插件，需配合nvim-web-devicons使用，建议隐藏原生模式提示。

indent-blankline - 通过竖线显示代码缩进层级，光标所在层级会高亮。

telescope - 实现文件搜索功能，依赖gcc编译器和ripgrep工具，支持多种搜索模式。

grug-far - 全局查找替换工具，需要...]]></description><category></category></item><item><title><![CDATA[Neovim - LSP 底层原理，难点配置（二）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/148454458</link><guid>https://blog.csdn.net/CYK_byte/article/details/148454458</guid><author>CYK_byte</author><pubDate>Thu, 05 Jun 2025 16:57:05 +0800</pubDate><description><![CDATA[本文详细介绍了Neovim中的LSP(Language Server Protocol)工作原理及配置方法。LSP作为语言助手协议，通过JSON-RPC标准实现编辑器与语言服务器的通信，提供语法检查、代码补全等功能。配置步骤包括：1)通过Mason包管理器安装语言服务器(如lua-language-server)；2)使用nvim-lspconfig插件连接服务器；3)利用mason-lspconfig插件解决包名映射问题。文章还提供了代理设置和安装过程中常见问题的解决方案，帮助用户构建高效的Neovim]]></description><category></category></item><item><title><![CDATA[Neovim - 打造一款属于自己的编辑器（一）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/148412156</link><guid>https://blog.csdn.net/CYK_byte/article/details/148412156</guid><author>CYK_byte</author><pubDate>Tue, 03 Jun 2025 23:26:46 +0800</pubDate><description><![CDATA[本文介绍了NeoVim的安装与基本配置方法。首先强调了学习NeoVim需要扎实的Vim基础和对技术的热情，否则建议使用传统IDE。随后详细说明了Windows和Unix系统下配置文件的存放位置，并通过"Hello World"示例演示了基础配置。文章还讲解了如何拆分配置文件模块化，提供了基础设置如行号、制表符等的配置代码，并重点介绍了vim.keymap.set()API用于自定义快捷键的方法，包括不同模式下快捷键的定义技巧和常见问题解决方案。最后提及了leader key的概念，为后续更高级的配置打下基础]]></description><category></category></item><item><title><![CDATA[win11 禁用/恢复 内置笔记本键盘（保证管用）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/148212646</link><guid>https://blog.csdn.net/CYK_byte/article/details/148212646</guid><author>CYK_byte</author><pubDate>Sun, 25 May 2025 20:03:01 +0800</pubDate><description><![CDATA[本文介绍了禁用和启用笔记本内置键盘的操作步骤。禁用时需通过设备管理器找到HID Keyboard Device，更新驱动程序并选择HID-compliant device。启用时则反向操作，重新安装标准键盘驱动即可。整个过程需要注意拔除外接设备以避免混淆，操作完成后可在设备管理器中确认状态变化。该方法适用于临时禁用笔记本键盘的场景。]]></description><category></category></item><item><title><![CDATA[Armeria gPRC 高级特性 - 装饰器、无框架请求、阻塞处理器、Nacos集成、负载均衡、rpc异常处理、文档服务......]]></title><link>https://blog.csdn.net/CYK_byte/article/details/142664224</link><guid>https://blog.csdn.net/CYK_byte/article/details/142664224</guid><author>CYK_byte</author><pubDate>Tue, 01 Oct 2024 22:22:57 +0800</pubDate><description><![CDATA[本文所讲的所有特性围绕此例展开2）实现服务端) {${~").build()3）服务启动配置.http(port) // 1.配置端口号.service(.addService(HelloServiceGrpcFacade()) // 2.添加服务示例.build().build()@JvmStatic@BeforeAll//这里启动不是异步的，所以不用 Thread.sleep 等待装饰器主要作用是为了给 服务 或 方法 添加切面逻辑。]]></description><category></category></item><item><title><![CDATA[Armeria - 基于 Armeria 框架构建 gRPC服务]]></title><link>https://blog.csdn.net/CYK_byte/article/details/142618686</link><guid>https://blog.csdn.net/CYK_byte/article/details/142618686</guid><author>CYK_byte</author><pubDate>Mon, 30 Sep 2024 21:12:56 +0800</pubDate><description><![CDATA[配置 Armeria-gRPC 服务（这里没有使用 SpringBoot，默认构建 Bean）这里为了专注 Armeria-gRPC 的处理，使用 map 来替代数据库。Note：JDK 需要 11 及以上，Protobuf3.gradlew 跳过测试并构建，]]></description><category></category></item><item><title><![CDATA[RabbitMQ | HAProxy - 给 RabbitMQ集群 集成负载均衡]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141300811</link><guid>https://blog.csdn.net/CYK_byte/article/details/141300811</guid><author>CYK_byte</author><pubDate>Sun, 18 Aug 2024 16:50:31 +0800</pubDate><description><![CDATA[试想一个问题：当 RabbitMQ 一个集群中有 3 个节点时，我们写代码时，因该访问哪个节点呢？当然时任意一个节点都可以~如果配置文件中写死访问的是 node1，但是 node1 挂了，不就是变相的等于 mq集群 整体不可用了吗，所以最好是有一个统一的入口，一个节点故障时，流量可以及时转移到其他节点.如果所有客户端都和 node1 建立连接，那么 node1 的负担会大大增加，而其他节点的负担不大导致资源浪费.2）使用 HAProxy 就可以实现流量的负载均衡.]]></description><category></category></item><item><title><![CDATA[RabbitMQ集群 - 仲裁队列、Raft协议（最详细的选举流程）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141285666</link><guid>https://blog.csdn.net/CYK_byte/article/details/141285666</guid><author>CYK_byte</author><pubDate>Sun, 18 Aug 2024 14:29:34 +0800</pubDate><description><![CDATA[1）RabbitMQ 普通队列在一个节点宕机之后，其他节点无法读写宕机节点的队列，为了解决这个问题，引入了仲裁队列.2）仲裁队列通过 Raft 协议，实现了不同节点间队列消息数据的复制，使得在 创建这个队列的节点 宕机时，其他节点仍然可以使用该队列进行服务.Ps：仲裁队列时 RabbitMQ3.8 版本的重要改动，是 镜像队列 的替代方案（设计上有缺陷）. 镜像队列已被弃用，并计划在将来的版本中移除.]]></description><category></category></item><item><title><![CDATA[RabbitMQ集群 - 普通集群搭建、宕机情况]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141279540</link><guid>https://blog.csdn.net/CYK_byte/article/details/141279540</guid><author>CYK_byte</author><pubDate>Sat, 17 Aug 2024 14:53:49 +0800</pubDate><description><![CDATA[1）普通模式中所有节点没有主从之分，所有节点的元数据（交换机、队列、绑定等）都是一致的.例如只要有任意一个节点上面 新增交换机， 那么这个交换机的元数据也会被复制到其他节点上.2）比较特殊的是队列，队列中的消息数据只保存在创建他的节点上，其他节点只保存元数据（队列名称、配置...）和指针（指向创建该队列的节点）例如 node1 创建 cyk.queue，那么 node2 只保存 队列的元数据 和 指向 node1 节点的指针，而 cyk.queue 中的消息，只会存在于 node1 节点中。]]></description><category></category></item><item><title><![CDATA[RabbitMQ应用问题 - 消息顺序性保证、消息积压问题]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141105271</link><guid>https://blog.csdn.net/CYK_byte/article/details/141105271</guid><author>CYK_byte</author><pubDate>Sun, 11 Aug 2024 16:52:11 +0800</pubDate><description><![CDATA[a）消息顺序性：消费者消费的消息的顺序 和 生产者发送消息的顺序是一致的.例如 生产者 发送消息顺序是 msg1、msg2、msg3，那么消费者也需要按照 msg1、msg2、msg3 的顺序进行消费.b）顺序不一致可能会导致哪些问题？消息1：修改 用户318 的昵称为 “白天”.消息2：修改 用户318 的昵称为 “黑夜”.那么，按正常的逻辑来讲，用户318 的名称最后因该为 “黑夜”，但如果 消息1 是最后一个被消费者消费的消息，那么 用户318 的名称就变成了 “白天”.]]></description><category></category></item><item><title><![CDATA[RabbitMQ应用问题 - 幂等性保障]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141096119</link><guid>https://blog.csdn.net/CYK_byte/article/details/141096119</guid><author>CYK_byte</author><pubDate>Sat, 10 Aug 2024 22:32:29 +0800</pubDate><description><![CDATA[假设 key 不存在，那么通过 setnx 操作后，就会成功设置 key，并且在这之后无论多少次调用 setnx，都不会在影响第一次调用 setnx 操作后的结果.这个方案基本上就覆盖了 90% 的应用场景.  可能网上也还有很多其他资料描述其他的方法，但基本上都是围绕 全局唯一ID 的拓展（本质的思想都一样）.假设 i 初始为 0， 第一次调用后会 i = 1，并且后面每次调用都会影响第一调用后的结果（第二次 i++ ，i 就等于 2）.因此，对于可靠性要求高的场景，建议使用。]]></description><category></category></item><item><title><![CDATA[RabbitMQ高级特性 - 消息和队列TTL、死信队列]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141091818</link><guid>https://blog.csdn.net/CYK_byte/article/details/141091818</guid><author>CYK_byte</author><pubDate>Sat, 10 Aug 2024 17:36:01 +0800</pubDate><description><![CDATA[a）TTL（Time To Live 过期时间），RabbitMQ 可以对消息和队列设置 TTL.   当消息到达存活时间之后，还没有被消费，就会被自动清除.给消息设置TTL：MQ 扫描到队列头部消息（先进先出）过期了，就会剔除消息（这里会存在一个问题：当队列头部的消息还没过期，而队列头部之后的元素过期了却不会被清理，需要等到头部元素过期被清理后，才会依次扫描后面的元素）.给队列。]]></description><category></category></item><item><title><![CDATA[Redis - 记录一次千万级 key 的 Redis 主从迁移步骤]]></title><link>https://blog.csdn.net/CYK_byte/article/details/140962673</link><guid>https://blog.csdn.net/CYK_byte/article/details/140962673</guid><author>CYK_byte</author><pubDate>Wed, 07 Aug 2024 23:29:03 +0800</pubDate><description><![CDATA[完成 redis 主从迁移：
* `主节点` 从 10.200.16.75 迁移到 10.200.16.10
* `从节点` 从 10.200.16.74 迁移到 10.200.16.11
最后保证迁移后数据基本一致.]]></description><category></category></item><item><title><![CDATA[Rabbit高级特性 - 消息重试机制（两种实现）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/141003018</link><guid>https://blog.csdn.net/CYK_byte/article/details/141003018</guid><author>CYK_byte</author><pubDate>Wed, 07 Aug 2024 23:25:58 +0800</pubDate><description><![CDATA[消息重试机制就是在消息处理失败之后重新发送，主要时为了解决消息发送过程可能会出现的问题，例如 网络故障、服务临时不可用 等.Ps：如果时程序逻辑引起的错误，那么即使重试多少次都是没有用的，但是可以通过配置重试次数来解决.]]></description><category></category></item><item><title><![CDATA[RabbitMQ高级特性 - 非持久化 / 持久化（交换机、队列、消息）]]></title><link>https://blog.csdn.net/CYK_byte/article/details/140912191</link><guid>https://blog.csdn.net/CYK_byte/article/details/140912191</guid><author>CYK_byte</author><pubDate>Sun, 04 Aug 2024 22:09:16 +0800</pubDate><description><![CDATA[前面讲到了 生产者消息确认机制 和 消费者消息确认机制，保证了消息传输的可靠性，但是这还不够，试想如果 Broker 突然崩溃，那么所有的 交换机、队列、消息 不就全部都没了（RabbitMQ 以内存为主，硬盘为辅，默认交换机和队列都是非持久化的）.  因此需要持久化机制.a）交换机持久化如果交换机不设置持久化，那么在 rabbitmq 服务重启之后，相关的交换机元数据就会丢失，对一个长期使用的交换机来说，建议设置成持久化的.]]></description><category></category></item><item><title><![CDATA[RabbitMQ高级特性 - 生产者消息确认机制]]></title><link>https://blog.csdn.net/CYK_byte/article/details/140908709</link><guid>https://blog.csdn.net/CYK_byte/article/details/140908709</guid><author>CYK_byte</author><pubDate>Sun, 04 Aug 2024 18:51:15 +0800</pubDate><description><![CDATA[为了保证信息 从生产者 发送到 队列，因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制（confirm 和 return）实现.因为事务机制比较消耗性能，在实际工作中用的也不多，因此这里主要介绍confirm 和 return机制来实现发送放的确认.a）confirm 确认模式如上图，confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息，那么 ConfirmCallback 这个回调 ack 参数就为true。]]></description><category></category></item><item><title><![CDATA[RabbitMQ高级特性 - 消费者消息确认机制]]></title><link>https://blog.csdn.net/CYK_byte/article/details/140905798</link><guid>https://blog.csdn.net/CYK_byte/article/details/140905798</guid><author>CYK_byte</author><pubDate>Sun, 04 Aug 2024 17:12:36 +0800</pubDate><description><![CDATA[为了保证消息从 队列 到 消费者正确消费，那么就引入了消费者消息确认机制.a）消费者在订阅队列时，可以指定 autoAck 参数，根据这个参数设置，消息确认机制分为以下两种（以下讲到的方法和参数来自于 RabbitMQ 原生的 SDK，非 Spring 提供）.自动确认：当 autoAck = true 时，RabbitMQ 会自动把发送出去的消息置为确认，然后不管消费者是否真正的消费这些消息，都会从内存中删除.（适合对消息可靠性要求不高的场景）.]]></description><category></category></item></channel></rss>