iDuckie's Blog - 指南
type: channel
link: https://www.ducky.vip/tag/%E6%8C%87%E5%8D%97/
items: Java 实现 Elasticsearch 入门指南：从概念到实战
items: SpringAMQP 集成 RabbitMQ 入门指南：从概念到实战
items: 跨系统通用：在 Linux 上用 Docker + K8s + Jenkins 部署 Java 服务
items: Java 基于 Sentinel 的服务保护入门指南：请求限流、线程隔离和服务熔断
items: Java 基于 Seata 的分布式事务入门指南：从部署到完整实战
items: Nacos 从入门到实战：服务发现与配置管理利器
items: Spring Cloud Gateway 网关路由详解：从入门到实战
items: Java 实现 Redis 入门指南：从概念到实战
items: MyBatis-Plus 从入门到精通：简化 MyBatis 开发的利器
items: Linux wget 命令 使用终极指南

Java 实现 Elasticsearch 入门指南：从概念到实战
type: item
date: 2024-08-24T19:53:36+08:00
description: 在数据爆炸的时代，传统关系型数据库在全文检索、复杂条件过滤等场景下性能不足。Elasticsearch（简称 ES）作为一款分布式、高扩展、高实时的全文搜索引擎，凭借其强大的检索能力和灵活的架构，成为日志分析、电商搜索、内容推荐等场景的首选工具。本文将从 Elasticsearch 核心概念出发，结合 Java 实战，带你快速入门 ES 的使用。一、Elasticsearch 核心概念在使用 Elasticsearch 前，需要先理解其核心术语和数据模型，这是后续操作的基础。1. 基本概念Elasticsearch 是基于 Lucene 的分布式搜索引擎，其核心概念与传统数据库有对应关系，但设计理念不同：Elasticsearch 概念传统数据库概念说明Index（索引）Database（库）一个索引是具有相似结构的文档集合（如“商品索引”“用户索引”）。Document（文档）Row（行）索引中的每条数据记录，以 JSON 格式存储（如一个商品信息）。Field（字段）Column（列）文档中的属性（如商品的“名称”“价格”）。Mapping（映射）Schema（表结构）定义文档的字段类型、分词器等元数据（类似数据库表的字段定义）。Shard（分片）-索引的分片，分布式存储的核心（一个索引可分为多个分片，分散在不同节点）。Replica（副本）-分片的备份，用于故障转移和负载均衡（副本数越多，查询性能越好）。2. 核心特性全文检索：支持关键词、短语、模糊匹配等复杂检索，内置分词器（可自定义）。分布式架构：自动分片和副本管理，支持水平扩展，应对海量数据。实时性：文档写入后近实时可查（延迟毫秒级）。聚合分析：支持统计、分组、排序等复杂分析（类似 SQL 的 GROUP BY、SUM 等）。二、环境准备1. 安装 Elasticsearch推荐使用 Docker 快速部署（本地安装需提前配置 JDK 环境）：# 拉取 ES 镜像（7.14.0 版本为例，与后续客户端版本保持一致） docker pull elasticsearch:7.14.0 # 启动容器（映射 9200 端口为 HTTP 接口，9300 为节点间通信端口） docker run -d --name es -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ # 单节点模式（开发环境） -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ # 限制 JVM 内存 elasticsearch:7.14.0启动后访问 http://localhost:9200，若返回以下 JSON 则说明启动成功：{ "name" : "xxxx", "cluster_name" : "docker-cluster", "version" : { "number" : "7.14.0", ... }, "tagline" : "You Know, for Search" }2. 引入 Java 客户端依赖Elasticsearch 官方推荐使用 Elasticsearch High Level REST Client（高level REST客户端），它封装了底层 HTTP 通信，支持所有 ES 操作。在 Maven 项目的 pom.xml 中添加依赖（版本需与 ES 服务器一致）： <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.14.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.14.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.5</version> </dependency>3. 初始化客户端创建 ElasticsearchClient 工具类，初始化连接：import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elastic…

