<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Microservice on Leanku 的博客</title><link>https://www.leanku.com/post/microservice/</link><description>Recent content in Microservice on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 15 Sep 2025 20:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/post/microservice/index.xml" rel="self" type="application/rss+xml"/><item><title>微服务治理-API网关</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-api%E7%BD%91%E5%85%B3/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-api%E7%BD%91%E5%85%B3/</guid><description>&lt;h1 id="微服务治理-api网关"&gt;微服务治理-API网关&lt;/h1&gt;&#10;&lt;p&gt;API Gateway 是微服务系统的统一入口层，负责请求路由、协议转换、安全控制、流量治理与聚合编排，是连接外部世界与内部微服务体系的核心枢纽。&lt;/p&gt;&#10;&lt;h2 id="一介绍introduction"&gt;一、介绍（Introduction）&lt;/h2&gt;&#10;&lt;h3 id="11-为什么需要-api-gateway"&gt;1.1 为什么需要 API Gateway？&lt;/h3&gt;&#10;&lt;p&gt;在没有网关之前：&lt;/p&gt;&#10;&lt;h4 id="问题-1客户端需要知道所有服务地址"&gt;问题 1：客户端需要知道所有服务地址&lt;/h4&gt;&#10;&lt;p&gt;前端 / App 直接耦合后端服务拓扑。&lt;/p&gt;&#10;&lt;h4 id="问题-2安全无法统一控制"&gt;问题 2：安全无法统一控制&lt;/h4&gt;&#10;&lt;p&gt;每个服务都要：&#10;鉴权&#10;权限&#10;限流&#10;黑名单&amp;hellip;&lt;/p&gt;&#10;&lt;h4 id="问题-3跨服务调用暴露内部结构"&gt;问题 3：跨服务调用暴露内部结构&lt;/h4&gt;&#10;&lt;h4 id="问题-4接口碎片化"&gt;问题 4：接口碎片化&lt;/h4&gt;&#10;&lt;p&gt;一个业务页面可能需要多个服务，前端要请求 4～10 次 API。&lt;/p&gt;&#10;&lt;h3 id="12-api-gateway-的作用"&gt;1.2 API Gateway 的作用&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Client&#10; │&#10; ▼&#10;API Gateway&#10; │&#10; ├── User Service&#10; ├── Order Service&#10; ├── Payment Service&#10; └── Inventory Service&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;网关成为：&#10;&lt;strong&gt;唯一入口&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="13-api-gateway-解决什么问题"&gt;1.3 API Gateway 解决什么问题？&lt;/h3&gt;&#10;&lt;h4 id="1-统一入口"&gt;1. 统一入口&lt;/h4&gt;&#10;&lt;p&gt;如：所有请求：https://api.xxx.com/*&lt;/p&gt;&#10;&lt;h4 id="2-路由转发"&gt;2. 路由转发&lt;/h4&gt;&#10;&lt;p&gt;/api/user → user-service、 /api/order → order-service&lt;/p&gt;&#10;&lt;h4 id="3-鉴权auth"&gt;3. 鉴权（Auth）&lt;/h4&gt;&#10;&lt;p&gt;统一处理：&lt;/p&gt;</description></item><item><title>微服务治理-服务调用</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8/</guid><description>&lt;h1 id="微服务治理-服务调用"&gt;微服务治理-服务调用&lt;/h1&gt;&#10;&lt;p&gt;微服务拆分之后，服务之间不再是进程内方法调用，而是通过网络进行通信。服务调用（Service Communication）就是研究不同服务之间如何安全、高效、可靠地进行数据交换。&lt;/p&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-为什么需要服务调用"&gt;1.1 为什么需要服务调用？&lt;/h3&gt;&#10;&lt;p&gt;在单体架构中：只掉调用方法，比如 &lt;code&gt;$user = $this-&amp;gt;userService-&amp;gt;getUser(1);&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;只是一次普通的方法调用（Method Call）。&lt;/p&gt;&#10;&lt;p&gt;没有网络、没有序列化、没有超时、没有连接&lt;/p&gt;&#10;&lt;p&gt;而微服务以后：&lt;/p&gt;&#10;&lt;p&gt;已经变成：HTTP、TCP、gRPC&lt;/p&gt;&#10;&lt;p&gt;所有调用都变成：网络通信（Network Communication）&lt;/p&gt;&#10;&lt;h3 id="12-微服务调用有哪些方式"&gt;1.2 微服务调用有哪些方式？&lt;/h3&gt;&#10;&lt;p&gt;主要有三种：&lt;/p&gt;&#10;&lt;h4 id="1-http-rest"&gt;1. HTTP REST&lt;/h4&gt;&#10;&lt;p&gt;优点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;简单&lt;/li&gt;&#10;&lt;li&gt;通用&lt;/li&gt;&#10;&lt;li&gt;调试方便&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;缺点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;JSON 较大&lt;/li&gt;&#10;&lt;li&gt;序列化效率较低&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-rpc"&gt;2. RPC&lt;/h4&gt;&#10;&lt;p&gt;看起来像：本地方法。&lt;/p&gt;&#10;&lt;p&gt;实际上走的是网络。&lt;/p&gt;&#10;&lt;h4 id="3-grpc"&gt;3. gRPC&lt;/h4&gt;&#10;&lt;p&gt;底层：&lt;/p&gt;&#10;&lt;p&gt;HTTP/2。&lt;/p&gt;&#10;&lt;p&gt;Protobuf。&lt;/p&gt;&#10;&lt;p&gt;速度：非常快。&lt;/p&gt;&#10;&lt;h3 id="13-怎么选择调用方式"&gt;1.3 怎么选择调用方式？&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;推荐&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;对外 API&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP REST&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内部服务调用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gRPC&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;旧系统兼容&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高频通信&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gRPC&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;即：&#10;外部使用 HTTP。&#10;内部使用 gRPC。&lt;/p&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-一次-http-调用发生了什么"&gt;2.1 一次 HTTP 调用发生了什么？&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;业务代码&#10; │&#10; ▼&#10;DNS / 服务发现&#10; │&#10; ▼&#10;TCP 建立连接&#10; │&#10; ▼&#10;发送 HTTP 请求&#10; │&#10; ▼&#10;User Service&#10; │&#10; ▼&#10;返回 JSON&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果没有连接池。&lt;/p&gt;</description></item><item><title>微服务治理-服务监控</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E7%9B%91%E6%8E%A7/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E7%9B%91%E6%8E%A7/</guid><description>&lt;h1 id="微服务治理-服务监控"&gt;微服务治理-服务监控&lt;/h1&gt;&#10;&lt;p&gt;服务监控（Metrics Monitoring）用于对系统运行状态进行持续量化观测，通过指标数据（QPS、RT、错误率、资源使用率等）实现对微服务系统健康状况的实时评估与告警。&lt;/p&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-为什么需要监控"&gt;1.1 为什么需要监控？&lt;/h3&gt;&#10;&lt;p&gt;链路追踪解决的是：“这一次请求为什么慢？”&lt;/p&gt;&#10;&lt;p&gt;但通常还需要知道：“整个系统现在健康吗？”&lt;/p&gt;&#10;&lt;p&gt;比如：系统很卡问题&lt;/p&gt;&#10;&lt;p&gt;你需要判断：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;是 CPU 高了？&lt;/li&gt;&#10;&lt;li&gt;是数据库慢了？&lt;/li&gt;&#10;&lt;li&gt;是某个接口爆了？&lt;/li&gt;&#10;&lt;li&gt;还是流量暴涨？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="13-监控解决什么问题"&gt;1.3 监控解决什么问题？&lt;/h3&gt;&#10;&lt;p&gt;一句话总结：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;把系统运行状态数字化 + 可视化 + 可告警&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;核心能力：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;实时状态&lt;/li&gt;&#10;&lt;li&gt;历史趋势&lt;/li&gt;&#10;&lt;li&gt;异常检测&lt;/li&gt;&#10;&lt;li&gt;自动告警&lt;/li&gt;&#10;&lt;li&gt;容量规划&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="14-三大核心指标类型"&gt;1.4 三大核心指标类型&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;System Metrics（系统指标）&lt;/li&gt;&#10;&lt;li&gt;Application Metrics（应用指标）&lt;/li&gt;&#10;&lt;li&gt;Business Metrics（业务指标）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二核心指标metrics"&gt;二、核心指标（Metrics）&lt;/h2&gt;&#10;&lt;h3 id="21-系统指标system-metrics"&gt;2.1 系统指标（System Metrics）&lt;/h3&gt;&#10;&lt;p&gt;关注机器层面：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CPU 使用率&lt;/li&gt;&#10;&lt;li&gt;内存使用率&lt;/li&gt;&#10;&lt;li&gt;磁盘 IO&lt;/li&gt;&#10;&lt;li&gt;网络流量&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="22-应用指标application-metrics"&gt;2.2 应用指标（Application Metrics）&lt;/h3&gt;&#10;&lt;p&gt;关注服务本身：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;QPS（每秒请求数）&lt;/li&gt;&#10;&lt;li&gt;RT（响应时间）&lt;/li&gt;&#10;&lt;li&gt;错误率（Error Rate）&lt;/li&gt;&#10;&lt;li&gt;并发连接数&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="23-业务指标business-metrics"&gt;2.3 业务指标（Business Metrics）&lt;/h3&gt;&#10;&lt;p&gt;关注业务结果：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;下单成功率&lt;/li&gt;&#10;&lt;li&gt;支付成功率&lt;/li&gt;&#10;&lt;li&gt;注册转化率&lt;/li&gt;&#10;&lt;li&gt;GMV&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三应用"&gt;三、应用&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="../Prometheus%20+%20Grafana%20+%20Alertmanager%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6%E7%B3%BB%E7%BB%9F.md"&gt;Prometheus + Grafana + Alertmanager轻量级监控告警系统&lt;/a&gt;&lt;/p&gt;</description></item><item><title>微服务治理-负载均衡</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</guid><description>&lt;h1 id="微服务治理-负载均衡"&gt;微服务治理-负载均衡&lt;/h1&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-什么是负载均衡"&gt;1.1 什么是负载均衡&lt;/h3&gt;&#10;&lt;p&gt;负载均衡（Load Balancing）是微服务治理中的核心能力之一，它负责在多个服务实例之间合理分配请求，提高系统吞吐能力、可用性和扩展能力&lt;/p&gt;&#10;&lt;p&gt;假设：&#10;User Service 只有一台服务器：10.0.0.5&lt;/p&gt;&#10;&lt;p&gt;随着后面业务越来越大增加服务器：10.0.0.5，10.0.0.6，10.0.0.7 &amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;现在应该调用哪一个？&lt;/p&gt;&#10;&lt;p&gt;于是出现：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;负载均衡（Load Balancing）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;它负责：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;从多个可用实例中选择一个最合适的实例。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="12-为什么需要负载均衡"&gt;1.2 为什么需要负载均衡？&lt;/h3&gt;&#10;&lt;p&gt;假设：10000 个请求全部发送：10.0.0.5 导致服务宕机&lt;/p&gt;&#10;&lt;p&gt;结果： 10.0.0.6, 10.0.0.7 却一直空闲&lt;/p&gt;&#10;&lt;p&gt;负载均衡能够平均分配&lt;/p&gt;&#10;&lt;h3 id="13-负载均衡解决什么问题"&gt;1.3 负载均衡解决什么问题？&lt;/h3&gt;&#10;&lt;p&gt;主要包括&lt;/p&gt;&#10;&lt;h4 id="1流量分摊"&gt;1.流量分摊&lt;/h4&gt;&#10;&lt;h4 id="2提高可用性"&gt;2.提高可用性&lt;/h4&gt;&#10;&lt;h4 id="3方便扩容"&gt;3.方便扩容&lt;/h4&gt;&#10;&lt;h4 id="4-支持灰度发布"&gt;4. 支持灰度发布&lt;/h4&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-整个调用流程"&gt;2.1 整个调用流程&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Order Service&#10;&#10;↓&#10;&#10;Service Discovery&#10;&#10;↓&#10;&#10;Registry&#10;&#10;↓&#10;&#10;返回：&#10;&#10;10.0.0.5&#10;&#10;10.0.0.6&#10;&#10;10.0.0.7&#10;&#10;↓&#10;&#10;Load Balance&#10;&#10;↓&#10;&#10;选择：&#10;&#10;10.0.0.6&#10;&#10;↓&#10;&#10;HTTP&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-轮询round-robin"&gt;2.2 轮询（Round Robin）&lt;/h3&gt;&#10;&lt;p&gt;特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;简单&lt;/li&gt;&#10;&lt;li&gt;公平&lt;/li&gt;&#10;&lt;li&gt;实现容易&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;缺点：&lt;/p&gt;&#10;&lt;p&gt;不能反映机器性能差异。&lt;/p&gt;&#10;&lt;h3 id="23-随机"&gt;2.3 随机&lt;/h3&gt;&#10;&lt;p&gt;优点：&lt;/p&gt;</description></item><item><title>微服务治理-链路追踪</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA/</guid><description>&lt;h1 id="微服务治理-链路追踪"&gt;微服务治理-链路追踪&lt;/h1&gt;&#10;&lt;p&gt;链路追踪（Distributed Tracing）是微服务可观测性（Observability）的核心能力之一，用于在分布式系统中还原一次请求的完整调用路径，并定位性能瓶颈与故障点。&lt;/p&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-为什么需要链路追踪"&gt;1.1 为什么需要链路追踪？&lt;/h3&gt;&#10;&lt;p&gt;在单体应用中：一次请求在同一个进程内完成，只需要&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;打日志&lt;/li&gt;&#10;&lt;li&gt;打断点&lt;/li&gt;&#10;&lt;li&gt;其他调试&lt;br&gt;&#10;即可定位问题。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;但在微服务架构中：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Client&#10; ↓&#10;API Gateway&#10; ↓&#10;User Service&#10; ↓&#10;Order Service&#10; ↓&#10;Payment Service&#10; ↓&#10;Inventory Service&#10; ↓&#10;DB / MQ&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一次请求变成：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;跨进程 + 跨机器 + 跨网络&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="12-典型问题"&gt;1.2 典型问题&lt;/h3&gt;&#10;&lt;h4 id="问题1不知道慢在哪里"&gt;问题1：不知道慢在哪里&lt;/h4&gt;&#10;&lt;p&gt;比如 ：接口很慢&lt;/p&gt;&#10;&lt;p&gt;但系统里有：Gateway、User、、Order&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;你无法判断：到底慢在谁？&lt;/p&gt;&#10;&lt;h4 id="问题2日志分散"&gt;问题2：日志分散&lt;/h4&gt;&#10;&lt;p&gt;如：&#10;Gateway logs&#10;User logs&#10;Order logs&#10;Payment logs&lt;/p&gt;&#10;&lt;p&gt;每个服务都有日志,但它们之间没有关联关系。&lt;/p&gt;&#10;&lt;h4 id="问题3无法串联一次请求"&gt;问题3：无法串联一次请求&lt;/h4&gt;&#10;&lt;p&gt;无法确认日志是不是同一个请求？&lt;/p&gt;&#10;&lt;h3 id="13-链路追踪要解决什么问题"&gt;1.3 链路追踪要解决什么问题？&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;把一次请求在多个微服务中的完整路径“串起来”&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;核心能力：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;请求路径可视化&lt;/li&gt;&#10;&lt;li&gt;性能瓶颈定位&lt;/li&gt;&#10;&lt;li&gt;服务依赖分析&lt;/li&gt;&#10;&lt;li&gt;故障快速定位&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-核心概念"&gt;2.1 核心概念&lt;/h3&gt;&#10;&lt;p&gt;链路追踪有三个核心概念：&lt;/p&gt;&#10;&lt;h4 id="1trace一次完整请求"&gt;1.Trace（一次完整请求）&lt;/h4&gt;&#10;&lt;p&gt;Trace = 一次完整请求生命周期&lt;/p&gt;</description></item><item><title>微服务治理-配置中心</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/</guid><description>&lt;h1 id="微服务治理-服务发现"&gt;微服务治理-服务发现&lt;/h1&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-什么是配置中心"&gt;1.1 什么是配置中心&lt;/h3&gt;&#10;&lt;p&gt;在单体应用时代，我们通常这样管理配置：&#10;.env文件&lt;/p&gt;&#10;&lt;p&gt;但是进入微服务以后。&lt;/p&gt;&#10;&lt;p&gt;现在：每个服务都有自己的配置&lt;/p&gt;&#10;&lt;p&gt;比如REDIS_HOST需要修改，几十个服务的.env都要修改&lt;/p&gt;&#10;&lt;p&gt;于是就需要：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;配置中心&lt;/strong&gt;（Configuration Center）&lt;/p&gt;&#10;&lt;h3 id="12-配置中心解决什么问题"&gt;1.2 配置中心解决什么问题？&lt;/h3&gt;&#10;&lt;p&gt;一句话总结：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;统一管理所有配置。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-配置中心整体架构"&gt;2.1 配置中心整体架构&lt;/h3&gt;&#10;&lt;p&gt;典型架构：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; Config Center&#10; (Nacos / Apollo)&#10;&#10; ▲&#10; │&#10; Read Config│&#10;&#10; ┌────────┬─────────┼──────────┐&#10;&#10; ▼ ▼ ▼ ▼&#10;&#10;Gateway User Order Payment&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;服务：启动&lt;/p&gt;&#10;&lt;p&gt;读取：配置。&lt;/p&gt;&#10;&lt;p&gt;运行：&lt;/p&gt;&#10;&lt;p&gt;监听：配置变化。&lt;/p&gt;&#10;&lt;h3 id="22-配置加载流程"&gt;2.2 配置加载流程&lt;/h3&gt;&#10;&lt;p&gt;User Service为例&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;启动&#10;↓&#10;读取配置中心&#10;↓&#10;下载配置&#10;↓&#10;缓存到本地&#10;↓&#10;程序启动&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="23-动态刷新"&gt;2.3 动态刷新&lt;/h3&gt;&#10;&lt;p&gt;配置修改时：&#10;配置中心通知各个服务，自动刷新，无需重启&lt;/p&gt;&#10;&lt;h3 id="24-配置版本管理"&gt;2.4 配置版本管理&lt;/h3&gt;&#10;&lt;p&gt;如果修改错误：可以恢复上一版本&lt;/p&gt;&#10;&lt;h3 id="25-环境隔离"&gt;2.5 环境隔离&lt;/h3&gt;&#10;&lt;p&gt;比如 开发环境DEV、测试环境TEST、预发布UAT、生产环境PROD 配置分别管理&lt;/p&gt;&#10;&lt;h2 id="三主流配置中心"&gt;三、主流配置中心&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;产品&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;特点&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;是否支持动态刷新&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Nacos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;注册中心 + 配置中心&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Apollo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;配置中心&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Consul KV&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;KV 存储 + 配置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Etcd&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;KV 存储&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Nacos最常用&lt;/p&gt;</description></item><item><title>微服务治理-注册中心</title><link>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/</link><pubDate>Mon, 15 Sep 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/</guid><description>&lt;h1 id="微服务治理-注册中心"&gt;微服务治理-注册中心&lt;/h1&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-什么是注册中心"&gt;1.1 什么是注册中心&lt;/h3&gt;&#10;&lt;p&gt;注册中心可以理解为：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;整个微服务系统的“通讯录”或“服务目录”。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;在单体应用中：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Web&#10; │&#10; ▼&#10;Controller&#10; │&#10; ▼&#10;Service&#10; │&#10; ▼&#10;Repository&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所有模块都运行在同一个进程中，方法之间直接调用： $user = $this-&amp;gt;userService-&amp;gt;getUser($id);&lt;/p&gt;&#10;&lt;p&gt;开发者无需关心：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;服务在哪里？&lt;/li&gt;&#10;&lt;li&gt;IP 是多少？&lt;/li&gt;&#10;&lt;li&gt;端口是多少？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;因为它们都在同一个应用中。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;而在微服务架构中：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; User Service&#10;&#10; 10.0.0.10&#10;&#10; │&#10;&#10;Order Service ---------------- Product Service&#10;&#10;10.0.0.11 10.0.0.12&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在 Order Service 想调用 User Service。&lt;/p&gt;&#10;&lt;p&gt;问题来了：Order Service 怎么知道 User Service 在哪里？&lt;/p&gt;&#10;&lt;p&gt;如果直接写 IP：虽然可以运行，但会产生很多问题。&lt;/p&gt;&#10;&lt;h3 id="12-为什么不能写死-ip"&gt;1.2 为什么不能写死 IP？&lt;/h3&gt;&#10;&lt;p&gt;假设：今天：User Service 10.0.0.10&lt;/p&gt;&#10;&lt;p&gt;后面因为扩容：User Service 10.0.0.20 或者增加服务器：10.0.0.xxx&lt;/p&gt;&#10;&lt;p&gt;那么：&lt;/p&gt;&#10;&lt;p&gt;所有调用 User Service 的项目：都要修改配置。&lt;/p&gt;&#10;&lt;p&gt;到底调用哪一个?&lt;/p&gt;&#10;&lt;p&gt;于是：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;需要一个统一管理所有服务信息的地方。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>连接池</title><link>https://www.leanku.com/post/microservice/%E8%BF%9E%E6%8E%A5%E6%B1%A0/</link><pubDate>Fri, 15 Aug 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E8%BF%9E%E6%8E%A5%E6%B1%A0/</guid><description>&lt;h1 id="连接池"&gt;连接池&lt;/h1&gt;&#10;&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;&#10;&lt;h3 id="11-什么是连接池"&gt;1.1 什么是连接池&lt;/h3&gt;&#10;&lt;p&gt;连接池（Connection Pool）是：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;预先创建一定数量的连接，并统一管理和复用这些连接，而不是每次请求都重新建立连接。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这里的&amp;quot;连接&amp;quot;不仅指数据库连接，还包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;MySQL 连接&lt;/li&gt;&#10;&lt;li&gt;Redis 连接&lt;/li&gt;&#10;&lt;li&gt;HTTP 连接&lt;/li&gt;&#10;&lt;li&gt;gRPC 连接&lt;/li&gt;&#10;&lt;li&gt;Kafka 连接&lt;/li&gt;&#10;&lt;li&gt;RabbitMQ 连接&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;本质上，只要是&lt;strong&gt;建立成本较高、可以复用&lt;/strong&gt;的连接，都适合使用连接池。&lt;/p&gt;&#10;&lt;h3 id="12-为什么需要连接池"&gt;1.2 为什么需要连接池&lt;/h3&gt;&#10;&lt;p&gt;假设没有连接池：&lt;/p&gt;&#10;&lt;p&gt;每个请求执行流程如下：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;HTTP Request&#10; │&#10; ▼&#10;创建 MySQL 连接&#10; │&#10; ▼&#10;执行 SQL&#10; │&#10; ▼&#10;关闭连接&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果系统每秒有 5000 个请求, 服务器的大量资源都会浪费在建立连接上，而不是执行业务。&lt;/p&gt;&#10;&lt;h3 id="13-建立一个连接到底需要做什么"&gt;1.3 建立一个连接到底需要做什么？&lt;/h3&gt;&#10;&lt;p&gt;以 MySQL 为例：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Application&#10; │&#10; ▼&#10;TCP 三次握手&#10; │&#10; ▼&#10;SSL/TLS（可选）&#10; │&#10; ▼&#10;MySQL 用户认证&#10; │&#10; ▼&#10;权限校验&#10; │&#10; ▼&#10;初始化 Session&#10; │&#10; ▼&#10;返回连接对象&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这整个过程远比执行一条简单 SQL 更耗时。&lt;/p&gt;</description></item><item><title>Kong+Konga+Consul</title><link>https://www.leanku.com/post/microservice/kong-konga-consul/</link><pubDate>Fri, 01 Aug 2025 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/kong-konga-consul/</guid><description>&lt;h1 id="kongkongaconsul-安装和使用"&gt;Kong+Konga+Consul 安装和使用&lt;/h1&gt;&#10;&lt;p&gt;此处使用Docker安装方式&lt;/p&gt;&#10;&lt;h2 id="一-安装kong"&gt;一、 安装Kong&lt;/h2&gt;&#10;&lt;p&gt;kong具体使用可参考另一篇文章：&lt;a href="./Kong%20API%E7%BD%91%E5%85%B3.md"&gt;Kong API网关&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;为了确保 Kong、Konga 和 Consul 能够通信，Kong 和 Konga 也需要加入到同一个网络。如果你尚未创建网络，或者希望使用新的网络，可以创建一个：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker network create kong-net&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="11-安装-postgresql-kong-的数据库"&gt;1.1 安装 PostgreSQL (Kong 的数据库)&lt;/h3&gt;&#10;&lt;p&gt;Kong 需要 PostgreSQL 来存储其配置数据&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name kong-database &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; --network&lt;span class="o"&gt;=&lt;/span&gt;kong-net &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; -p 5432:5432 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;POSTGRES_USER=kong&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;POSTGRES_DB=kong&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;POSTGRES_PASSWORD=kong&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt; postgres:13&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&amp;ndash;network=kong-net: 确保数据库与 Kong、Consul 在同一网络。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;-e 环境变量：设置数据库的用户名、数据库名和密码。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;建议使用 PostgreSQL 9.6 或更高版本，这里使用了 13 版本。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="12-初始化-kong-数据库"&gt;1.2 初始化 Kong 数据库&lt;/h2&gt;&#10;&lt;p&gt;运行一个临时容器来执行数据库迁移：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker run --rm &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; --network&lt;span class="o"&gt;=&lt;/span&gt;kong-net &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;KONG_DATABASE=postgres&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;KONG_PG_HOST=kong-database&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;KONG_PG_USER=kong&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;KONG_PG_PASSWORD=kong&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt; kong:3.6.1 kong migrations bootstrap&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;--rm&lt;/code&gt;&lt;/strong&gt;: 容器退出后自动删除。&lt;/p&gt;</description></item><item><title>并发模型-线程模型</title><link>https://www.leanku.com/post/microservice/%E5%B9%B6%E5%8F%91%E6%A8%A1%E5%9E%8B-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%B9%B6%E5%8F%91%E6%A8%A1%E5%9E%8B-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/</guid><description>&lt;h1 id="并发模型-线程模型"&gt;并发模型-线程模型&lt;/h1&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-什么是线程"&gt;1.1 什么是线程&lt;/h3&gt;&#10;&lt;p&gt;线程（Thread）是：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;CPU 调度和执行任务的最小单位。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;一个进程（Process）可以包含多个线程，这些线程共享进程的内存空间和资源，但拥有各自独立的执行栈和程序计数器。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;操作系统&#10; │&#10; ▼&#10; Chrome（进程）&#10; │&#10; ┌────┴────┐&#10; │ │&#10; ▼ ▼&#10;线程1 线程2&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;线程是真正执行代码的主体，而不是进程。&lt;/p&gt;&#10;&lt;h3 id="12-进程与线程的区别"&gt;1.2 进程与线程的区别&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;对比项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;进程（Process）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;线程（Thread）&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;资源分配的基本单位&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU 调度的基本单位&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是否独立内存&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否（共享进程内存）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;创建成本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;较低&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;通信方式&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPC（管道、Socket、共享内存等）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;共享变量、锁&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;崩溃影响&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一般不影响其他进程&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一个线程异常可能导致整个进程退出（视语言/运行时而定）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="13-为什么需要线程"&gt;1.3 为什么需要线程&lt;/h3&gt;&#10;&lt;p&gt;假设没有线程：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;用户A请求&#10;↓&#10;执行3秒&#10;↓&#10;用户B开始执行&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所有请求只能串行处理。&lt;/p&gt;&#10;&lt;p&gt;有线程以后：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;线程1&#10;&#10;处理用户A&#10;&#10;线程2&#10;&#10;处理用户B&#10;&#10;线程3&#10;&#10;处理用户C&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CPU 可以调度多个线程并发执行，从而提高系统吞吐能力。&lt;/p&gt;&#10;&lt;h3 id="14-项目中的线程"&gt;1.4 项目中的线程&lt;/h3&gt;&#10;&lt;p&gt;PHP-FPM&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;HTTP Request&#10;↓&#10;PHP-FPM Worker（进程）&#10;↓&#10;执行 PHP 脚本&#10;↓&#10;请求结束&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;PHP-FPM 不是线程模型，而是多进程模型，每个 Worker 一次只处理一个请求。&lt;/p&gt;</description></item><item><title>并发模型-协程模型</title><link>https://www.leanku.com/post/microservice/%E5%B9%B6%E5%8F%91%E6%A8%A1%E5%9E%8B-%E5%8D%8F%E7%A8%8B%E6%A8%A1%E5%9E%8B/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%B9%B6%E5%8F%91%E6%A8%A1%E5%9E%8B-%E5%8D%8F%E7%A8%8B%E6%A8%A1%E5%9E%8B/</guid><description>&lt;h1 id="并发模型-协程模型"&gt;并发模型-协程模型&lt;/h1&gt;&#10;&lt;h2 id="一介绍"&gt;一、介绍&lt;/h2&gt;&#10;&lt;h3 id="11-什么是线程"&gt;1.1 什么是线程&lt;/h3&gt;&#10;&lt;p&gt;协程（Coroutine）是一种：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;运行在用户态、由程序自身调度的轻量级执行单元。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;它不像线程那样由操作系统调度，而是由运行时（Runtime）负责调度。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;操作系统&#10; │&#10; ▼&#10; Worker（线程）&#10; │&#10; ┌──┼───────────────┐&#10; │ │ │&#10; ▼ ▼ ▼&#10;协程1 协程2 协程10000&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看到：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一个线程&lt;/li&gt;&#10;&lt;li&gt;可以运行成千上万个协程&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="12-为什么会出现协程"&gt;1.2 为什么会出现协程&lt;/h3&gt;&#10;&lt;p&gt;先看传统线程。&#10;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;线程1&#10;&#10;↓&#10;&#10;查询 MySQL&#10;&#10;↓&#10;&#10;等待200ms&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;等待期间：&lt;/p&gt;&#10;&lt;p&gt;CPU：&lt;/p&gt;&#10;&lt;p&gt;空闲&lt;/p&gt;&#10;&lt;p&gt;线程：&lt;/p&gt;&#10;&lt;p&gt;阻塞&lt;/p&gt;&#10;&lt;p&gt;CPU 没有工作。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;协程出现以后：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;协程1&#10;&#10;↓&#10;&#10;等待 MySQL&#10;&#10;↓&#10;&#10;主动让出 CPU&#10;&#10;↓&#10;&#10;协程2 开始执行&#10;&#10;↓&#10;&#10;协程3 开始执行&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CPU 一直在处理其它任务。&lt;/p&gt;&#10;&lt;p&gt;因此：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;协程解决的是 IO 等待导致 CPU 空闲的问题。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="13-协程不是线程"&gt;1.3 协程不是线程&lt;/h3&gt;&#10;&lt;p&gt;协程永远依附于线程。&lt;/p&gt;&#10;&lt;p&gt;没有线程：&lt;/p&gt;&#10;&lt;p&gt;协程无法运行。&lt;/p&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-协程为什么快"&gt;2.1 协程为什么快&lt;/h3&gt;&#10;&lt;p&gt;假设：&lt;/p&gt;</description></item><item><title>高并发系统设计-服务降级</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E6%9C%8D%E5%8A%A1%E9%99%8D%E7%BA%A7/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E6%9C%8D%E5%8A%A1%E9%99%8D%E7%BA%A7/</guid><description>&lt;h1 id="高并发系统设计-服务降级"&gt;高并发系统设计-服务降级&lt;/h1&gt;&#10;&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;&#10;&lt;h3 id="11-什么是服务降级"&gt;1.1 什么是服务降级&lt;/h3&gt;&#10;&lt;p&gt;服务降级（Fallback）指的是：&lt;/p&gt;&#10;&lt;p&gt;当系统压力过大或依赖服务不可用时，主动返回一个“可接受的替代结果”，而不是让请求失败。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;正常：&#10;→ 查询实时商品详情&#10;&#10;降级：&#10;→ 返回缓存商品详情 / 静态数据&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-降级和熔断的区别"&gt;1.2 降级和熔断的区别&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;熔断&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;降级&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目的&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;防止故障扩散&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;保证可用性&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;触发&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;服务异常&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统压力 / 异常&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;行为&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;阻断调用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;返回替代结果&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是否对外可用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;熔断 = 不调用&lt;/p&gt;&#10;&lt;p&gt;降级 = 换一种方式返回&lt;/p&gt;&#10;&lt;h3 id="13-为什么需要服务降级"&gt;1.3 为什么需要服务降级&lt;/h3&gt;&#10;&lt;p&gt;在高并发系统中：&lt;/p&gt;&#10;&lt;p&gt;资源永远是有限的。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;p&gt;数据库：1000 QPS,&lt;/p&gt;&#10;&lt;p&gt;实际请求：10000 QPS&lt;/p&gt;&#10;&lt;p&gt;如果不做降级：请求全部打到数据库-》系统崩溃&lt;/p&gt;&#10;&lt;h3 id="14-企业典型应用场景"&gt;1.4 企业典型应用场景&lt;/h3&gt;&#10;&lt;h4 id="场景1商品详情页"&gt;场景1：商品详情页&lt;/h4&gt;&#10;&lt;p&gt;正常：&#10;→ 实时库存 + 价格 + 推荐&lt;/p&gt;&#10;&lt;p&gt;降级：&#10;→ 缓存商品 + 默认库存&lt;/p&gt;&#10;&lt;h4 id="场景2推荐系统"&gt;场景2：推荐系统&lt;/h4&gt;&#10;&lt;p&gt;推荐服务挂了&lt;/p&gt;&#10;&lt;p&gt;→ 返回热门商品&lt;/p&gt;&#10;&lt;h4 id="场景3搜索系统"&gt;场景3：搜索系统&lt;/h4&gt;&#10;&lt;p&gt;ES不可用&lt;/p&gt;</description></item><item><title>高并发系统设计-隔离</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%9A%94%E7%A6%BB/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%9A%94%E7%A6%BB/</guid><description>&lt;h1 id="高并发系统设计-隔离"&gt;高并发系统设计-隔离&lt;/h1&gt;&#10;&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;&#10;&lt;h3 id="11-什么是隔离"&gt;1.1 什么是隔离&lt;/h3&gt;&#10;&lt;p&gt;隔离（Bulkhead）源自船舶结构设计：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;船体被分割成多个“水密舱”，即使某一舱进水，也不会导致整船沉没。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;在分布式系统中对应为：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;将不同业务流量或依赖资源隔离开，避免相互影响。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;订单服务&#10;支付服务&#10;库存服务&#10;推荐服务&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果没有隔离：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;推荐服务慢查询&#10;→ 占满线程池&#10;→ 订单无法处理&#10;→ 系统崩溃&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-为什么需要隔离"&gt;1.2 为什么需要隔离&lt;/h3&gt;&#10;&lt;p&gt;在高并发系统中，最危险的不是“单点失败”，而是：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;资源被某一个模块耗尽&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;典型问题：&lt;/p&gt;&#10;&lt;h4 id="1-线程池被占满"&gt;1. 线程池被占满&lt;/h4&gt;&#10;&lt;p&gt;慢接口占用所有 worker&#10;→ 新请求无法处理&lt;/p&gt;&#10;&lt;h4 id="2-连接池被耗尽"&gt;2. 连接池被耗尽&lt;/h4&gt;&#10;&lt;p&gt;某服务频繁调用DB&#10;→ 连接池100个全部占满&lt;/p&gt;&#10;&lt;h4 id="3某服务拖垮整个系统"&gt;3.某服务拖垮整个系统&lt;/h4&gt;&#10;&lt;p&gt;推荐服务异常&#10;→ 影响订单服务&#10;→ 影响支付服务&#10;→ 全系统不可用&lt;/p&gt;&#10;&lt;h3 id="13-隔离的核心目标"&gt;1.3 隔离的核心目标&lt;/h3&gt;&#10;&lt;p&gt;隔离的本质是：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;限制资源共享范围，防止“一个坏点影响全局”&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;目标：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;防止资源争抢&lt;/li&gt;&#10;&lt;li&gt;防止链式崩溃&lt;/li&gt;&#10;&lt;li&gt;提高系统稳定性&lt;/li&gt;&#10;&lt;li&gt;控制故障范围&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="14-典型场景"&gt;1.4 典型场景&lt;/h3&gt;&#10;&lt;h4 id="场景1电商系统"&gt;场景1：电商系统&lt;/h4&gt;&#10;&lt;p&gt;订单 / 支付 / 推荐 / 搜索&lt;/p&gt;&#10;&lt;p&gt;要求：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;推荐挂了不能影响下单&lt;/li&gt;&#10;&lt;li&gt;搜索挂了不能影响支付&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="场景2微服务调用"&gt;场景2：微服务调用&lt;/h4&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Service A → B → C → D&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果 D 崩溃：&lt;/p&gt;</description></item><item><title>高并发系统设计-缓存保护</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E7%BC%93%E5%AD%98%E4%BF%9D%E6%8A%A4/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E7%BC%93%E5%AD%98%E4%BF%9D%E6%8A%A4/</guid><description>&lt;h1 id="高并发系统设计-缓存保护"&gt;高并发系统设计-缓存保护&lt;/h1&gt;&#10;&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;&#10;&lt;h3 id="11-什么是缓存保护"&gt;1.1 什么是缓存保护&lt;/h3&gt;&#10;&lt;p&gt;缓存保护（Cache Protection）是指：&lt;/p&gt;&#10;&lt;p&gt;通过一系列缓存设计策略，避免缓存异常导致数据库被大量请求直接访问，从而保证系统稳定性。&lt;/p&gt;&#10;&lt;p&gt;典型架构：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; Client&#10; │&#10; ▼&#10; Gateway&#10; │&#10; ▼&#10; Application&#10; │&#10; ┌─────────┴─────────┐&#10; │ │&#10; ▼ ▼&#10; Local Cache Redis Cache&#10; │&#10; Cache Miss？&#10; │&#10; ▼&#10; MySQL&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-为什么需要缓存保护"&gt;1.2 为什么需要缓存保护&lt;/h3&gt;&#10;&lt;p&gt;Redis 可以承受几十万甚至百万级 QPS，而 MySQL 通常只能支撑几千 QPS。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Redis&#10;&#10;100000 QPS&#10;↓&#10;MySQL&#10;&#10;3000 QPS&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果 Redis 出现问题：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;100000 请求&#10;↓&#10;全部进入 MySQL&#10;↓&#10;数据库连接耗尽&#10;↓&#10;整个系统崩溃&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;缓存的首要目标是保护数据库，其次才是提升访问性能。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="13-企业缓存架构"&gt;1.3 企业缓存架构&lt;/h3&gt;&#10;&lt;p&gt;企业通常采用：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; Client&#10; │&#10; ▼&#10; Application&#10; │&#10; ▼&#10; Local Cache(Caffeine)&#10; │&#10; ▼&#10; Redis Cluster&#10; │&#10; ▼&#10; MySQL&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;同时配合：&lt;/p&gt;</description></item><item><title>高并发系统设计-熔断</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E7%86%94%E6%96%AD/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E7%86%94%E6%96%AD/</guid><description>&lt;h1 id="高并发系统设计-熔断"&gt;高并发系统设计-熔断&lt;/h1&gt;&#10;&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;&#10;&lt;h3 id="11-什么是熔断"&gt;1.1 什么是熔断&lt;/h3&gt;&#10;&lt;p&gt;熔断（Circuit Breaker）的核心思想来自电路保险丝：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;当电流过大时，保险丝会断开，保护整个电路。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;在分布式系统中：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;服务A → 服务B → 服务C → 数据库&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果服务C异常：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;超时&lt;/li&gt;&#10;&lt;li&gt;报错&lt;/li&gt;&#10;&lt;li&gt;响应缓慢&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;那么如果不做控制：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;A 等 BB 等 CC 卡住→ 线程全部阻塞→ 请求堆积→ 系统雪崩&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;熔断的作用就是：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;当下游服务异常时，直接停止调用它，快速失败。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h3 id="12-为什么需要熔断"&gt;1.2 为什么需要熔断&lt;/h3&gt;&#10;&lt;p&gt;在高并发系统中，最危险的问题不是“服务失败”，而是：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;失败被放大并传播&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;数据库慢查询&#10; ↓&#10;所有请求阻塞&#10; ↓&#10;连接池耗尽&#10; ↓&#10;Redis压力上升&#10; ↓&#10;Gateway超时&#10; ↓&#10;全链路崩溃&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这就是：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;级联故障（Cascade Failure）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h3 id="13-熔断解决的问题"&gt;1.3 熔断解决的问题&lt;/h3&gt;&#10;&lt;p&gt;熔断解决三类问题：&lt;/p&gt;&#10;&lt;h4 id="1-防止线程阻塞"&gt;1. 防止线程阻塞&lt;/h4&gt;&#10;&lt;p&gt;避免请求一直等待下游：&lt;/p&gt;&#10;&lt;p&gt;请求 → 卡住 → 不释放资源&lt;/p&gt;&#10;&lt;h4 id="2防止错误放大"&gt;2.防止错误放大&lt;/h4&gt;&#10;&lt;p&gt;错误不会扩散到上游系统：&lt;/p&gt;&#10;&lt;p&gt;错误服务 → 不再调用&lt;/p&gt;&#10;&lt;h3 id="14-企业典型场景"&gt;1.4 企业典型场景&lt;/h3&gt;&#10;&lt;h4 id="场景1支付服务异常"&gt;场景1：支付服务异常&lt;/h4&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;订单服务 → 支付服务（异常）&#10;&#10;不熔断：&#10;→ 一直等待&#10;→ 订单线程堆积&#10;&#10;熔断后：&#10;→ 直接返回“支付处理中”&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="场景2库存服务不可用"&gt;场景2：库存服务不可用&lt;/h4&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;库存服务挂了&#10;&#10;熔断：&#10;→ 不再调用库存&#10;→ 返回“库存未知”&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="场景3第三方接口超时"&gt;场景3：第三方接口超时&lt;/h4&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;</description></item><item><title>高并发系统设计-限流</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%99%90%E6%B5%81/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%99%90%E6%B5%81/</guid><description>&lt;h1 id="高并发系统设计-限流"&gt;高并发系统设计-限流&lt;/h1&gt;&#10;&lt;h1 id="一什么是限流"&gt;一、什么是限流&lt;/h1&gt;&#10;&lt;p&gt;限流（Rate Limiting）是指&lt;strong&gt;限制单位时间内允许进入系统的请求数量&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;简单来说，就是：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;控制流量进入系统的速度，而不是等系统崩溃之后再处理。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;p&gt;某接口限制：1000 Request / Second&lt;/p&gt;&#10;&lt;p&gt;如果一秒钟来了：1500 Request&lt;/p&gt;&#10;&lt;p&gt;那么：1000正常处理，500拒绝访问&lt;/p&gt;&#10;&lt;p&gt;通常返回：HTTP 429 Too Many Requests&lt;/p&gt;&#10;&lt;p&gt;限流的本质就是：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;宁可拒绝一部分请求，也不要让整个系统崩溃。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="二为什么需要限流"&gt;二、为什么需要限流&lt;/h2&gt;&#10;&lt;p&gt;因为系统资源是有限的。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;p&gt;服务器配置：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;CPU：8 Core&#10;Memory：16GB&#10;MySQL连接池：100&#10;Redis连接池：200&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这些资源都存在上限。&lt;/p&gt;&#10;&lt;p&gt;假设数据库最大只能处理： 5000 QPS&lt;/p&gt;&#10;&lt;p&gt;如果突然来了：30000 QPS&lt;/p&gt;&#10;&lt;p&gt;没有限流：30000全部访问MySQL-&amp;gt;连接池耗尽-&amp;gt;CPU100%-&amp;gt;慢SQL-&amp;gt;超时-&amp;gt;&amp;hellip;-&amp;gt;系统崩溃&lt;/p&gt;&#10;&lt;p&gt;有了限流：30000-&amp;gt;Gateway-&amp;gt;允许5000-&amp;gt;25000直接拒绝-&amp;gt;系统稳定&lt;/p&gt;&#10;&lt;p&gt;虽然部分用户会收到&amp;quot;系统繁忙&amp;quot;的提示，但系统整体仍然保持可用。&lt;/p&gt;&#10;&lt;p&gt;这正是限流存在的意义&lt;/p&gt;&#10;&lt;h2 id="三典型应用场景"&gt;三、典型应用场景&lt;/h2&gt;&#10;&lt;p&gt;限流几乎存在于所有互联网系统中。&lt;/p&gt;&#10;&lt;h3 id="1登录接口"&gt;1、登录接口&lt;/h3&gt;&#10;&lt;p&gt;例如：POST /login&lt;/p&gt;&#10;&lt;p&gt;限制：每个IP 5次/分钟&lt;/p&gt;&#10;&lt;p&gt;防止：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;暴力破解密码&lt;/li&gt;&#10;&lt;li&gt;恶意攻击&lt;/li&gt;&#10;&lt;li&gt;短时间大量登录&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2短信验证码"&gt;2、短信验证码&lt;/h3&gt;&#10;&lt;h3 id="3支付接口"&gt;3、支付接口&lt;/h3&gt;&#10;&lt;h3 id="4秒杀系统"&gt;4、秒杀系统&lt;/h3&gt;&#10;&lt;h3 id="5开放api"&gt;5、开放API&lt;/h3&gt;&#10;&lt;h2 id="四限流的位置"&gt;四、限流的位置&lt;/h2&gt;&#10;&lt;p&gt;限流通常不是只有一层。&lt;/p&gt;&#10;&lt;p&gt;一般有四层。&lt;/p&gt;&#10;&lt;h3 id="第一层cdn"&gt;第一层：CDN&lt;/h3&gt;&#10;&lt;p&gt;例如：&#10;Cloudflare-&amp;gt;限制恶意流量&lt;/p&gt;&#10;&lt;p&gt;主要抵御：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CC攻击&lt;/li&gt;&#10;&lt;li&gt;DDoS&lt;/li&gt;&#10;&lt;li&gt;Bot&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="第二层nginx--gateway"&gt;第二层：Nginx / Gateway&lt;/h3&gt;&#10;&lt;p&gt;例如：&#10;Client-&amp;gt;Gateway-&amp;gt;Application&lt;/p&gt;&#10;&lt;p&gt;nginx示例&lt;/p&gt;</description></item><item><title>高并发系统设计-重试</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%87%8D%E8%AF%95/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%87%8D%E8%AF%95/</guid><description>&lt;h1 id="高并发系统设计-重试"&gt;高并发系统设计-重试&lt;/h1&gt;&#10;&lt;h2 id="一概述"&gt;一、概述&lt;/h2&gt;&#10;&lt;h3 id="11-什么是重试"&gt;1.1 什么是重试&lt;/h3&gt;&#10;&lt;p&gt;重试（Retry）是指：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;当一次请求失败后，在满足条件的情况下再次发起请求，以提高成功率。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;p&gt;请求 → 失败 → 再请求 → 成功&lt;/p&gt;&#10;&lt;h3 id="12-为什么需要重试"&gt;1.2 为什么需要重试&lt;/h3&gt;&#10;&lt;p&gt;在分布式系统中，失败是常态：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;网络抖动&lt;/li&gt;&#10;&lt;li&gt;RPC短暂超时&lt;/li&gt;&#10;&lt;li&gt;Redis瞬时不可用&lt;/li&gt;&#10;&lt;li&gt;MySQL连接波动&lt;/li&gt;&#10;&lt;li&gt;依赖服务重启&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;请求支付服务 → 超时&#10;&#10;但实际服务是正常的&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果不重试：用户支付失败&lt;/p&gt;&#10;&lt;p&gt;但如果允许重试：&lt;/p&gt;&#10;&lt;p&gt;第一次失败&lt;/p&gt;&#10;&lt;p&gt;第二次成功&lt;/p&gt;&#10;&lt;h3 id="13-重试解决的问题"&gt;1.3 重试解决的问题&lt;/h3&gt;&#10;&lt;p&gt;重试主要解决：&lt;/p&gt;&#10;&lt;h4 id="1-短暂故障"&gt;1. 短暂故障&lt;/h4&gt;&#10;&lt;p&gt;如：&#10;网络抖动&#10;服务瞬断&#10;连接超时&lt;/p&gt;&#10;&lt;h4 id="2依赖服务不稳定"&gt;2.依赖服务不稳定&lt;/h4&gt;&#10;&lt;p&gt;如：&lt;/p&gt;&#10;&lt;p&gt;第三方支付 / 短信 / API&lt;/p&gt;&#10;&lt;h4 id="3提高成功率"&gt;3.提高成功率&lt;/h4&gt;&#10;&lt;h3 id="14-重试的误区"&gt;1.4 重试的误区&lt;/h3&gt;&#10;&lt;p&gt;错误做法 ： 失败 → 立即重试 → 再失败 → 无限循环&lt;/p&gt;&#10;&lt;p&gt;正确做法是：&lt;strong&gt;可控重试 + 退避策略 + 最大次数限制&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="二原理"&gt;二、原理&lt;/h2&gt;&#10;&lt;h3 id="21-重试的核心思想"&gt;2.1 重试的核心思想&lt;/h3&gt;&#10;&lt;p&gt;重试本质是：&lt;/p&gt;&#10;&lt;p&gt;用时间换成功率&lt;/p&gt;&#10;&lt;p&gt;但前提是：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;不能无限重试&lt;/li&gt;&#10;&lt;li&gt;不能立即重试&lt;/li&gt;&#10;&lt;li&gt;不能对所有错误重试&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="22-哪些情况可以重试"&gt;2.2 哪些情况可以重试&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;网络超时&lt;/li&gt;&#10;&lt;li&gt;连接失败&lt;/li&gt;&#10;&lt;li&gt;503 / 502&lt;/li&gt;&#10;&lt;li&gt;RPC短暂异常&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;不可重试&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>高并发系统稳定性设计</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E7%A8%B3%E5%AE%9A%E6%80%A7%E8%AE%BE%E8%AE%A1/</link><pubDate>Fri, 11 Jul 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E7%A8%B3%E5%AE%9A%E6%80%A7%E8%AE%BE%E8%AE%A1/</guid><description>&lt;h1 id="高并发系统稳定性设计"&gt;高并发系统稳定性设计&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;本文适用于 Web 应用、API 服务、微服务、分布式系统等高并发场景，重点介绍现代企业级系统如何通过限流、熔断、降级、重试、超时、隔离和缓存等技术保障系统的稳定运行。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一什么是高并发"&gt;一、什么是高并发&lt;/h2&gt;&#10;&lt;h3 id="11-高并发的定义"&gt;1.1 高并发的定义&lt;/h3&gt;&#10;&lt;p&gt;高并发（High Concurrency）是指系统在&lt;strong&gt;单位时间内需要同时处理大量用户请求&lt;/strong&gt;的能力。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;电商平台双十一抢购&lt;/li&gt;&#10;&lt;li&gt;秒杀活动&lt;/li&gt;&#10;&lt;li&gt;支付系统&lt;/li&gt;&#10;&lt;li&gt;社交平台热点事件&lt;/li&gt;&#10;&lt;li&gt;游戏服务器&lt;/li&gt;&#10;&lt;li&gt;视频直播&lt;/li&gt;&#10;&lt;li&gt;AI 大模型接口&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;假设一个用户访问商品详情页面，请求流程如下：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Client&#10; │&#10; ▼&#10;Nginx&#10; │&#10; ▼&#10;PHP&#10; │&#10; ├── Redis&#10; ├── MySQL&#10; └── Elasticsearch&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一个用户访问几乎不会产生压力。&lt;/p&gt;&#10;&lt;p&gt;但是如果同时有10000个用户-&amp;gt;10000 HTTP Requests-&amp;gt;Application&lt;/p&gt;&#10;&lt;p&gt;系统就需要在极短时间内完成：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;HTTP 请求解析&lt;/li&gt;&#10;&lt;li&gt;身份认证&lt;/li&gt;&#10;&lt;li&gt;参数校验&lt;/li&gt;&#10;&lt;li&gt;Redis 查询&lt;/li&gt;&#10;&lt;li&gt;数据库访问&lt;/li&gt;&#10;&lt;li&gt;JSON 序列化&lt;/li&gt;&#10;&lt;li&gt;网络返回&lt;/li&gt;&#10;&lt;li&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果系统设计不合理，就可能出现响应变慢、超时甚至崩溃。&lt;/p&gt;&#10;&lt;h3 id="12-高并发--高性能"&gt;1.2 高并发 ≠ 高性能&lt;/h3&gt;&#10;&lt;h4 id="高性能performance"&gt;高性能（Performance）&lt;/h4&gt;&#10;&lt;p&gt;高性能关注的是&#10;&lt;strong&gt;单个请求处理速度。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;p&gt;接口耗时：50 ms&lt;/p&gt;&#10;&lt;p&gt;优化 SQL 后：20 ms&lt;/p&gt;&#10;&lt;p&gt;这属于性能优化。&lt;/p&gt;&#10;&lt;p&gt;常见优化包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SQL 优化&lt;/li&gt;&#10;&lt;li&gt;Redis 缓存&lt;/li&gt;&#10;&lt;li&gt;JVM / PHP Runtime 优化&lt;/li&gt;&#10;&lt;li&gt;协程&lt;/li&gt;&#10;&lt;li&gt;对象池&lt;/li&gt;&#10;&lt;li&gt;连接池&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="高并发concurrency"&gt;高并发（Concurrency）&lt;/h4&gt;&#10;&lt;p&gt;高并发关注的是：&#10;&lt;strong&gt;系统能够同时处理多少请求。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>分布式锁详解</title><link>https://www.leanku.com/post/microservice/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E8%AF%A6%E8%A7%A3/</link><pubDate>Wed, 11 Jun 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E8%AF%A6%E8%A7%A3/</guid><description>&lt;h1 id="分布式锁详解"&gt;分布式锁详解&lt;/h1&gt;&#10;&lt;p&gt;在高并发和分布式系统中，为保证资源的一致性和互斥访问，分布式锁是必不可少的技术手段。本文将系统地讲解分布式锁的概念、场景、实现原理、使用方式，并附 PHP 示例。&lt;/p&gt;&#10;&lt;h2 id="1-什么是分布式锁"&gt;1. 什么是分布式锁&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;p&gt;分布式锁（Distributed Lock）是用于在 多台机器或多个服务实例中控制共享资源访问的机制。它保证在同一时间，只有一个客户端可以操作某个资源，从而避免并发冲突。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;特点：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;互斥性&lt;/strong&gt;：同一时间只有一个客户端持有锁。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;可重入性（可选）&lt;/strong&gt;：同一客户端可以重复获取锁。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;可靠性&lt;/strong&gt;：锁过期或客户端异常可自动释放，避免死锁。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;可扩展性&lt;/strong&gt;：适用于分布式系统和微服务架构。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-分布式锁的应用场景"&gt;2. 分布式锁的应用场景&lt;/h2&gt;&#10;&lt;p&gt;分布式锁在企业场景非常常见，典型使用场景包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;库存扣减&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;秒杀或抢购场景，防止库存超卖。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;订单号生成&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;保证全局唯一订单号。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;任务调度&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;多实例系统中，保证任务只被单实例执行。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;缓存更新&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;防止缓存击穿时，多实例同时重建缓存。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;支付或转账操作&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;防止重复扣款或资金异常。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-分布式锁的实现原理"&gt;3. 分布式锁的实现原理&lt;/h2&gt;&#10;&lt;h3 id="31-数据库锁"&gt;3.1 数据库锁&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;利用数据库唯一索引或事务机制创建锁记录。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;locks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;create_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;order_123&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 成功表示获得锁，失败表示锁已被占用&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;优缺点&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;优点：简单易用，直接使用现有数据库。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;缺点：高并发性能较差，数据库可能成为瓶颈。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="32-redis-锁"&gt;3.2 Redis 锁&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;利用 Redis 的 &lt;strong&gt;SETNX 或 SET key value NX PX&lt;/strong&gt; 原子操作。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;设置锁过期时间，防止死锁。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;(&lt;strong&gt;RedLock红锁&lt;/strong&gt;可以解决在 Redis ​主从复制或哨兵模式下，使用单实例 Redis 锁可能遇到的锁失效问题。)&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;释放锁&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;需要验证当前客户端持有锁，防止误删他人锁。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>高并发技术体系</title><link>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E6%8A%80%E6%9C%AF%E4%BD%93%E7%B3%BB/</link><pubDate>Sat, 10 May 2025 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E9%AB%98%E5%B9%B6%E5%8F%91%E6%8A%80%E6%9C%AF%E4%BD%93%E7%B3%BB/</guid><description>&lt;h1 id="高并发技术体系概要"&gt;高并发技术体系概要&lt;/h1&gt;&#10;&lt;p&gt;主要为基础理论知识&lt;/p&gt;&#10;&lt;h2 id="第一部分高并发保护机制"&gt;第一部分：高并发保护机制&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%99%90%E6%B5%81.md"&gt;限流&lt;/a&gt;&#10;&lt;a href="%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E7%86%94%E6%96%AD.md"&gt;熔断&lt;/a&gt;&#10;&lt;a href="%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E6%9C%8D%E5%8A%A1%E9%99%8D%E7%BA%A7.md"&gt;降级&lt;/a&gt;&#10;&lt;a href="./%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%87%8D%E8%AF%95.md"&gt;重试&lt;/a&gt;&#10;&lt;a href="%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E9%9A%94%E7%A6%BB.md"&gt;隔离&lt;/a&gt;&#10;&lt;a href="%E9%AB%98%E5%B9%B6%E5%8F%91%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-%E7%BC%93%E5%AD%98.md"&gt;缓存保护&lt;/a&gt;&#10;超时&lt;/p&gt;&#10;&lt;h2 id="第二部分并发模型"&gt;第二部分：并发模型&lt;/h2&gt;&#10;&lt;p&gt;线程模型&#10;协程模型&#10;事件驱动模型&#10;Reactor模型&lt;/p&gt;&#10;&lt;h2 id="第三部分资源池化"&gt;第三部分：资源池化&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="%E8%BF%9E%E6%8E%A5%E6%B1%A0.md"&gt;连接池&lt;/a&gt;&#10;线程池&#10;协程池&#10;对象池&lt;/p&gt;&#10;&lt;h2 id="第四部分异步架构"&gt;第四部分：异步架构&lt;/h2&gt;&#10;&lt;p&gt;MQ&#10;事件驱动&#10;削峰填谷&#10;异步任务&lt;/p&gt;&#10;&lt;h2 id="第五部分微服务治理"&gt;第五部分：微服务治理&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83.md"&gt;注册中心&lt;/a&gt;&#10;服务发现&#10;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83.md"&gt;配置中心&lt;/a&gt;&#10;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.md"&gt;负载均衡&lt;/a&gt;&#10;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8.md"&gt;服务调用&lt;/a&gt;&#10;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-API%E7%BD%91%E5%85%B3.md"&gt;API Gateway&lt;/a&gt;&#10;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E9%93%BE%E8%B7%AF%E8%BF%BD%E8%B8%AA.md"&gt;链路追踪&lt;/a&gt;&#10;&lt;a href="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86-%E6%9C%8D%E5%8A%A1%E7%9B%91%E6%8E%A7.md"&gt;服务监控&lt;/a&gt;&#10;&lt;a href="../EFK%E6%8A%80%E6%9C%AF%E6%A0%88%E8%A7%A3%E6%9E%90%E5%8F%8APHP%E5%BA%94%E7%94%A8%E5%AE%9E%E8%B7%B5.md"&gt;日志系统&lt;/a&gt;&lt;/p&gt;</description></item><item><title>关于分布式</title><link>https://www.leanku.com/post/microservice/%E5%85%B3%E4%BA%8E%E5%88%86%E5%B8%83%E5%BC%8F/</link><pubDate>Tue, 11 Jun 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/%E5%85%B3%E4%BA%8E%E5%88%86%E5%B8%83%E5%BC%8F/</guid><description>&lt;h1 id="关于分布式"&gt;关于分布式&lt;/h1&gt;&#10;&lt;h2 id="一什么是分布式"&gt;一、什么是分布式？&lt;/h2&gt;&#10;&lt;p&gt;一个系统，各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;可以指多个不同组件分布在网络上互相协作&lt;/li&gt;&#10;&lt;li&gt;也可以一个组件的多个副本组成集群，互相协作如同一个组件，比如数据存储服务中心为了数据不丢失而采取的多个服务备份冗余&lt;/li&gt;&#10;&lt;li&gt;分布式最早出现的目的首先是解决单点问题，避免单点故障，然后解决了性能问题&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二分布式和微服务的区别"&gt;二、分布式和微服务的区别？&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;微服务并不一定是分布式系统（微服务中多个服务不一定部署在不同服务器，单机部署情况则不算是分布式）&lt;/li&gt;&#10;&lt;li&gt;分布式一定不是微服务 （分布式祖耀侧重服务的部署方式，微服务则是针对应用的一种服务拆分的架构）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三分布式cap原则"&gt;三、分布式CAP原则&lt;/h2&gt;&#10;&lt;p&gt;在设计一个分布式项目的时候会遇到三个特性：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;一致性&lt;/strong&gt;（Consistency）：所有节点数据实时同步，读取始终返回最新值&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;可用性&lt;/strong&gt;（Availability）：每个请求必须得到响应（无论数据是否最新），高可用&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;分区容错&lt;/strong&gt;（Partition Tolerance）：分布式最基本也是必需要有的特性，系统在遇到某个节点或网络分区故障时，仍然能够对外提供服务&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;三者无法同时满足，最多只能实现其中两个，网络分区发生时，必须牺牲C或A&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;‌CP&lt;/strong&gt;（牺牲可用性）‌：如ZooKeeper，确保数据强一致性但可能拒绝请求&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;‌AP&lt;/strong&gt;（牺牲一致性）‌：如Eureka，保证服务可用但允许数据短暂不一致&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三-base理论"&gt;三、 BASE理论&lt;/h2&gt;&#10;&lt;p&gt;BASE理论是分布式系统设计原则，&lt;strong&gt;BASE&lt;/strong&gt; 是指基本可用（Basically Available）、软状态（ Soft State）、最终一致性（ Eventual Consistency），核心思想是即使无法做到强一致性（CAP 的一致性就是强一致性），但应用可以采用适合的方式达到最终一致性。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;基本可用（Basically Available）：分布式系统，在出现故障的时候，允许损失部分可用性。类似服务降级&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;软状态（Soft State）：允许系统存在中间状态，而该中间状态不会影响系统整体可用性。这里的中间状态就是 CAP 理论中的数据不一致。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;最终一致性（Eventual Consistency）：系统中的所有数据副本经过一定时间后，最终能够达到一致的状态。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="四分布式事务及解决方案"&gt;四、分布式事务及解决方案&lt;/h2&gt;&#10;&lt;h3 id="分布式事务"&gt;分布式事务&lt;/h3&gt;&#10;&lt;p&gt;本地事务依赖数据库本身提供的事务特性来实现， 但是在分布式环境下，可能会出现需要远程调用，比如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;begin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;transaction&lt;/span&gt;&lt;span class="err"&gt;；&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;本地数据库操作：张三减少金额&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;远程调用：让李四增加金额&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;commit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;transation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;张三和李四的账户不在一个数据库中甚至不在一个应用系统里，实现转账事务需要通过远程调用，由于网络问题就会导致分布式事务问题。&lt;/p&gt;&#10;&lt;h3 id="分布式事务解决方案"&gt;分布式事务解决方案&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;2PC&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;2PC 即两阶段提交协议，是将整个事务流程分为两个阶段，准备阶段（Prepare phase）、提交阶段（commit phase），2 是指两个阶段，P 是指准备阶段，C 是指提交阶段。偏向数据库&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;TCC&lt;/strong&gt;&#10;TCC 是 Try、Conﬁrm、Cancel 三个词语的缩写，TCC 要求每个分支事务实现三个操作：预处理 Try、确认 Conﬁrm、撤销 Cancel。Try 操作做业务检查及资源预留，Conﬁrm 做业务确认操作，Cancel 实现一个与 Try 相反的操作即回滚操作。TM 首先发起所有的分支事务的 Try 操作，任何一个分支事务的Try操作执行失败，TM 将会发起所有分支事务的 Cancel 操作，若 Try 操作全部成功，TM 将会发起所有分支事务的 Conﬁrm 操作，其中 Conﬁrm/Cancel 操作若执行失败，TM 会进行重试。偏向代码&lt;/p&gt;</description></item><item><title>Kong API网关</title><link>https://www.leanku.com/post/microservice/kong-api%E7%BD%91%E5%85%B3/</link><pubDate>Tue, 01 Aug 2023 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/kong-api%E7%BD%91%E5%85%B3/</guid><description>&lt;h1 id="kong-api网关"&gt;Kong API网关&lt;/h1&gt;&#10;&lt;h2 id="api网关特点"&gt;API网关特点&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;集合多个API，统一API入口&lt;/li&gt;&#10;&lt;li&gt;避免内部信息泄露&lt;/li&gt;&#10;&lt;li&gt;提供安全认证&lt;/li&gt;&#10;&lt;li&gt;支持混合通讯协议&lt;/li&gt;&#10;&lt;li&gt;降低微服务复杂度&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;常用的API网关有：NGINX，Zuul，Kong&lt;/p&gt;&#10;&lt;h2 id="kong-介绍"&gt;Kong 介绍&lt;/h2&gt;&#10;&lt;p&gt;kong是微服务中的一个网关组件，具有高可用和可扩展性，能提供易于使用的restful api来操作和配置API管理系统，同时它也可以通过负载均衡的功能把请求均匀的分发到各个服务器上，应对大量的请求。基于Nginx和OpenResty，是一个具有分布式、高性能、高并发、可伸缩&amp;hellip;亚毫秒级延迟等特性和功能的微服务抽象层。&lt;/p&gt;&#10;&lt;h2 id="konga-是kong的ui界面"&gt;konga 是kong的UI界面&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;多用户管理&lt;/li&gt;&#10;&lt;li&gt;管理多个kong节点&lt;/li&gt;&#10;&lt;li&gt;使用快照备份，还原和迁移Kong节点&lt;/li&gt;&#10;&lt;li&gt;使用运行状态检查监控节点和API状态&lt;/li&gt;&#10;&lt;li&gt;数据库集成postgresSQL&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="kong-流程图"&gt;Kong 流程图&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="http://resources.leanku.com/kong.png" alt="Kong流程图"&gt;&lt;/p&gt;&#10;&lt;h2 id="kong-安装"&gt;Kong 安装&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://getkong.org/install/"&gt;Kong下载安装&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/pantsel/konga"&gt;Konga下载安装&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="api操作-文档地址"&gt;API操作 &lt;a href="https://docs.konghq.com/gateway/3.5.x/admin-api/"&gt;文档地址&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;示例:&lt;/p&gt;&#10;&lt;h3 id="负载均衡"&gt;负载均衡&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 添加负载均衡&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=demo-upstream&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/upstreams&amp;#39;&#10;&#10;#设置权重&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;target=127.0.0.1:8000&amp;#34; \&#10; -d &amp;#34;weight=100&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/upstreams/demo-upstream/targets&amp;#39;&#10;&#10; curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;target=127.0.0.1:8080&amp;#34; \&#10; -d &amp;#34;weight=500&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/upstreams/demo-upstream/targets&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加service"&gt;添加Service&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 添加负载均衡&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=demo-service&amp;#34; \&#10; -d &amp;#34;host=demo-upstream&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/services&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加路由"&gt;添加路由&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 添加负载均衡&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=demo-service-route&amp;#34; \&#10; -d &amp;#34;paths[]=/abc&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/services/demo-service/routes&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="plugins-为路由添加basic-auth"&gt;Plugins 为路由添加basic-auth&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=basic-auth&amp;#34; \&#10; -d &amp;#34;config.hide_credentials=true&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/routes/demo-service-route/plugins&amp;#39;&#10;&#10;## 添加成功后需要添加CONSUMERS在Plugins添加basic auth&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="plugins-为services添加jwt"&gt;Plugins 为services添加jwt&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=jwt&amp;#34; \&#10; -d &amp;#34;config.hide_credentials=true&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/services/demo-service/plugins&amp;#39;&#10;&#10;## 添加成功后需要CONSUMERS配置jwt&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="plugins-为services添加oauth2"&gt;Plugins 为services添加oauth2&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=oauth2&amp;#34; \&#10; -d &amp;#34;config.enable_authorization_code=true&amp;#34; \&#10; -d &amp;#34;config.enable_client_credentials=true&amp;#34; \&#10; -d &amp;#34;config.token_expiration=7200&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/services/demo-service/plugins&amp;#39;&#10;&#10;## 添加成功后需要CONSUMERS在Plugins添加auth2&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=test&amp;#34; \&#10; -d &amp;#34;config.client_id=true&amp;#34; \&#10; -d &amp;#34;config.client_secret=true&amp;#34; \&#10; -d &amp;#34;config.token_expiration=7200&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/consumers/test/oauth2&amp;#39;&#10;&#10; ## 替换下面的client_id和client_secret获取Token &#10; curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;grant_type=client_credentials&amp;#34; \&#10; -d &amp;#34;client_id=xxx&amp;#34; \&#10; -d &amp;#34;client_secret=xxx&amp;#34; \&#10; -d &amp;#34;config.token_expiration=7200&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8443/abc/oauth2/token&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="plugins-为services添加限流"&gt;Plugins 为services添加限流&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 限制IP每分钟5次&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=rate-limiting&amp;#34; \&#10; -d &amp;#34;config.minute=5&amp;#34; \&#10; -d &amp;#34;config.limit_by=ip&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/services/demo-service/plugins&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="plugins-为services添加黑白名单"&gt;Plugins 为services添加黑白名单&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 限制127.0.0.1访问&#10;curl -i -X POST \&#10; -H &amp;#34;Content-Type:application/x-www-form-urlencoded&amp;#34; \&#10; -d &amp;#34;name=ip-restriction&amp;#34; \&#10; -d &amp;#34;config.deny=127.0.0.1&amp;#34; \&#10; &amp;#39;http://127.0.0.1:8001/services/demo-service/plugins&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Konga</title><link>https://www.leanku.com/post/microservice/konga/</link><pubDate>Tue, 01 Aug 2023 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/konga/</guid><description>&lt;h1 id="konga"&gt;Konga&lt;/h1&gt;&#10;&lt;p&gt;Konga的本质：Konga是一个图形化界面，它最终是通过调用你配置的 Kong Admin API 来修改Kong的配置的。&lt;/p&gt;&#10;&lt;p&gt;文档参考：遇到复杂场景时，&lt;strong&gt;最好的老师&lt;/strong&gt;依然是&lt;a href="https://developer.konghq.com/"&gt;Kong官方文档&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="一首次登录与初始化设置"&gt;一、首次登录与初始化设置&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;访问Konga并注册：在浏览器中打开 http://&amp;lt;你的服务器IP&amp;gt;:1337。首次访问时，Konga会要求你注册一个管理员账户。填写用户名、邮箱和密码完成注册。&lt;/li&gt;&#10;&lt;li&gt;登录系统：注册成功后，Konga会自动跳转到登录页面，使用刚才注册的账号密码登录即可&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="二-连接konga与kong网关"&gt;二、 连接Konga与Kong网关&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;进入连接设置：登录成功后，你应该会看到&amp;quot;CONNECTIONS&amp;quot;或&amp;quot;Connections&amp;quot;界面。如果没有，请在左侧菜单或顶部导航栏中找到并点击 &amp;ldquo;Connections&amp;rdquo;。&lt;/li&gt;&#10;&lt;li&gt;填写Kong Admin API信息：&#10;&lt;ul&gt;&#10;&lt;li&gt;Connection name：为你这个Kong连接起个名字，比如&amp;quot;My-Kong&amp;quot;或&amp;quot;Production&amp;quot;。&lt;/li&gt;&#10;&lt;li&gt;Kong Admin URL：这是你Kong网关的Admin API地址。非常重要！ 格式通常是 http://&lt;kong-admin-ip&gt;:8001&lt;/li&gt;&#10;&lt;li&gt;如果你的Kong容器和Konga容器在同一个Docker网络（如 kong-net）中，你可以使用Kong的容器名和内部端口，例如：http://kong:8001。&lt;/li&gt;&#10;&lt;li&gt;如果你希望通过宿主机IP访问，可能需要使用宿主机的IP和映射给Kong Admin API的端口（例如 http://localhost:8001 或 http://&amp;lt;宿主机IP&amp;gt;:8001）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;激活连接：信息填写完毕后，点击 &amp;ldquo;Active&amp;rdquo; 或 &amp;ldquo;Connect&amp;rdquo; 等按钮来激活并测试连接。如果一切正常，Konga会提示连接成功。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="三-konga核心功能与使用介绍"&gt;三、 Konga核心功能与使用介绍&lt;/h2&gt;&#10;&lt;p&gt;连接成功后，你就可以使用Konga来管理Kong了。Konga的核心功能围绕以下几个概念展开，理解它们之间的关系很重要：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;概念 (Concept)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;作用 (Role)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;类比 (Analogy)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;配置要点 (Key Configuration)&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Upstream&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;负载均衡组：代表一个虚拟主机名，用于对后端多个Target进行负载均衡。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;球队的名称&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Name：为Upstream命名（如 my-api-upstream）。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;具体目标：代表一个物理服务（IP+Port），是Upstream组内的一个具体后端实例。必须先创建Upstream，才能添加Target。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;球队里的一个球员&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Target：后端服务的IP或主机名及端口（如 192.168.1.100:8080）。Weight：权重，流量分配比例。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;服务抽象：是上游服务的抽象，可以直接指向一个具体的URL，也可以关联一个Upstream来实现负载均衡。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;比赛的战术安排&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Name：服务名称。Protocol：协议（HTTP/HTTPS）。Host：可填写具体URL或关联的Upstream名称。Port：端口。Path：路径（可选）。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Route&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;路由规则：定义客户端请求的匹配规则（如路径、域名），将匹配的请求路由到指定的Service。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;根据球衣颜色决定把球传给谁&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Paths：匹配的请求路径（如 /api）。Hosts：匹配的域名（可选）。Service：选择该路由要关联的Service。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="四-创建服务-services-和路由-routes"&gt;四、 创建服务 (Services) 和路由 (Routes)&lt;/h2&gt;&#10;&lt;p&gt;这是最常用的功能，用于将外部请求转发到你的后端服务。&lt;/p&gt;</description></item><item><title>Consul注册中心</title><link>https://www.leanku.com/post/microservice/consul%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/</link><pubDate>Thu, 01 Jun 2023 11:46:01 +0800</pubDate><guid>https://www.leanku.com/post/microservice/consul%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/</guid><description>&lt;h1 id="consul注册中心"&gt;Consul注册中心&lt;/h1&gt;&#10;&lt;h2 id="cap原理"&gt;CAP原理&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一致性（Consistency） 所有节点在同一时间具有相同的数据&lt;/li&gt;&#10;&lt;li&gt;可用性（Availablility） 保证每个请求不管或者失败都有响应&lt;/li&gt;&#10;&lt;li&gt;分区容错（Partition tolerance） 系统中任意数据的丢失或失败不会影响系统的继续运作&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="consul-介绍"&gt;Consul 介绍&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;方便部署&lt;/li&gt;&#10;&lt;li&gt;采用Raft算法实现，有服务发现，key/value存储，可以做配置中心使用。有健康检查，同事提供了web管理页面&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="consul角色"&gt;Consul角色&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;-dev 开发环境下的启动命令，提供基本的服务&lt;/li&gt;&#10;&lt;li&gt;-client 客户端，无状态的，将http和dns请求转发到服务端集群&lt;/li&gt;&#10;&lt;li&gt;-server 服务端，保存配置信息，可以搭建高可用的集群&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="consul-内部端口"&gt;Consul 内部端口&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;端口&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TCP/8300&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8300端口用于服务器节点。客户端通过该端口RPC协议调用服务端接口。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TCP/UDP/8301&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8301端口用于单个数据中心所有节点之间的相互通信，即对LAN池信息的同步。它使得整个数据中心能够自动发现服务器地址，分布式检测节点故障，事件广播&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TCP/UDP/8302&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8302端口用于单个或多个数据中心之间的服务器节点的信息同步。即对WAN池信息的同步。它针对互联网的高延迟进行了优化，能够实现跨数据中心请求。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8500&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8500端口基于HTTP协议，用于API接口或WEB UI访问。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8600&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8600端口作为DNS服务器，它使得我们可以通过节点名查询节点的信息。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="consul-工作原理"&gt;Consul 工作原理&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="http://resources.leanku.com/consul.png" alt="consul工作原理"&gt;&lt;/p&gt;&#10;&lt;h2 id="consul-安装"&gt;Consul 安装&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://developer.hashicorp.com/consul/install"&gt;下载地址&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;或者docker安装&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker run -d --name&lt;span class="o"&gt;=&lt;/span&gt;consul -p 8500:8500 consul:1.15.4 agent -dev -client 0.0.0.0 -ui&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完成后，命令行输入consul 检查 consul 是否可用&lt;/p&gt;&#10;&lt;p&gt;Consul支持web ui界面。UI可用于查看所有服务和节点，查看所有运行状况检查及其当前状态，以及读取和设置键/值数据。 用户界面自动支持多数据中心。要设置自带的UI，请使用-ui参数启动Consul代理：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;consul agent -ui&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;UI可以在与HTTP API相同的端口上的/ui路径中使用。 默认情况下，这是http://localhost:8500/ui。&lt;/p&gt;&#10;&lt;h2 id="注册个服务"&gt;注册个服务&lt;/h2&gt;&#10;&lt;p&gt;使用HTTP API 注册个服务，使用[接口API](&lt;a href="https://www.consul.io/api/agent/service.html"&gt;https://www.consul.io/api/agent/service.html&lt;/a&gt; API)调用&lt;/p&gt;</description></item></channel></rss>