iDuckie's Blog - 微服务
type: channel
link: https://www.ducky.vip/tag/%E5%BE%AE%E6%9C%8D%E5%8A%A1/
items: Java 实现 Elasticsearch 入门指南：从概念到实战
items: SpringAMQP 集成 RabbitMQ 入门指南：从概念到实战
items: Java 基于 Sentinel 的服务保护入门指南：请求限流、线程隔离和服务熔断
items: Java 基于 Seata 的分布式事务入门指南：从部署到完整实战
items: Nacos 从入门到实战：服务发现与配置管理利器

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 实现消息…

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 控制台修改…