SpringAMQP 集成 RabbitMQ 入门指南：从概念到实战
type: item
date: 2024-06-12T20:13:42+08:00
description: 在分布式系统中，消息队列是实现异步通信、解耦服务、削峰填谷的核心组件。而 RabbitMQ 作为一款高性能、可靠的开源消息中间件，凭借其灵活的路由策略和丰富的功能，成为了许多企业的首选。本文将以 SpringAMQP 为桥梁，带大家快速入门 RabbitMQ，从基础概念到实战代码，一步步掌握消息队列的核心用法。一、RabbitMQ 核心概念扫盲在开始实战前，需先理清 RabbitMQ 的核心组件，这是理解后续内容的基础。1. 消息队列的基本模型RabbitMQ 基于「生产者 - 消费者」模型工作，核心组件包括：生产者（Producer）：发送消息的应用程序。例如：用户下单后，负责发送 “订单创建” 消息的服务。消费者（Consumer）：接收并处理消息的应用程序。例如：接收 “订单创建” 消息后，负责发送短信通知的服务。队列（Queue）：存储消息的缓冲区。消息会先进入队列，再由消费者从队列中取出处理。队列支持持久化（重启后消息不丢失）、限流等特性。交换机（Exchange）：接收生产者发送的消息，并根据 “路由规则” 将消息转发到对应的队列。交换机不存储消息，若没有匹配的队列，消息会被丢弃或返回给生产者（需额外配置）。路由键（Routing Key）：生产者发送消息时指定的 “钥匙”，交换机通过路由键判断消息该转发到哪个队列。绑定（Binding）：将交换机与队列关联的 “桥梁”，同时指定 “绑定键（Binding Key）”。交换机通过对比路由键和绑定键来匹配队列。2. 交换机的 4 种核心类型交换机是 RabbitMQ 路由策略的核心，不同类型对应不同路由规则，新手需重点掌握以下 4 种：交换机类型路由规则适用场景Direct（直接交换机）路由键与绑定键 完全匹配 才转发一对一通信（如订单状态同步）Fanout（扇出交换机）忽略路由键，将消息转发给 所有绑定的队列一对多广播（如日志同步、短信群发）Topic（主题交换机）支持通配符匹配（* 匹配一个词，# 匹配多个词）多条件路由（如按地区、类型筛选消息）Headers（头交换机）通过消息头（Headers）的键值对匹配复杂多字段匹配（较少用）二、环境准备：3 步搭建 SpringAMQP+RabbitMQ 环境使用 SpringAMQP 操作 RabbitMQ，需完成 “安装 RabbitMQ→创建 SpringBoot 项目→配置依赖与参数” 三步。1. 安装 RabbitMQ（以 Docker 为例）RabbitMQ 依赖 Erlang 环境，直接安装较繁琐，推荐用 Docker 一键部署：# 拉取 RabbitMQ 镜像（带管理界面） docker pull rabbitmq:3-management # 启动容器（映射端口 5672 用于通信，15672 用于管理界面） docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management启动后，访问 http://localhost:15672 进入管理界面，默认账号密码均为 guest（生产环境需修改）。2. 创建 SpringBoot 项目并引入依赖用 IDEA 创建 SpringBoot 项目，在 pom.xml 中引入 SpringAMQP 依赖（SpringBoot 自动管理版本）： <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>3. 配置 RabbitMQ 连接参数在 application.yml 中配置 RabbitMQ 连接信息（IP、端口、账号密码等）：spring: rabbitmq: host: localhost # RabbitMQ 服务地址（本地用 localhost，远程填服务器 IP） port: 5672 # 通信端口（默认 5672） username: guest # 用户名（默认 guest） password: guest # 密码（默认 guest） virtual-host: / # 虚拟主机（默认 /，用于隔离不同环境的消息）至此，环境搭建完成，接下来进入实战环节。三、实战：用 SpringAMQP 实现消息…

跨系统通用：在 Linux 上用 Docker + K8s + Jenkins 部署 Java 服务
type: item
date: 2024-06-05T15:50:00+08:00
description: 大家好！今天这篇教程会兼顾 CentOS 7 和 Ubuntu 系统，教你用 Docker、Kubernetes（K8s）和 Jenkins 搭建 Java 服务的自动化部署流程。这两套系统操作略有差异，但核心逻辑一致，跟着步骤走，无论用哪种 Linux 都能顺利上手～为什么选择这三个工具？Docker：把 Java 服务打包成标准化容器，彻底解决"在我这能跑，到你那就崩"的环境问题Kubernetes：自动化管理容器集群，自动扩缩容、故障恢复、滚动更新全搞定Jenkins：构建自动化流水线，代码提交后自动完成"构建→测试→打包→部署"全流程三者结合，就是一套企业级的 Java 服务部署解决方案。话不多说，开始实操！准备工作通用环境要求一台 Linux 服务器（CentOS 7 或 Ubuntu 20.04/22.04，内存至少 2GB，K8s 对内存有要求）服务器已关闭 SELinux（否则可能影响容器运行）已安装 Java 8+（Jenkins 依赖 Java 环境）已安装 Git（用于拉取代码）第一步：基础环境配置（分系统操作）CentOS 7 基础配置# 关闭防火墙（生产环境可按需配置规则，测试环境简化操作） sudo systemctl stop firewalld sudo systemctl disable firewalld # 关闭 SELinux（否则可能影响容器运行） sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 安装基础工具 sudo yum install -y curl wget vim net-toolsUbuntu 基础配置# 更新系统 sudo apt update && sudo apt upgrade -y # 关闭防火墙（测试环境简化，生产环境需配置规则） sudo ufw disable # 安装基础工具 sudo apt install -y curl wget vim net-tools apt-transport-https ca-certificates第二步：安装 Docker（分系统操作）CentOS 7 安装 Docker# 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加 Docker 源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable dockerUbuntu 安装 Docker# 添加 Docker GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加 Docker 源 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 安装 Docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker验证 Docker 安装（通用）docker --version # 显示版本信息即成功第三步：安装 Kubernetes（单节点，通用操作）我们用 Minikube 搭建单节点 K8s 集群，适合入门：安装 Minikube：curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube安装 kubectl（K8s 命令行工具）：curl -LO "https://dl.k8s.io/release/$(c…

Java 基于 Sentinel 的服务保护入门指南：请求限流、线程隔离和服务熔断
type: item
date: 2024-04-29T11:33:17+08:00
description: 在微服务架构中，服务的稳定性至关重要。随着服务数量增多和调用关系复杂化，服务熔断、限流、隔离等保护机制成为保障系统稳定性的关键。Sentinel 作为阿里巴巴开源的流量控制组件，为我们提供了一站式的服务保护解决方案。本文将带你快速入门 Sentinel，实现请求限流、线程隔离和服务熔断功能。什么是 Sentinel？Sentinel 是面向分布式服务架构的流量控制组件，主要以流量为切入点，从流量控制、熔断降级、系统负载保护等多个维度来帮助开发者保障微服务的稳定性。核心特性：丰富的流量控制策略（基于QPS、线程数等）熔断降级能力（基于响应时间、异常比例等）系统自适应保护实时监控和控制台易用的扩展点环境准备技术栈JDK 1.8+Spring Boot 2.7.x（本文以Spring Boot为例）Maven 3.6+引入依赖在 pom.xml 中添加以下依赖： <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2021.0.5.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.6</version> </dependency>下载并启动 Sentinel 控制台从 Sentinel Releases 下载控制台 jar 包（例如：sentinel-dashboard-1.8.6.jar）启动控制台：java -jar sentinel-dashboard-1.8.6.jar --server.port=8080访问 http://localhost:8080，默认用户名/密码：sentinel/sentinel配置应用连接控制台在 application.yml 中添加配置：spring: application: name: sentinel-demo cloud: sentinel: transport: dashboard: localhost:8080 # 控制台地址 port: 8719 # 本地客户端端口，默认8719，如被占用会自动加1 server: port: 8081核心功能实现1. 请求限流限流是保护服务的第一道防线，防止流量突增导致服务崩溃。基于注解的限流实现import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LimitController { /** * 基础限流示例 * value: 资源名称，必填 * blockHandler: 限流/降级后的处理方法 */ @GetMapping("/limit") @SentinelResource(value = "limitResource", blockHandler = "handleLimit") public String limit() { return "正常访问：" + System.currentTimeMillis(); } // 限流处理方法，参数和返回值需与原方法一致，并额外添加BlockException参数 public String handleLimit(BlockException e) { return "请求过于频繁，请稍后再试！"; } }在控制台配置限流规则启动应用后，访问一次 /limit 接口（Sentinel 采用懒加载机制，首次访问后才会在控制台显示）进入控制台 -> 簇点链路 -> 找到 limitResource 资源点击 "流控"，配置规则：阈值类型：QP…

Java 基于 Seata 的分布式事务入门指南：从部署到完整实战
type: item
date: 2024-04-15T16:41:22+08:00
description: 在微服务架构中，一个业务操作往往涉及多个服务的数据库修改（如下单→扣库存→减余额）。分布式事务的核心是保证这些跨服务操作的原子性：要么全部成功，要么全部失败。Seata 作为阿里开源的分布式事务框架，提供了简单易用的解决方案。本文将从部署到完整业务代码，带你掌握基于 Seata 的分布式事务实现。一、核心概念与原理1. Seata 核心角色TC（Transaction Coordinator）：事务协调者（独立服务），负责协调全局事务的提交或回滚。TM（Transaction Manager）：事务管理器（在发起全局事务的服务中），负责开启和结束全局事务。RM（Resource Manager）：资源管理器（在参与事务的每个服务中），负责分支事务的提交/回滚。2. 事务模式本文重点讲解两种常用模式：AT 模式：无侵入式，基于 undo log 实现自动回滚（推荐生产使用，性能好）。XA 模式：基于数据库原生 XA 协议，强一致性但性能较低（适合对一致性要求极高的场景）。二、部署 Seata TC 服务TC 是 Seata 的核心协调服务，必须先部署。1. 下载 Seata 服务器从 Seata 官网 下载 1.6.1 版本，解压后目录结构如下：seata-server-1.6.1/ ├── bin/ # 启动脚本 ├── conf/ # 配置文件 ├── lib/ # 依赖包2. 配置 TC 服务修改 conf/application.yml，配置注册中心（Nacos）和存储模式：server: port: 8091 # TC 服务端口 spring: application: name: seata-server # 注册中心配置（使用 Nacos） registry: type: nacos nacos: server-addr: 127.0.0.1:8848 # Nacos 地址 group: SEATA_GROUP # 分组（默认即可） application: seata-server # TC 在 Nacos 中的服务名 # 配置中心（从 Nacos 读取配置） config: type: nacos nacos: server-addr: 127.0.0.1:8848 group: SEATA_GROUP dataId: seataServer.properties # 配置文件名 # 存储模式（file 适合测试，生产用 db） store: mode: file3. 在 Nacos 中添加 Seata 配置登录 Nacos 控制台（http://localhost:8848，账号密码 nacos/nacos），创建配置：Data ID：seataServer.propertiesGroup：SEATA_GROUP配置内容：# 事务组映射（微服务需与之一致） service.vgroupMapping.my_test_tx_group=default # TC 服务地址（由注册中心自动发现） service.default.grouplist=127.0.0.1:8091 metrics.enabled=false # 关闭监控，减少干扰4. 启动 TC 服务Windows：双击 bin/seata-server.batLinux/Mac：执行 sh bin/seata-server.sh启动成功后，在 Nacos 服务列表中能看到 seata-server，说明 TC 部署完成。三、环境准备与数据库设计1. 微服务架构我们将实现一个经典的分布式事务场景：订单服务（order-service）：创建订单库存服务（storage-service）：扣减商品库存账户服务（account-service）：扣减用户余额业务流程：用户下单 → 订单服务创建订单 → 调用库存服务扣库存 → 调用账户服务扣余额 → 全部成功则提交，任一失败则回滚。2. 数据库设计为三个服务分别创建数据库，并添加 undo_log 表（AT 模式必需）。（1）订单库（order_db）-- 订单表 CREATE TABLE `order` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL COMMENT '用户ID', `product_id` bigint NOT NULL COMMENT '商品ID', `count` int NOT NULL COMMENT '购买数量', `money` decimal(10,2) NOT NULL COMMENT '总金额', `status` int NOT NULL COMMENT '订单状态：0-创建中，1-已完…

Nacos 从入门到实战：服务发现与配置管理利器
type: item
date: 2024-03-09T15:11:37+08:00
description: 什么是 Nacos？Nacos（Dynamic Naming and Configuration Service）是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台，致力于帮助开发者快速构建云原生应用。Nacos是目前国内企业中占比最多的注册中心组件，核心定位 “注册中心 + 配置中心”，适配微服务架构全场景需求，目前已经加入SpringCloudAilibaba中。简单来说，Nacos 可以解决两个核心问题：服务发现：让微服务之间能够相互找到对方（类似通讯录）配置管理：集中管理所有服务的配置，支持动态更新（无需重启服务）为什么选择 Nacos？1. 服务注册与发现一站式解决方案：同时支持服务发现和配置管理，避免集成多个组件的复杂性高可用：支持集群部署，保证服务稳定性动态配置：配置修改后实时推送，无需重启应用易用性：提供友好的控制台界面，操作简单生态兼容：与 Spring Cloud、Dubbo 等主流微服务框架无缝集成环境准备系统要求JDK 8+（推荐 JDK 11）Maven 3.2+（如需源码编译）内存：至少 2GB（生产环境建议 4GB+）快速安装 Nacos 服务端方式 1：直接下载安装包（推荐）下载最新稳定版安装包# 以 2.3.2 版本为例（请替换为最新版本） wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz解压安装包tar -zxvf nacos-server-2.3.2.tar.gz cd nacos/bin移动Nacos（单机模式）# Linux/Mac sh startup.sh -m standalone # Windows cmd startup.cmd -m standalone访问控制台地址：http://localhost:8848/nacos默认账号密码：nacos /nacos方式 2：Docker 快速部署# 拉取镜像 docker pull nacos/nacos-server:v2.3.2 # 启动容器（单机模式） docker run --name nacos -d -p 8848:8848 \ -e MODE=standalone \ -e NACOS_AUTH_ENABLE=true \ nacos/nacos-server:v2.3.2核心功能实战1. 配置管理新建配置登录 Nacos 控制台，进入「配置管理」→「配置列表」点击「+」新增配置，填写信息：Data ID：通常使用「服务名 - 环境.yml」格式（如 user-service-dev.yml）Group：默认 DEFAULT_GROUP 即可（可自定义分组）配置格式：选择 YAML配置内容：server: port: 8081 user: name: 张三 age: 18点击「发布」保存配置在 Spring Boot 中使用配置添加依赖（pom.xml）<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.0.5.0</version> </dependency>创建配置文件 bootstrap.yml（必须是 bootstrap 而非 application）spring: application: name: user-service # 服务名，与 Data ID 前缀对应 cloud: nacos: config: server-addr: localhost:8848 # Nacos 服务地址 file-extension: yml # 配置文件格式 group: DEFAULT_GROUP # 配置分组 profiles: active: dev # 环境，与 Data ID 中的环境对应编写测试代码@RestController @RefreshScope // 开启配置自动刷新 public class UserController { @Value("${user.name}") private String userName; @Value("${user.age}") private Integer userAge; @GetMapping("/user/info") public String getUserInfo() { return "姓名：" + userName + "，年龄：" + userAge; } }测试动态配置：在 Nacos 控制台修改…

Spring Cloud Gateway 网关路由详解：从入门到实战
type: item
date: 2024-02-19T19:41:29+08:00
description: 一、什么是 Spring Cloud Gateway？Spring Cloud Gateway 是 Spring 生态专为微服务架构设计的 API 网关，基于 Netty 实现非阻塞响应式编程，核心功能包括：路由转发：将客户端请求按规则转发到对应微服务过滤器链：请求转发前后的增强处理（如认证、日志、限流）负载均衡：集成 Spring Cloud LoadBalancer 实现服务实例动态路由断言匹配：通过多种规则精确匹配请求相比传统网关（如 Zuul），Gateway 具有更高的性能和更丰富的功能，是微服务架构的"流量入口"。二、路由的核心组成一个完整的 Gateway 路由由四部分构成：要素说明ID路由唯一标识（不可重复）URI目标服务地址（支持 lb://服务名 或 http://ip:port）Predicates路由断言（匹配请求的规则，多断言需同时满足）Filters过滤器（请求转发前后的处理逻辑）三、路由配置方式（环境搭建）1. 引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>2. 配置文件方式（推荐）通过 application.yml 配置，支持动态刷新：server: port: 8080 # 网关端口 spring: application: name: gateway # 服务名称 cloud: nacos: server-addr: localhost:8848 # nacos地址 gateway: routes: # 网关路由配置 # 用户服务路由 - id: user-service # 路由id，自定义，只要唯一即可 # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址 uri: lb://userService # 路由的目标地址 lb就是LoadBalance负载均衡，后面跟服务名称 predicates: # 路由断言，也就是判断请求是否符合路由规则的条件 - Path=/user/** # 这个是按照路径匹配，只要以/user/开头就符合要求 filters: - StripPrefix=1 # 去掉路径中第一个前缀（/api） - AddRequestHeader=X-Service, user # 添加请求头 # 订单服务路由 - id: order-service-route uri: http://localhost:8082 # 直接转发到指定地址 predicates: - Path=/orders/** - After=2025-10-01T00:00:00+08:00[Asia/Shanghai] # 时间断言3. 代码方式配置通过 RouteLocatorBuilder 编程式定义路由：import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RouteConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() // 产品服务路由 .route("product-service-route", r -> r .path("/api/products/**") // 路径断言 .filters(f -> f.stripPrefix(1)) // 过滤器 .uri("lb://product-service")) // 目标服务 .build(); } }四、路由断言详解断言（Predicate）是请求的"匹配规则"…

Java 实现 Redis 入门指南：从概念到实战
type: item
date: 2023-11-18T14:24:00+08:00
description: 在高并发场景中，传统数据库往往面临读写压力过大的问题。Redis（Remote Dictionary Server）作为一款高性能的内存数据库，凭借其快读写、多数据结构、支持持久化等特性，成为缓存、分布式锁、计数器等场景的首选工具。本文将从 Redis 核心概念出发，结合 Java 实战，带你快速掌握 Redis 的入门用法。一、Redis 核心概念在使用 Redis 前，需先理解其核心特性和数据模型，这是后续实战的基础。1. 核心特性内存存储：数据主要存于内存，读写速度极快（单机 QPS 可达 10 万+）。多数据结构：支持 String（字符串）、Hash（哈希）、List（列表）、Set（集合）、Sorted Set（有序集合）等多种结构。持久化：支持 RDB（快照）和 AOF（日志）两种持久化方式，避免内存数据丢失。高可用：支持主从复制、哨兵模式、集群模式，保证服务稳定。原子操作：提供incr、decr等原子命令，适合实现计数器、分布式锁等场景。2. 核心数据结构Redis 的核心价值在于丰富的数据结构，不同结构对应不同场景，新手需重点掌握以下 5 种：数据结构特点适用场景String（字符串）最基础类型，可存储文本、数字，支持拼接、截取缓存用户信息、存储计数器、分布式 IDHash（哈希）键值对集合，适合存储对象（如用户信息）缓存用户详情、商品信息List（列表）有序、可重复的元素集合，支持两端操作实现消息队列、最新消息列表Set（集合）无序、不可重复的元素集合，支持交集、并集好友关系、标签去重、共同关注Sorted Set（有序集合）有序、不可重复，元素关联“分数”排序排行榜、带权重的消息队列二、环境准备1. 安装 Redis推荐使用 Docker 快速部署（本地安装需手动配置，步骤较繁琐）：# 拉取 Redis 镜像（6.2 版本为例，稳定且常用） docker pull redis:6.2 # 启动容器（映射 6379 端口，设置密码为 123456） docker run -d --name redis -p 6379:6379 redis:6.2 --requirepass "123456"启动后，可通过 redis-cli 测试连接（需先进入容器）：# 进入 Redis 容器 docker exec -it redis /bin/bash # 连接 Redis 服务（输入密码 123456） redis-cli -a 123456 # 测试命令（返回 PONG 说明连接成功） ping2. 引入 Java 客户端依赖Java 操作 Redis 最常用的客户端是 Jedis（轻量、易用）和 Spring Data Redis（集成 Spring，简化开发）。本文先以 Jedis 为例，后续补充 Spring 集成方案。在 Maven 项目的 pom.xml 中添加 Jedis 依赖： <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.1</version> <scope>test</scope> </dependency>3. 初始化 Jedis 连接创建 RedisClient 工具类，封装 Jedis 连接的初始化和关闭（实际项目中建议用连接池，避免频繁创建连接）：import redis.clients.jedis.Jedis; public class RedisClient { // Redis 服务地址和端口 private static final String HOST = "localhost"; private static final int PORT = 6379; // Redis 密码 private static final String PASSWORD = "123456"; // 获取 Jedis 连接 public static Jedis getConnection() { // 1. 创建连接 Jedis jedis = new Jedis(HOST, PORT); // 2. 验证密码 jedis.auth(PASSWORD); // 3. 选择数据库（默认 0 号库，共 16 个库，0-15） jedis.select(0); return jedis; } // 关闭连接 …

MyBatis-Plus 从入门到精通：简化 MyBatis 开发的利器
type: item
date: 2023-10-08T17:53:00+08:00
description: 什么是 MyBatis-Plus？MyBatis-Plus（简称 MP）是 MyBatis 的增强工具，在 MyBatis 的基础上只做增强不做改变，旨在简化开发、提高效率。简单来说，MyBatis-Plus 可以帮你省去大量重复的 CRUD 代码，让你专注于业务逻辑开发。为什么选择 MyBatis-Plus？无侵入：只做增强不做改变，完全兼容 MyBatis强大的 CRUD 操作：内置通用 Mapper，无需编写 SQL 即可完成增删改查条件构造器：灵活构建查询条件，告别字符串拼接 SQL 的痛苦分页插件：一键实现分页功能，无需复杂配置代码生成器：自动生成 Entity、Mapper、Service、Controller 代码多种主键策略：支持自动生成主键，包括雪花算法、UUID 等环境准备技术依赖JDK 8+Maven 3.6+Spring Boot 2.7.x（本文以 Spring Boot 整合为例）MySQL 8.0（或其他关系型数据库）快速入门1. 创建数据库和表-- 创建数据库 CREATE DATABASE mp_demo DEFAULT CHARACTER SET utf8mb4; -- 使用数据库 USE mp_demo; -- 创建用户表 CREATE TABLE user ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', create_time DATETIME NULL DEFAULT NULL COMMENT '创建时间', update_time DATETIME NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 插入测试数据 INSERT INTO user (name, age, email) VALUES ('张三', 18, 'zhangsan@example.com'), ('李四', 20, 'lisi@example.com'), ('王五', 22, 'wangwu@example.com');2. 初始化 Spring Boot 项目并添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.15</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>3. 配置数据库连接application.ymlspring: datasource: driver-class-na…

Linux wget 命令 使用终极指南
type: item
date: 2023-05-16T17:38:00+08:00
description: Linux wget 是一个下载文件的工具，它用在命令行下。对于 Linux 用户是必不可少的工具，尤其对于网络管理员，经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget 工具体积小但功能完善，它支持断点下载功能，同时支持 FTP 和 HTTP 下载方式，支持代理服务器和设置起来方便简单。下面我们以实例的形式说明怎么使用 wget1、使用 wget 下载单个文件以下的例子是从网络下载一个文件并保存在当前目录$ wget https://ducky.vip/test.zip在下载的过程中会显示进度条，包含（下载完成百分比，已经下载的字节，当前下载速度，剩余下载时间）。2、使用 wget -O 下载并以不同的文件名保存wget 默认会以最后一个符合“/”的后面的字符来命名，对于动态链接的下载通常文件名会不正确。 错误：下面的例子会下载一个文件并以名称 download.php?id=1080 保存$ wget https://ducky.vip/download.php?id=1080即使下载的文件是 zip 格式，它仍然以 download.php?id=1080 命名。 正确：为了解决这个问题，我们可以使用参数 -O 来指定一个文件名：$ wget -O test.zip https://ducky.vip/download.php?id=10803、使用 wget --limit -rate 限速下载当你执行 wget 的时候，它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件，而你还需要下载其它文件时就有必要限速了。$ wget --limit-rate=300k https://ducky.vip/test.zip4、使用 wget -c 断点续传使用 wget -c 重新启动下载中断的文件：$ wget -c https://ducky.vip/test.zip对于我们下载大文件时突然由于网络等原因中断非常有帮助，我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用 -c 参数。5、使用 wget -b 后台下载对于下载非常大的文件的时候，我们可以使用参数 -b 进行后台下载。$ wget -b https://ducky.vip/test.zip Continuing in background, pid 1840. Output will be written to `wget-log‘。你可以使用以下命令来察看下载进度$ tail -f wget-log6、伪装代理名称下载有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。不过你可以通过 --user-agent 参数伪装。$ wget --user-agent="Mozilla/5.0 （Windows; U; Windows NT 6.1; en-US） AppleWebKit/534.16 （KHTML， like Gecko） Chrome/10.0.648.204 Safari/534.16" https://ducky.vip/test.zip7、使用 wget --spider 测试下载链接当你打算进行定时下载，你应该在预定时间测试下载链接是否有效。我们可以增加 --spider 参数进行检查。$ wget --spider URL如果下载链接正确，将会显示Spider mode enabled. Check if remote file exists. HTTP request sent， awaiting response. 200 OK Length： unspecified ［text/html］ Remote file exists and could contain further links， but recursion is disabled -- not retrieving.这保证了下载能在预定的时间进行，但当你给错了一个链接，将会显示如下错误Spider mode enabled. Check if remote file exists. HTTP request sent， awaiting response.。。 404 Not Found Remote file does not exist -- broken link！！！你可以在以下几种情况下使用 spider 参数：定时下载之前进行检查间隔检测网站是否可用检查网站页面的死链接8、使用 wget --tries 增加重试次数如果网络有问题或下载一个大文件也有可能失败。wget 默认重试 20 次连接下载文件。如果需要，你可以使用 --tries 增加重试次数。$ wget --tries=40 URL9、使用 wget…