<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Istio on 小盒子的技术分享</title><link>https://xiaobox.github.io/tags/istio/</link><description>Recent content in Istio on 小盒子的技术分享</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 04 Mar 2026 08:41:32 +0000</lastBuildDate><atom:link href="https://xiaobox.github.io/tags/istio/index.xml" rel="self" type="application/rss+xml"/><item><title>拒绝内卷！为什么我们应该抵制用 LeetCode 考查真实的工程师？</title><link>https://xiaobox.github.io/p/2026-03-04-ju-jue-nei-juan-wei-shen-me-wo-men-ying-gai-di-zhi-yong-leet/</link><pubDate>Wed, 04 Mar 2026 08:41:32 +0000</pubDate><guid>https://xiaobox.github.io/p/2026-03-04-ju-jue-nei-juan-wei-shen-me-wo-men-ying-gai-di-zhi-yong-leet/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2026-03-04-ju-jue-nei-juan-wei-shen-me-wo-men-ying-gai-di-zhi-yong-leet/cover.jpg" alt="Featured image of post 拒绝内卷！为什么我们应该抵制用 LeetCode 考查真实的工程师？" /&gt;&lt;h1 id="拒绝内卷为什么我们应该抵制用-leetcode-考查真实的工程师"&gt;&lt;a href="#%e6%8b%92%e7%bb%9d%e5%86%85%e5%8d%b7%e4%b8%ba%e4%bb%80%e4%b9%88%e6%88%91%e4%bb%ac%e5%ba%94%e8%af%a5%e6%8a%b5%e5%88%b6%e7%94%a8-leetcode-%e8%80%83%e6%9f%a5%e7%9c%9f%e5%ae%9e%e7%9a%84%e5%b7%a5%e7%a8%8b%e5%b8%88" class="header-anchor"&gt;&lt;/a&gt;拒绝内卷！为什么我们应该抵制用 LeetCode 考查真实的工程师？
&lt;/h1&gt;&lt;p&gt;如果你要招募一位主刀医生，你会让他当场默写《人体解剖学》的第一章吗？如果你要找一位米其林大厨，你会蒙住他的眼睛，让他比赛在一分钟内切出多少根标准厚度的土豆丝吗？&lt;/p&gt;
&lt;p&gt;显然不会。但在如今的软件工程招聘中，我们却在做着同样荒谬的事情：让那些在复杂的业务泥潭中摸爬滚打、主导过千万级并发系统、熟练操纵复杂云原生架构的资深工程师，站在白板前，徒手写出一个“翻转二叉树”或者“接雨水”的最佳时间复杂度解法。&lt;/p&gt;
&lt;p&gt;不知从何时起，“刷 LeetCode”已经从一种思维训练，演变成了一场病态的军备竞赛。是时候戳破这个泡沫了：&lt;strong&gt;LeetCode 根本选拔不出优秀的软件工程师，它正在毁掉我们的行业生态。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="一-真实的工程世界从来不是一道闭卷考试"&gt;&lt;a href="#%e4%b8%80-%e7%9c%9f%e5%ae%9e%e7%9a%84%e5%b7%a5%e7%a8%8b%e4%b8%96%e7%95%8c%e4%bb%8e%e6%9d%a5%e4%b8%8d%e6%98%af%e4%b8%80%e9%81%93%e9%97%ad%e5%8d%b7%e8%80%83%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;一、 真实的工程世界，从来不是一道“闭卷考试”
&lt;/h3&gt;&lt;p&gt;让我们先来看看，一个现代软件工程师的真实一天是怎样度过的。&lt;/p&gt;
&lt;p&gt;你可能会花一整个上午，在一堆没有注释的“屎山”代码中追踪一个诡异的内存泄漏问题；你可能会在下午和产品经理反复拉扯，确定一个新功能在微服务架构下的 API 边界；你可能会在排查为什么 Kubernetes 集群里的 HPA（水平Pod自动扩缩容）没有按预期触发，或者研究 Istio 网关的流量路由策略。&lt;/p&gt;
&lt;p&gt;如果你身处最前沿的 AI 领域，你可能正在评估是用 LangGraph 还是 AutoGen 来构建多 Agent 协同流，或者在调试大模型 API 的 Top-p 采样参数，试图让生成的回答既准确又具有随机性。甚至，在业余时间，你可能在设计一款解决自己痛点的小工具——比如一个用来清理、分类和管理繁杂书签的浏览器插件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这些工作有一个共同点：它们都是极其复杂的、高度依赖上下文的、开放性的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而在真实的工作环境中，我们解决这些问题依靠的是什么？&lt;/p&gt;
&lt;p&gt;1.&lt;strong&gt;查阅文档与搜索能力：&lt;/strong&gt; 我们有 Google、有官方文档、有开源社区，甚至现在还有 AI 助手。&lt;/p&gt;
&lt;p&gt;2.&lt;strong&gt;调试与试错能力：&lt;/strong&gt; 我们通过打日志、单步调试、看监控指标来定位问题。&lt;/p&gt;
&lt;p&gt;3.&lt;strong&gt;架构视野与经验直觉：&lt;/strong&gt; 我们知道什么时候该用单例模式，什么时候该用工厂方法；我们知道在高并发下如何设计缓存策略，如何保证数据一致性。&lt;/p&gt;
&lt;p&gt;4.&lt;strong&gt;沟通与协作：&lt;/strong&gt; 我们需要阅读别人的代码，也需要让别人看懂我们的设计。&lt;/p&gt;
&lt;p&gt;反观 LeetCode 面试，它创造了一个极其不真实的&lt;strong&gt;无菌实验室环境&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;●题目边界清晰，输入输出明确。&lt;/p&gt;
&lt;p&gt;●只有单一的“最优解”（通常是时间复杂度和空间复杂度的极限）。&lt;/p&gt;
&lt;p&gt;●不允许查阅文档，甚至不允许使用趁手的 IDE（有时只能在网页的纯文本框里写代码）。&lt;/p&gt;
&lt;p&gt;●偏离日常使用的技术栈（你可能用 Python 写了十几年业务，却要用 C++ 的思维去考虑指针和内存管理）。&lt;/p&gt;
&lt;p&gt;这就像是要求一个现代战争中的王牌飞行员，在面试时去比拼谁的射箭准头更好。它考察的不是“解决问题的能力”，而是“在极其受限条件下的默写能力”。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="二-刷题面试正在惩罚真正有经验的老兵"&gt;&lt;a href="#%e4%ba%8c-%e5%88%b7%e9%a2%98%e9%9d%a2%e8%af%95%e6%ad%a3%e5%9c%a8%e6%83%a9%e7%bd%9a%e7%9c%9f%e6%ad%a3%e6%9c%89%e7%bb%8f%e9%aa%8c%e7%9a%84%e8%80%81%e5%85%b5" class="header-anchor"&gt;&lt;/a&gt;二、 刷题面试，正在惩罚真正有经验的“老兵”
&lt;/h3&gt;&lt;p&gt;在软件开发领域，经验是一笔巨大的财富。一个拥有 10 年、15 年工作经验的研发架构师，他最大的价值并不在于写代码的速度有多快，而在于他&lt;strong&gt;踩过足够多的坑&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;资深工程师知道，一个系统最大的危机往往不是算法复杂度从 变成了 （很多时候硬件资源和缓存机制完全能弥补），而是：&lt;/p&gt;
&lt;p&gt;●数据库连接池配置不当导致的雪崩。&lt;/p&gt;
&lt;p&gt;●缺乏熔断降级机制导致的服务级联故障。&lt;/p&gt;
&lt;p&gt;●领域模型设计错误导致的后续需求无法扩展。&lt;/p&gt;
&lt;p&gt;●业务逻辑耦合过深导致的测试困难。&lt;/p&gt;
&lt;p&gt;然而，当这位资深架构师带着一身的实战本领走进面试房间时，等待他的却是一道“动态规划（DP）”的 Hard 题。&lt;/p&gt;
&lt;p&gt;这是一种极大的资源浪费。一个能在生产环境中稳稳掌控全局、能设计出高可用 AI 基础设施、能带领团队攻坚克难的资深人才，仅仅因为最近几个月忙于项目交付、或者忙于应对生活中的变故（比如寻找新机会、照顾家庭），没有抽出几百个小时去死记硬背算法题库，就被无情地贴上“技术不过关”的标签淘汰出局。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这种现象导致了一个极其荒谬的倒挂：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那些刚刚毕业、没有写过一行生产环境代码、不懂得什么是持续集成、不知道如何进行线上排障的学生，只要花三个月把 LeetCode 刷个滚瓜烂熟，就能在面试中大杀四方；而那些真正在一线扛过枪、打过仗，能够解决复杂工程灾难的老兵，却在白板前因为忘记了一个状态转移方程而涨红了脸。&lt;/p&gt;
&lt;p&gt;企业以为自己招到了“绝顶聪明”的天才，结果新人一入职，面对极其复杂的微服务依赖和一团乱麻的业务逻辑，立刻束手无策。因为真实的业务系统里，没有人会为你准备好整洁的 &lt;code&gt;ListNode&lt;/code&gt; 或者 &lt;code&gt;TreeNode&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="三-算法题面试的本质一场低效的智商服从性测试"&gt;&lt;a href="#%e4%b8%89-%e7%ae%97%e6%b3%95%e9%a2%98%e9%9d%a2%e8%af%95%e7%9a%84%e6%9c%ac%e8%b4%a8%e4%b8%80%e5%9c%ba%e4%bd%8e%e6%95%88%e7%9a%84%e6%99%ba%e5%95%86%e6%9c%8d%e4%bb%8e%e6%80%a7%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;三、 算法题面试的本质：一场低效的“智商服从性测试”
&lt;/h3&gt;&lt;p&gt;为什么即便怨声载道，这么多公司依然痴迷于 LeetCode 面试？很多面试官会辩解说：“算法题能考察候选人的聪明程度和逻辑思维。”&lt;/p&gt;
&lt;p&gt;这其实是一个伪命题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 算法题早就不测智商了，它只测“准备度”。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在互联网早期，用算法题面试确实能筛选出一些思维敏捷的人，因为那时没有题库。但现在，LeetCode 已经有上千道题，“面经”满天飞。面试不仅变成了开卷考试的闭卷化，更变成了一门应试产业。能解出 Hard 题，往往不意味着你绝顶聪明，只意味着你刷到过原题，或者你花了大把时间去背诵套路。这充其量是一场“服从性测试”——看候选人愿不愿意为了这份工作去吃毫无意义的苦。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 忽视了工程中最关键的“可维护性”。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 LeetCode 的评价体系里，“代码跑得快”是唯一的真理。哪怕你的代码里全是 &lt;code&gt;i&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;, &lt;code&gt;dp&lt;/code&gt;, &lt;code&gt;res&lt;/code&gt; 这种毫无语义的变量名，哪怕你的逻辑晦涩难懂如天书，只要能 AC（Accepted），你就是赢家。&lt;/p&gt;
&lt;p&gt;但在实际工程中，这种代码是灾难。好的工程师写出的代码是给人看的，其次才是给机器执行的。如果你的代码在生产环境中出了 Bug，同事半夜被叫醒排查，看到满屏追求极致技巧却毫无注释的“炫技代码”，他大概率会在心里把你骂上一万遍。LeetCode 培养出的“做题家”思维，与团队协作所需的工程素养往往是背道而驰的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 面试官的“安全牌”与偷懒。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实，很多面试官也根本不知道该怎么面试。对他们来说，从题库里随机抽一道题扔给候选人，是最省事、最没有风险的做法。如果你没写出来，那是你不行，面试官不需要承担招错人的责任。这种做法掩盖了面试官自身架构视野和识人能力的匮乏。要深入了解一个人的项目经验、技术深度和系统设计能力，需要面试官投入极大的精力和极高的技术水平去进行深度的技术探讨，而“考一道题”则轻易地把压力全抛给了候选人。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="四-如何打破僵局回归工程本质的面试方法"&gt;&lt;a href="#%e5%9b%9b-%e5%a6%82%e4%bd%95%e6%89%93%e7%a0%b4%e5%83%b5%e5%b1%80%e5%9b%9e%e5%bd%92%e5%b7%a5%e7%a8%8b%e6%9c%ac%e8%b4%a8%e7%9a%84%e9%9d%a2%e8%af%95%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;四、 如何打破僵局：回归工程本质的面试方法
&lt;/h3&gt;&lt;p&gt;批判之后，我们需要建设。如果不考 LeetCode，我们该怎么筛选优秀的软件工程师？真正的面试，应该是一场对日常工作的高度模拟。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 结对编程 (Pair Programming)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要让候选人在白板上写代码，给他一台配置好 IDE 的电脑。面试官准备一个真实但简化过的业务小项目，或者直接在公司的一个开源代码分支上，两人结对协作。&lt;/p&gt;
&lt;p&gt;●“我们现在有一个 Python 的服务端，用 FastAPI 写的，现在需要增加一个中间件来做简单的限流，你打算怎么做？”&lt;/p&gt;
&lt;p&gt;●允许候选人查阅文档，允许使用 Google。&lt;/p&gt;
&lt;p&gt;●观察他的编码习惯、他对框架的熟悉程度、他如何拆解问题，以及更重要的——他如何与你沟通和协作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 代码审查 (Code Review)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给候选人一段存在各种“坑”的代码（可以是以前团队写出的真实烂代码，隐去敏感信息）。这段代码可能存在并发竞争、内存泄漏、或者设计模式的滥用。&lt;/p&gt;
&lt;p&gt;让候选人进行 Code Review。优秀的工程师能立刻嗅出代码中的“坏味道”，并提出合理的重构建议。这比让他默写快速排序要有效得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 深度系统设计与项目复盘&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;抛弃那些假大空的“如何设计一个推特”的八股文。让候选人深度讲解他简历中最自豪的一个项目。&lt;/p&gt;
&lt;p&gt;●“你在简历中提到主导了容器化改造，能画一下当时的 Kubernetes 架构图吗？”&lt;/p&gt;
&lt;p&gt;●“在使用 Ingress 和服务网格（比如 APISIX 或 Istio）时，你们遇到了什么性能瓶颈？是如何排查的？”&lt;/p&gt;
&lt;p&gt;●“你提到在做 AI 相关的研发，在整合底层大模型接口时，你们是如何处理长上下文带来的延迟问题和 token 消耗的？”&lt;/p&gt;
&lt;p&gt;通过深度的追问，直到触及他的知识边界。真正的行家，在谈论自己亲手一砖一瓦建起来的系统时，眼里是有光的，细节是经得起推敲的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 聊聊他创造的“小玩意儿”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个真正的工程师，往往是对技术充满热情的创造者。与其问算法，不如问问他平时都在折腾什么。如果他告诉你，他因为受不了浏览器书签太乱，正在自己设计开发一个管理书签的插件；或者他为了解某种新技术栈，自己搭了一个爬虫和数据展示网站。请让他展示一下！这种对痛点的敏锐察觉和动手解决问题的能力，是任何算法题都无法衡量出的核心特质。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="五-结语放过工程师也放过企业自己"&gt;&lt;a href="#%e4%ba%94-%e7%bb%93%e8%af%ad%e6%94%be%e8%bf%87%e5%b7%a5%e7%a8%8b%e5%b8%88%e4%b9%9f%e6%94%be%e8%bf%87%e4%bc%81%e4%b8%9a%e8%87%aa%e5%b7%b1" class="header-anchor"&gt;&lt;/a&gt;五、 结语：放过工程师，也放过企业自己
&lt;/h3&gt;&lt;p&gt;技术招聘走到今天“无算法不面试”的地步，是整个行业的悲哀。它消耗了工程师们原本可以用来学习新框架、钻研底层原理、甚至陪伴家人的宝贵精力；它也让企业错失了大量踏实肯干、经验丰富的实战派人才。&lt;/p&gt;
&lt;p&gt;编程，是一门结合了逻辑、工程、设计甚至艺术的创造性活动。它不该被简化为一场机械的背诵比赛。&lt;/p&gt;
&lt;p&gt;作为面试官，下次当你准备掏出一道 LeetCode Hard 题时，不妨停下来问问自己：“这道题，真的能帮我找到那个能和我并肩作战、一起扛住双十一流量洪峰、一起在深夜排查诡异 Bug 的可靠队友吗？”&lt;/p&gt;
&lt;p&gt;如果不能，请放下那道该死的算法题，和候选人像真正的工程师一样，聊聊真实的架构，看看真实的代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;把时间还给工程，把尊严还给工程师。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>2025北京 IT技术岗位市场趋势分析</title><link>https://xiaobox.github.io/p/2025-04-17-2025-bei-jing-it-ji-shu-gang-wei-shi-chang-qu-shi-fen-xi/</link><pubDate>Thu, 17 Apr 2025 02:20:56 +0000</pubDate><guid>https://xiaobox.github.io/p/2025-04-17-2025-bei-jing-it-ji-shu-gang-wei-shi-chang-qu-shi-fen-xi/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-04-17-2025-bei-jing-it-ji-shu-gang-wei-shi-chang-qu-shi-fen-xi/cover.jpg" alt="Featured image of post 2025北京 IT技术岗位市场趋势分析" /&gt;&lt;p&gt;过去一年，北京数字经济对 GDP 的贡献继续攀升、AI + 传统产业融合提速，拉动技术岗位需求在 2025 年保持“量稳、质升”——总招聘量与 2024 年大体持平，但 &lt;strong&gt;高端与 AI‑相关职能增幅 15% 以上&lt;/strong&gt;；与此同时，普通开发与测试岗位竞争加剧、薪酬增速放缓。整体呈现“尖端紧缺‑常规内卷”的双轨格局。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-04-17-2025-bei-jing-it-ji-shu-gang-wei-shi-chang-qu-shi-fen-xi/001-91b70463.png"&gt;&lt;/p&gt;
&lt;p&gt;下面按岗位类型分述趋势、薪酬区间与热门技能。&lt;/p&gt;
&lt;h2 id="宏观驱动与整体需求"&gt;&lt;a href="#%e5%ae%8f%e8%a7%82%e9%a9%b1%e5%8a%a8%e4%b8%8e%e6%95%b4%e4%bd%93%e9%9c%80%e6%b1%82" class="header-anchor"&gt;&lt;/a&gt;宏观驱动与整体需求
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;北京仍是全国数字经济第一城，数字产业增加值年均增速 9%，5G、人工智能、信创（国产软硬件）成为新增岗位主引擎&lt;/li&gt;
&lt;li&gt;2025 Hays 人才趋势显示，&lt;strong&gt;生成式 AI 项目扩张&lt;/strong&gt;、&lt;strong&gt;混合办公&lt;/strong&gt;、&lt;strong&gt;用工灵活化&lt;/strong&gt; 是企业技术团队的三大关键词。&lt;/li&gt;
&lt;li&gt;拉勾《一线城市数字科技人才迁徙洞察》指出，北京对高端技术人才的 &lt;strong&gt;净流入率 17.8%&lt;/strong&gt; ，居四大一线城市之首，但应届生流入比例下降 4 pct，反映供给结构趋紧。&lt;/li&gt;
&lt;li&gt;信息技术业 2024Q2‑2025Q1 招聘量同比下滑 27.8%，但算法、运维支持、产品管理等职能逆势增长。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-04-17-2025-bei-jing-it-ji-shu-gang-wei-shi-chang-qu-shi-fen-xi/002-dd656b09.png"&gt;&lt;/p&gt;
&lt;h2 id="细分岗位趋势"&gt;&lt;a href="#%e7%bb%86%e5%88%86%e5%b2%97%e4%bd%8d%e8%b6%8b%e5%8a%bf" class="header-anchor"&gt;&lt;/a&gt;细分岗位趋势
&lt;/h2&gt;&lt;h3 id="前端开发"&gt;&lt;a href="#%e5%89%8d%e7%ab%af%e5%bc%80%e5%8f%91" class="header-anchor"&gt;&lt;/a&gt;前端开发
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;重点趋势&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;框架&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;React18、Vue3 + TypeScript 成主流；大厂面试开始考察 RSC、微前端落地经验。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;多端融合&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ByteDance、京东等推行 Modular/Universal mode，将 H5 + 小程序 + 桌面统一到一套代码。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;AI‑Assist&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;高频使用 GitHub Copilot、ByteDance CodeGeeX 等 AI 辅助，企业更看重 Prompt‑Engineering 基础。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;平均月薪区间 2 – 3.5 万元；头部公司核心前端 &amp;gt; 4.5 万元。&lt;/p&gt;
&lt;h3 id="后端全栈开发"&gt;&lt;a href="#%e5%90%8e%e7%ab%af%e5%85%a8%e6%a0%88%e5%bc%80%e5%8f%91" class="header-anchor"&gt;&lt;/a&gt;后端／全栈开发
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go + Rust&lt;/strong&gt; 在高并发与可信场景快速渗透，Java 依旧占 48% 招聘量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud‑Native&lt;/strong&gt;：K8s、Service Mesh、Sidecar 架构写入 JD；Serverless FaaS 试点项目增多。&lt;/li&gt;
&lt;li&gt;薪酬与前端近似，但 3–6 年经验段的涨幅（+6.8% YoY）高于前端。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="运维--sre"&gt;&lt;a href="#%e8%bf%90%e7%bb%b4--sre" class="header-anchor"&gt;&lt;/a&gt;运维 / SRE
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动化 &amp;amp; AIOps&lt;/strong&gt;：日志可观测、LLM‑based Root Cause Analysis 成新卖点。&lt;/li&gt;
&lt;li&gt;大厂 DevOps‑SRE 岗位给出 &lt;strong&gt;15k–50k/月&lt;/strong&gt;，中位值 34k，高于全国均值 21k&lt;/li&gt;
&lt;li&gt;需求集中在云平台运维、容器治理、CI /CD 流水线二次开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="测试--qa"&gt;&lt;a href="#%e6%b5%8b%e8%af%95--qa" class="header-anchor"&gt;&lt;/a&gt;测试 / QA
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shift‑Left&lt;/strong&gt;：招聘 JD 要求能写 E2E、契合 DevSecOps；懂 API/性能/安全一体的 Full‑Stack QA 稀缺。&lt;/li&gt;
&lt;li&gt;普通功能测试招聘量降 12%，月薪中位值 &lt;strong&gt;14k&lt;/strong&gt;；自动化 / 安全测试可达 2 – 2.5 万元。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="架构--ai-大模型"&gt;&lt;a href="#%e6%9e%b6%e6%9e%84--ai-%e5%a4%a7%e6%a8%a1%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;架构 / AI 大模型
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大模型平台化&lt;/strong&gt;：企业亟需能打通推理服务、RAG、知识治理的“业务 + 算法 + 云”复合型架构师。&lt;/li&gt;
&lt;li&gt;北京人社局薪酬季报：AI 大模型架构师、深度学习研究员一季度月薪中位值 &lt;strong&gt;&amp;gt; 4 万元&lt;/strong&gt;，位列所有 IT 职位之首。&lt;/li&gt;
&lt;li&gt;供应缺口：相关岗位投递比仅 1 : 7，而常规开发已超过 1 : 40。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="薪酬对比中位值税前--月"&gt;&lt;a href="#%e8%96%aa%e9%85%ac%e5%af%b9%e6%af%94%e4%b8%ad%e4%bd%8d%e5%80%bc%e7%a8%8e%e5%89%8d--%e6%9c%88" class="header-anchor"&gt;&lt;/a&gt;薪酬对比（中位值，税前 / 月）
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;职能&lt;/th&gt;
 &lt;th&gt;初级 (0‑3 年)&lt;/th&gt;
 &lt;th&gt;中级 (3‑6 年)&lt;/th&gt;
 &lt;th&gt;高级 / 专家&lt;/th&gt;
 &lt;th&gt;YoY 涨幅&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;前端&lt;/td&gt;
 &lt;td&gt;14 k&lt;/td&gt;
 &lt;td&gt;23 k&lt;/td&gt;
 &lt;td&gt;32 k+&lt;/td&gt;
 &lt;td&gt;+3.5 %&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;后端&lt;/td&gt;
 &lt;td&gt;15 k&lt;/td&gt;
 &lt;td&gt;25 k&lt;/td&gt;
 &lt;td&gt;35 k+&lt;/td&gt;
 &lt;td&gt;+6.8 %&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;运维 / SRE&lt;/td&gt;
 &lt;td&gt;16 k&lt;/td&gt;
 &lt;td&gt;28 k&lt;/td&gt;
 &lt;td&gt;40 k+&lt;/td&gt;
 &lt;td&gt;+5.9 %&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;测试&lt;/td&gt;
 &lt;td&gt;12 k&lt;/td&gt;
 &lt;td&gt;18 k&lt;/td&gt;
 &lt;td&gt;25 k&lt;/td&gt;
 &lt;td&gt;+2.1 %&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;架构 / AI&lt;/td&gt;
 &lt;td&gt;25 k&lt;/td&gt;
 &lt;td&gt;38 k&lt;/td&gt;
 &lt;td&gt;45‑60 k&lt;/td&gt;
 &lt;td&gt;+11.4 %&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;（数据综合北京 HR 局薪酬季报、Indeed、Jobui 与 iHR360 行业库）&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-04-17-2025-bei-jing-it-ji-shu-gang-wei-shi-chang-qu-shi-fen-xi/003-a40bfb60.png"&gt;&lt;/p&gt;
&lt;h2 id="-技能热点与企业偏好"&gt;&lt;a href="#-%e6%8a%80%e8%83%bd%e7%83%ad%e7%82%b9%e4%b8%8e%e4%bc%81%e4%b8%9a%e5%81%8f%e5%a5%bd" class="header-anchor"&gt;&lt;/a&gt;🔥 技能热点与企业偏好
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI 嵌入&lt;/strong&gt;：Prompt‑based 代码补全、Auto‑Test、知识库问答等场景让 Python / LLM SDK 成为附加加分项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全合规&lt;/strong&gt;：等保 2.0、个人信息保护法落地，带动安全测试、DevSecOps、零信任架构招聘量增 19% YoY&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信创&lt;/strong&gt;：国资系招募国产 CPU / OS 适配工程师，优惠补贴年包 +20%。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="供需与竞争"&gt;&lt;a href="#%e4%be%9b%e9%9c%80%e4%b8%8e%e7%ab%9e%e4%ba%89" class="header-anchor"&gt;&lt;/a&gt;供需与竞争
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;北京技术岗位投递量继续领跑一线城市；但 AI、大模型方向平均 &lt;strong&gt;每 1 份 JD 仅 7 份简历&lt;/strong&gt;，反之普通 Web 开发超过 40 份简历/岗，显现结构性紧缺。&lt;/li&gt;
&lt;li&gt;北京 2025Q1 IT 岗位平均薪资 2.9 万元，中位值 2.46 万元；同比涨幅 1.1%，明显低于 2021‑22 年两位数增速。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="给企业与求职者的建议"&gt;&lt;a href="#%e7%bb%99%e4%bc%81%e4%b8%9a%e4%b8%8e%e6%b1%82%e8%81%8c%e8%80%85%e7%9a%84%e5%bb%ba%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;给企业与求职者的建议
&lt;/h2&gt;&lt;h3 id="企业"&gt;&lt;a href="#%e4%bc%81%e4%b8%9a" class="header-anchor"&gt;&lt;/a&gt;企业
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;拆分 JD&lt;/strong&gt;：将“平台研发”与“AI 应用落地”拆分，便于精准匹配候选人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用薪酬+Tech Brand 双重激励&lt;/strong&gt;：高端人才更看重技术氛围与成长空间，可开放技术博客、OSS 贡献等展示窗口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;培养内部转岗&lt;/strong&gt;：参考 LinkedIn 数据，内部流动可将员工留存提升 40%&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="求职者"&gt;&lt;a href="#%e6%b1%82%e8%81%8c%e8%80%85" class="header-anchor"&gt;&lt;/a&gt;求职者
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;普通开发/测试应持续补齐 &lt;strong&gt;云原生 + 自动化测试 + 基础 AI&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;关注国央企“信创”“数据要素”等长期项目，以稳就业与培训机会为优势；&lt;/li&gt;
&lt;li&gt;AI &amp;amp; 架构方向建议组合 &lt;strong&gt;算法实践 + 高并发系统设计 + 行业领域知识&lt;/strong&gt;，扩大竞争壁垒。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;“&lt;/p&gt;
&lt;p&gt;北京 2025 年 IT 技术岗位的主旋律是 &lt;strong&gt;“AI 驱动的高端岗位紧缺，传统岗位理性回调”&lt;/strong&gt;。掌握新技能、拥抱跨领域融合将是穿越周期的关键。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>云原生，你真的懂了吗？</title><link>https://xiaobox.github.io/p/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/</link><pubDate>Sat, 22 Feb 2025 04:00:00 +0000</pubDate><guid>https://xiaobox.github.io/p/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/cover.jpg" alt="Featured image of post 云原生，你真的懂了吗？" /&gt;&lt;h2 id="啥是云"&gt;&lt;a href="#%e5%95%a5%e6%98%af%e4%ba%91" class="header-anchor"&gt;&lt;/a&gt;啥是云？
&lt;/h2&gt;&lt;p&gt;说起云原生（cloud native），就不得不说明一下 “云” 是啥。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/001-79f74f23.png"&gt;&lt;/p&gt;
&lt;p&gt;简单理解，云就是 “云计算”，如果给它下个定义的话是这样的：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;云&amp;quot; 特指以云计算模型构建的现代化动态环境&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;为什么叫 &lt;strong&gt;云&lt;/strong&gt; 呢？它怎么不叫其他的什么呢？&lt;/p&gt;
&lt;p&gt;这个吧，就像你问马云为什么叫马云一样，那是因为给他起名的家长就是这么定的。对，云计算也是如此，计算机领域的专家就是这么定的。后来成了专业术语，大家都这么说。那你说叫 “云” 有没有道理呢？ 有道理。&lt;/p&gt;
&lt;p&gt;我们类比地看，如果你将 “资源” 看成水的话，那么在天空上自由自在、飘来飘去的云就是资源的载体，在你有需要的时候，“呼风唤雨🌧️” ，一朵带着雨水（资源）的积雨云就能为你带来一场甘霖（你需要的资源）。&lt;/p&gt;
&lt;p&gt;云在天上，不在地下，不像以前（过去的架构），你想吃水了得自己挖井，现在你可以 “呼风唤雨” 叫云给你水。而且很好管理和维护。所以你看，用 “云” 这个字还是有道理的。&lt;/p&gt;
&lt;h3 id="云-可以有多种形态"&gt;&lt;a href="#%e4%ba%91-%e5%8f%af%e4%bb%a5%e6%9c%89%e5%a4%9a%e7%a7%8d%e5%bd%a2%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;“云” 可以有多种形态
&lt;/h3&gt;&lt;p&gt;云还有多种形态，一般来说有以下三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公有云（Public Cloud）： 由第三方云计算提供商（如 AWS、Azure、Google Cloud、阿里云、腾讯云等）拥有和运营，面向公众提供服务。&lt;/li&gt;
&lt;li&gt;私有云（Private Cloud）： 由企业或组织自己拥有和运营，仅供内部使用。私有云可以部署在企业自己的数据中心，也可以托管给第三方提供商。&lt;/li&gt;
&lt;li&gt;混合云（Hybrid Cloud）： 结合了公有云和私有云的优势，允许应用程序和数据在两者之间迁移和共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还是用吃水比喻，公有云就像 “自来水”，打开水管就能喝。私有云就像自己找水源，自己挖井，自己舀水喝。混合云自然就是这两种的混合。&lt;/p&gt;
&lt;h3 id="资源有啥"&gt;&lt;a href="#%e8%b5%84%e6%ba%90%e6%9c%89%e5%95%a5" class="header-anchor"&gt;&lt;/a&gt;资源有啥？
&lt;/h3&gt;&lt;p&gt;说完了云，我们该说水了，云是提供资源的，那么具体有哪些资源呢？什么东西是云可以提供给我们的呢？你可能想到了：“嗨，不就是服务器嘛”。&lt;/p&gt;
&lt;p&gt;其实 “资源” 是一个&lt;strong&gt;多维度&lt;/strong&gt;的概念，远不止硬件设备。我们展开说说。&lt;/p&gt;
&lt;p&gt;首先是：基础资源，它包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;计算资源（CPU/GPU/FPGA）&lt;/li&gt;
&lt;li&gt;存储资源（磁盘 / SSD / 对象存储）&lt;/li&gt;
&lt;li&gt;网络资源（带宽 / IP / 负载均衡）&lt;/li&gt;
&lt;li&gt;内存资源（RAM）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后是抽象服务，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;容器编排（Kubernetes（EKS/GKE/ACK）、Nomad）&lt;/li&gt;
&lt;li&gt;数据库服务（AWS RDS、阿里云 RDS）&lt;/li&gt;
&lt;li&gt;消息队列（Kafka 云托管、AWS SQS、RabbitMQ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接着是管理与安全，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;身份权限（AWS IAM、阿里云 RAM、Azure AD）&lt;/li&gt;
&lt;li&gt;监控告警（Prometheus 云托管、Datadog、阿里云 ARMS）&lt;/li&gt;
&lt;li&gt;日志分析（ELK Stack 云服务、Splunk）&lt;/li&gt;
&lt;li&gt;安全防御（阿里云 WAF）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后是高阶能力，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Serverless（AWS Lambda、阿里云 FC）&lt;/li&gt;
&lt;li&gt;服务网格（Istio、Linkerd）&lt;/li&gt;
&lt;li&gt;边缘计算（AWS Wavelength、阿里云 ENS）&lt;/li&gt;
&lt;li&gt;量子计算（AWS Braket、Azure Quantum）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我上面举的只是一些常见的例子，其实每一个分类下的资源条目是非常多的。所以你看，“资源” 可不止服务器那么简单，它是多维度的。现在几乎你能用的到的东西都上云了，都是资源。就算没有，经不住人家云厂商包装啊，只要你有需求，人家就有产品卖你，哈哈。&lt;/p&gt;
&lt;h2 id="云原生"&gt;&lt;a href="#%e4%ba%91%e5%8e%9f%e7%94%9f" class="header-anchor"&gt;&lt;/a&gt;云原生
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/002-7897a5f7.png"&gt;&lt;/p&gt;
&lt;p&gt;云其实还是比较好理解的，但是云原生（cloud native）就比较抽象了，在我刚接触这个概念的时候是一头雾水，无论别人给我讲，还是我给别人讲总是说不清楚，或者人家听不懂。&lt;/p&gt;
&lt;p&gt;我们还是先来说说定义吧，我找到 CNCF （https://github.com/cncf/toc/blob/main/DEFINITION.md）的一个定义，算比较权威了。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中，构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。&lt;/p&gt;
&lt;p&gt;这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段，云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Cloud native practices empower organizations to develop, build, and deploy workloads in computing environments (public, private, hybrid cloud) to meet their organizational needs at scale in a programmatic and repeatable manner. It is characterized by loosely coupled systems that interoperate in a manner that is secure, resilient, manageable, sustainable, and observable.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;说实话，如果你没有在这个领域干过，光看定义是不容易理解的。甚至就算在云原生环境下从事开发的工程师，如果不认真思考、理解，也不能把什么是“云原生” 讲的很明白。&lt;/p&gt;
&lt;p&gt;原因是这个概念本来就比较抽象。所以我不用 CNCF 的定义，换一种说法来描述一下什么是 “云原生”&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;云原生是一种以云计算基础设施为基石，通过容器化封装、微服务拆分、声明式 API 和自动化运维，将应用的非功能需求（如弹性扩缩、故障自愈、安全策略）交由云平台管理的架构范式。其本质是通过技术手段让业务代码与底层资源解耦，使开发者只需关注业务逻辑，而由云平台自动处理部署、监控、容灾等复杂性。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;你看，我这样说是不是清晰一些了？ 更好理解一些了？还没有？接着往下看。&lt;/p&gt;
&lt;h3 id="本质"&gt;&lt;a href="#%e6%9c%ac%e8%b4%a8" class="header-anchor"&gt;&lt;/a&gt;本质
&lt;/h3&gt;&lt;p&gt;透过现象看本质，概念怎么说都行，重要的是要理解这个东西的本质。&lt;/p&gt;
&lt;p&gt;那我们就来看一看 “云原生” 的本质 ：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;云原生并非单纯的技术集合，而是一种 “以应用为中心” 的思维模式。它通过标准化技术栈（容器 / K8s / 微服务），将云计算从 “资源层” 提升到 “应用层”，让企业能像使用水电一样按需使用计算能力。它的目标是让技术复杂性对业务透明化。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;说到这里，我们就不得不说一下为什么要使用或推崇“云原生”了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;云原生的出现源于传统应用架构在云计算时代的局限性。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;传统架构有许多痛点，做的传统开发的同学一定都知道，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;部署效率低：传统应用依赖物理服务器或虚拟机，部署流程复杂（如手动配置环境、依赖冲突）。&lt;/li&gt;
&lt;li&gt;扩展性差：单体架构难以应对流量突增，扩容需要数小时甚至数天。&lt;/li&gt;
&lt;li&gt;运维成本高：故障恢复、监控、日志收集等运维工作需人工干预。&lt;/li&gt;
&lt;li&gt;环境不一致：开发、测试、生产环境差异导致 “在我机器上能跑” 的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;采用 “云原生” 技术栈及应用架构可以有效的解决上面的所有问题。&lt;/p&gt;
&lt;h3 id="什么是不可替代的"&gt;&lt;a href="#%e4%bb%80%e4%b9%88%e6%98%af%e4%b8%8d%e5%8f%af%e6%9b%bf%e4%bb%a3%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;什么是不可替代的？
&lt;/h3&gt;&lt;p&gt;不得不说，Docker 和 Kubernetes 技术的出现给了 “云原生” 极大的助力。那如果没有 Docker 和 Kubernetes 呢？ 云原生这个概念还立得住吗？&lt;/p&gt;
&lt;p&gt;其实，云原生概念的出现（2010 年 Netflix 提出）比 Docker（2013）和 Kubernetes（2014）更早。核心思想在容器技术普及前就已萌芽。所以：&lt;strong&gt;云原生本质是一种架构哲学，而非特定技术捆绑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么我们紧接着下一个问题就是：什么是云原生的核心内容，有什么是缺一不可的呢？或者说缺了什么就不能算是云原生了呢？&lt;/p&gt;
&lt;p&gt;总结来说，有四大支柱：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;弹性伸缩（Elasticity）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;必须能力：根据负载自动扩缩资源&lt;/li&gt;
&lt;li&gt;替代方案：AWS Lambda（Serverless）、Nomad（非 K8s 编排器）&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;故障自愈（Resilience）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;必须能力：服务熔断、重试、健康检查&lt;/li&gt;
&lt;li&gt;替代方案：Hystrix（微服务容错库）+ Consul（服务发现）&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="5"&gt;
&lt;li&gt;声明式管理（Declarative）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;必须能力：通过 YAML/JSON 描述目标状态，而非手动操作&lt;/li&gt;
&lt;li&gt;替代方案：Terraform（基础设施即代码）+ Ansible（配置管理）&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="7"&gt;
&lt;li&gt;自动化交付（Automation）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;必须能力：CI/CD 流水线、蓝绿部署&lt;/li&gt;
&lt;li&gt;替代方案：GitLab CI + Spinnaker（持续交付平台）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="云原生的-复杂性悖论"&gt;&lt;a href="#%e4%ba%91%e5%8e%9f%e7%94%9f%e7%9a%84-%e5%a4%8d%e6%9d%82%e6%80%a7%e6%82%96%e8%ae%ba" class="header-anchor"&gt;&lt;/a&gt;云原生的 “复杂性悖论”
&lt;/h3&gt;&lt;p&gt;云原生看起来真好呀，但事实是这样吗？对于软件开发，我们都知道一句著名的话：“没有银弹”，是的。云原生也不是哪儿哪儿都好，它也有它的问题。&lt;/p&gt;
&lt;p&gt;云原生存在一个看似矛盾的现象：&lt;strong&gt;它承诺降低业务复杂性，却引入了新的技术复杂性。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这种矛盾的核心在于技术栈的 “分层复杂性转移”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统架构的复杂性集中在应用层（如单体重构困难、环境配置混乱）&lt;/li&gt;
&lt;li&gt;云原生的复杂性下沉到基础设施层（如 K8s 集群运维、Istio 配置）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对企业而言，这相当于用 “可控的工程复杂度” 替代 “不可控的业务阻塞风险”。但关键在于，这种转移是否真正带来净收益。&lt;/p&gt;
&lt;p&gt;说白了，你要会“算账”，在成本一定的情况下，要有所取舍，到底要不要上“云原生”，不是技术本身决定的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;云原生有它的显性与隐性成本&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技术债务：K8s 版本升级兼容性问题、Helm Chart 维护&lt;/li&gt;
&lt;li&gt;人力成本：需要 DevOps 工程师（平均薪资比开发高 30%+）&lt;/li&gt;
&lt;li&gt;认知负担：团队需掌握容器、服务网格、声明式 API 等新范式&lt;/li&gt;
&lt;li&gt;工具链成本 ：监控（Prometheus+AlertManager）、日志（EFK）、追踪（Jaeger）的集成和维护&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;有成本当然也有收益&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;部署效率：从手动部署 1 小时 → 全自动 CI/CD 5 分钟（效率提升 12 倍）&lt;/li&gt;
&lt;li&gt;资源利用率 ：虚拟机静态分配 → 容器动态调度（CPU 利用率从 15% 提升至 60%+）&lt;/li&gt;
&lt;li&gt;故障恢复速度：人工排查 1 小时 → 自动熔断 + 滚动更新（MTTR 从 60 分钟降至 5 分钟）&lt;/li&gt;
&lt;li&gt;业务敏捷性：新功能上线周期从 1 个月 → 1 周（迭代速度提升 4 倍）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，关键是要根据你的实际情况 “算账”，一般来说，当企业规模超过临界点（通常≥50 个微服务 / 日部署次数≥10 次），云原生的收益将显著超越成本。&lt;/p&gt;
&lt;h3 id="结论"&gt;&lt;a href="#%e7%bb%93%e8%ae%ba" class="header-anchor"&gt;&lt;/a&gt;结论
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/003-05d14457.png"&gt;&lt;/p&gt;
&lt;p&gt;所以说了半天云原生到底是什么？ 我不知道你明白了没有，我们上面林林总总写了那么多技术点，如果初次接触确实很头大。但这不重要。&lt;/p&gt;
&lt;p&gt;因为：&lt;strong&gt;云原生不是工具集，而是「工业化软件生产」的方法论升级&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用制造业的思维来理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统软件交付 ≈ 手工作坊（每个陶器需手工塑形、烧制）&lt;/li&gt;
&lt;li&gt;云原生交付 ≈ 汽车生产线（标准化零件 + 自动化流水线 + 质量检测体系）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你面试的时候，面试官让你谈谈对云原生的理解，我希望你能够把这篇文章的精华吸收了，从一个比较高的层次来谈，&lt;strong&gt;我不希望给你一个中规中矩的回答模板，虽然它是正确的&lt;/strong&gt;，比如以下这样：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;“云原生是云计算时代的一种架构范式，旨在通过标准化技术栈（如容器、K8s）和自动化运维体系，将非业务功能（如弹性扩缩、故障自愈）从应用代码中剥离，由云平台接管。其核心驱动力是解决传统单体应用部署慢、环境不一致、扩展难的问题。&lt;/p&gt;
&lt;p&gt;从技术分层看，云原生包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基础设施层：Docker 实现环境一致性，K8s 完成资源调度，比如我们通过 Deployment 的滚动更新实现零停机发布；&lt;/li&gt;
&lt;li&gt;应用架构层：微服务拆分业务能力，Istio 服务网格处理服务间通信的熔断、监控，例如在订单服务中配置超时自动重试；&lt;/li&gt;
&lt;li&gt;交付运维层：GitOps 工具链（如 Argo CD）确保声明式配置的版本可控，配合 Prometheus+Grafana 实现实时监控。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键设计原则包括不可变基础设施（容器镜像一次构建多次运行）、声明式 API（通过 YAML 描述目标状态而非手动操作）。但引入云原生也带来挑战，比如团队需要掌握复杂的 K8s 生态，我们通过建设内部开发者平台（IDP）封装底层细节，让开发者只需关注业务代码。”&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="云原生应用"&gt;&lt;a href="#%e4%ba%91%e5%8e%9f%e7%94%9f%e5%ba%94%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;云原生应用
&lt;/h2&gt;&lt;h3 id="什么样的应用是云原生的"&gt;&lt;a href="#%e4%bb%80%e4%b9%88%e6%a0%b7%e7%9a%84%e5%ba%94%e7%94%a8%e6%98%af%e4%ba%91%e5%8e%9f%e7%94%9f%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;什么样的应用是云原生的？
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2025-02-22-yun-yuan-sheng-ni-zhen-de-dong-le-ma/004-d345c5b7.png"&gt;&lt;/p&gt;
&lt;p&gt;一个应用是否云原生，而要看是否具备以下特征：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;容器化部署：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;应用打包为 Docker 镜像，在 Kubernetes 集群中运行。&lt;/li&gt;
&lt;li&gt;示例：电商大促时，通过 HPA（水平扩缩）自动增加订单处理服务的 Pod 数量。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;微服务架构：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;业务拆分为独立服务（如用户服务、支付服务），通过 API 通信。&lt;/li&gt;
&lt;li&gt;示例：视频网站将视频转码服务独立部署，利用 GPU 节点加速，不影响主站稳定性。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="5"&gt;
&lt;li&gt;DevOps 流水线：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;代码提交后自动触发 CI/CD，完成测试、镜像构建、灰度发布。&lt;/li&gt;
&lt;li&gt;示例：金融 App 通过蓝绿部署实现零停机更新，降低发布风险。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="7"&gt;
&lt;li&gt;依赖云原生中间件：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;使用云托管的数据库（如 AWS RDS）、消息队列（如 Kafka on K8s）、缓存（如 Redis Cluster）。&lt;/li&gt;
&lt;li&gt;示例：社交平台用云原生数据库 TiDB 处理海量关系数据，自动分片扩容。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="9"&gt;
&lt;li&gt;跨云与混合云兼容：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;应用设计不绑定特定云厂商，可在 AWS、Azure、私有云间迁移。&lt;/li&gt;
&lt;li&gt;示例：跨国企业采用 Anthos 实现跨公有云和本地数据中心的统一管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="最后"&gt;&lt;a href="#%e6%9c%80%e5%90%8e" class="header-anchor"&gt;&lt;/a&gt;最后
&lt;/h2&gt;&lt;p&gt;云原生不是终点，而是通往智能软件时代的必由之路。当我们将视角从工具本身移开，看到的是一场关于效率、可靠性与创新速度的认知革命。正如 Linux 之父 Linus Torvalds 所说：“技术终将老去，但优秀的架构思想永存。” 在这场变革中，比掌握某个工具更重要的，是建立持续进化的云原生思维体系。&lt;/p&gt;</description></item><item><title>灰度发布、蓝绿部署、金丝雀都是啥？</title><link>https://xiaobox.github.io/p/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/</link><pubDate>Tue, 19 Apr 2022 07:13:43 +0000</pubDate><guid>https://xiaobox.github.io/p/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/cover.jpg" alt="Featured image of post 灰度发布、蓝绿部署、金丝雀都是啥？" /&gt;&lt;h2 id="目录"&gt;&lt;a href="#%e7%9b%ae%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;目录
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;滚动部署&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;蓝绿发布&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为什么还需要蓝绿&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;金丝雀发布（canary）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;金丝雀和蓝绿的对比&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灰度发布&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A/B Test&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;实现&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kubernetes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;istio&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;spring cloud&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网关&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;参考&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="滚动部署"&gt;&lt;a href="#%e6%bb%9a%e5%8a%a8%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;滚动部署
&lt;/h2&gt;&lt;p&gt;在滚动部署中，应用的新版本逐步替换旧版本。实际的部署发生在一段时间内。在此期间，新旧版本会共存，而不会影响功能和用户体验。这个过程可以更轻易的回滚和旧组件不兼容的任何新组件。&lt;/p&gt;
&lt;p&gt;下图显示了该部署模式：旧版本显示为蓝色，新版本显示为绿色，它们部署在集群中的每一台服务器上。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/001-85683945.jpg"&gt;&lt;/p&gt;
&lt;p&gt;应用程序套件升级是一个滚动部署的典型例子。如果原始应用部署在容器中，升级可以一次处理一个容器。修改每个容器从应用供应商的站点上下载最新的镜像。如果其中的一个应用存在兼容性问题，旧的镜像可以重新创建这个容器。在这种情况下，套件的新旧版本应用可以共存，直到每个应用都更新完毕。&lt;/p&gt;
&lt;p&gt;但是滚动升级有一个问题，在开始滚动升级后，流量会直接流向已经启动起来的新版本，但是这个时候，新版本是不一定可用的，比如需要进一步的测试才能确认。那么在滚动升级期间，整个系统就处于非常不稳定的状态，如果发现了问题，也比较难以确定是新版本还是老版本造成的问题。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我们需要为滚动升级实现流量控制能力。&lt;/p&gt;
&lt;h2 id="蓝绿发布"&gt;&lt;a href="#%e8%93%9d%e7%bb%bf%e5%8f%91%e5%b8%83" class="header-anchor"&gt;&lt;/a&gt;蓝绿发布
&lt;/h2&gt;&lt;p&gt;蓝绿发布提供了一种零宕机的部署方式。不停老版本，部署新版本进行测试，确认OK，将流量切到新版本，然后老版本同时也升级到新版本。始终有两个版本同时在线，有问题可以快速切换。&lt;/p&gt;
&lt;p&gt;蓝绿发布的特点：&lt;/p&gt;
&lt;p&gt;在部署应用的过程中，应用始终在线。并且新版本上线过程中，不会修改老版本的任何内容，在部署期间老版本状态不受影响。只要老版本的资源不被删除，可以在任何时间回滚到老版本。&lt;/p&gt;
&lt;p&gt;以下示意图可描述灰度发布的大致流程：先切分20%的流量到新版本，若表现正常，逐步增加流量占比，继续测试新版本表现。若新版本一直很稳定，那么将所有流量都切分到新版本，并下线老版本。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/002-0db443da.gif"&gt;&lt;/p&gt;
&lt;p&gt;切分20%的流量到新版本后，新版本出现异常，则快速将流量切回老版本。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/003-f1176a45.gif"&gt;&lt;/p&gt;
&lt;p&gt;蓝绿部署要求在升级过程中，同时运行两套程序，对硬件的要求就是日常所需的二倍，比如日常运行时，需要10台服务器支撑业务，那么使用蓝绿部署，你就需要购置二十台服务器。&lt;/p&gt;
&lt;h3 id="为什么还需要蓝绿"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%98%e9%9c%80%e8%a6%81%e8%93%9d%e7%bb%bf" class="header-anchor"&gt;&lt;/a&gt;为什么还需要蓝绿
&lt;/h3&gt;&lt;p&gt;有了灰度发布之后，为什么还需要蓝绿发布呢？主要有如下几点考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;应用在生产环境全量发布后，发现故障时回滚时间慢。当线上核心应用存在几十上百的服务实例时，应用实例分批滚动回滚，部分业务应用启动时间需要几分钟，导致整个回滚过程的时间可能超过十分钟，甚至几十分钟。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灰度发布期间能发现的问题有限。如数据库慢查问题、死锁问题等，10%流量很难发现，可能只会在100%流量中才容易暴露。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灰度发布成功后，仍然需要进行全量发布，在此过程中仍有较多不确定性，如因一些未预料的异常导致发布失败等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于上面几个问题，使用蓝绿发布系统都可以较好地解决：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;蓝绿发布期间，流量全部切至新集群时，原稳定集群继续保持在线，若新集群有问题，可通过流量控制秒级切回至原稳定集群，没有应用启动以及其他等待时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;蓝绿发布期间，新集群规模与原稳定集群规模一致，即使是瞬时大流量也没有问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;蓝绿发布期间，新集群承载全站流量，容易验证各种场景，如数据库死锁等并发问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;蓝绿发布新集群验证完成后，已经处于正常服务状态，不会再引入不确定性的变更操作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="金丝雀发布canary"&gt;&lt;a href="#%e9%87%91%e4%b8%9d%e9%9b%80%e5%8f%91%e5%b8%83canary" class="header-anchor"&gt;&lt;/a&gt;金丝雀发布（canary）
&lt;/h2&gt;&lt;p&gt;在生产环境上引一部分实际流量对一个新版本进行测试，测试新版本的性能和表现，在保证系统整体稳定运行的前提下，尽早发现新版本在实际环境上的问题。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;“&lt;/p&gt;
&lt;p&gt;为什么叫金丝雀发布呢，是因为金丝雀对矿场中的毒气比较敏感，所以在矿场开工前工人们会放一只金丝雀进去，以验证矿场是否存在毒气，这便是金丝雀发布名称的由来。&lt;/p&gt;
&lt;p&gt;”&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;金丝雀发布的特点：&lt;/p&gt;
&lt;p&gt;通过在线上运行的服务中，新加入少量的新版本的服务，然后从这少量的新版本中快速获得反馈，根据反馈决定最后的交付形态。&lt;/p&gt;
&lt;p&gt;下图为华为云的金丝雀发布界面：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/004-30be6db0.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/005-6b2d2a4c.jpg"&gt;&lt;/p&gt;
&lt;p&gt;步骤一：将流量从待部署节点移出，更新该节点服务到待发布状态，将该节点称为金丝雀节点；&lt;/p&gt;
&lt;p&gt;步骤二：根据不同策略，将流量引入金丝雀节点。策略可以根据情况指定，比如随机样本策略（随机引入）、狗粮策略（就是内部用户或员工先尝鲜）、分区策略（不同区域用户使用不同版本）、用户特征策略（这种比较复杂，需要根据用户个人资料和特征进行分流，类似于千人千面）；&lt;/p&gt;
&lt;p&gt;步骤三：金丝雀节点验证通过后，选取更多的节点称为金丝雀节点，重复步骤一和步骤二，直到所有节点全部更新&lt;/p&gt;
&lt;p&gt;金丝雀部署和蓝绿有点像，但是它更加规避风险。你可以阶段性的进行，而不用一次性从蓝色版本切换到绿色版本。&lt;/p&gt;
&lt;p&gt;采用金丝雀部署，你可以在生产环境的基础设施中小范围的部署新的应用代码。一旦应用签署发布，只有少数用户被路由到它。最大限度的降低影响。如果没有错误发生，新版本可以逐渐推广到整个基础设施。下图示范了金丝雀部署：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/006-dc42df37.jpg"&gt;&lt;/p&gt;
&lt;h3 id="金丝雀和蓝绿的对比"&gt;&lt;a href="#%e9%87%91%e4%b8%9d%e9%9b%80%e5%92%8c%e8%93%9d%e7%bb%bf%e7%9a%84%e5%af%b9%e6%af%94" class="header-anchor"&gt;&lt;/a&gt;金丝雀和蓝绿的对比
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;名称&lt;/th&gt;
 &lt;th&gt;特点&lt;/th&gt;
 &lt;th&gt;优势&lt;/th&gt;
 &lt;th&gt;劣势&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;蓝绿部署&lt;/td&gt;
 &lt;td&gt;同时存在两个集群，两个集群中只有一个集群真正提供服务，另外一个集群测试、验证或待命&lt;/td&gt;
 &lt;td&gt;服务文档，版本回退简单，适用于各种场景的升级，大版本不兼容升级的或迭代兼容升级&lt;/td&gt;
 &lt;td&gt;浪费硬件资源，需要同时有两个集群，如果集群比较大，比如有1000个节点，这种方式几乎不可用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;金丝雀部署&lt;/td&gt;
 &lt;td&gt;逐点部署，逐步替换线上服务&lt;/td&gt;
 &lt;td&gt;小步快跑，快速迭代&lt;/td&gt;
 &lt;td&gt;只能适用于兼容迭代的方式，如果是大版本不兼容的场景，就没办法使用这种方式了&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="灰度发布"&gt;&lt;a href="#%e7%81%b0%e5%ba%a6%e5%8f%91%e5%b8%83" class="header-anchor"&gt;&lt;/a&gt;灰度发布
&lt;/h2&gt;&lt;p&gt;灰度发布是迭代的软件产品在生产环境安全上线的一种重要手段。&lt;/p&gt;
&lt;p&gt;灰度发布，也叫金丝雀发布。是指在黑与白之间，能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式，让一部分用户继续用A，一部分用户开始用B，如果用户对B没有什么反对意见，那么逐步扩大范围，把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定，在初始灰度的时候就可以发现、调整问题，以保证其影响度，而我们平常所说的金丝雀部署也就是灰度发布的一种方式。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/007-d4432b28.jpg"&gt;&lt;/p&gt;
&lt;h2 id="ab-test"&gt;&lt;a href="#ab-test" class="header-anchor"&gt;&lt;/a&gt;A/B Test
&lt;/h2&gt;&lt;p&gt;A/B测试和蓝绿发布、滚动发布以及金丝雀发布，完全是两回事。&lt;/p&gt;
&lt;p&gt;蓝绿发布、滚动发布和金丝雀是发布策略，目标是确保新上线的系统稳定，关注的是新系统的BUG、隐患。&lt;/p&gt;
&lt;p&gt;A/B测试是效果测试，同一时间有多个版本的服务对外服务，这些服务都是经过足够测试，达到了上线标准的服务，有差异但是没有新旧之分（它们上线时可能采用了蓝绿部署的方式）。&lt;/p&gt;
&lt;p&gt;A/B测试关注的是不同版本的服务的实际效果，譬如说转化率、订单情况等。&lt;/p&gt;
&lt;p&gt;A/B测试时，线上同时运行多个版本的服务，这些服务通常会有一些体验上的差异，譬如说页面样式、颜色、操作流程不同。相关人员通过分析各个版本服务的实际效果，选出效果最好的版本。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/008-9f1a0ffa.jpg"&gt;&lt;/p&gt;
&lt;h2 id="实现"&gt;&lt;a href="#%e5%ae%9e%e7%8e%b0" class="header-anchor"&gt;&lt;/a&gt;实现
&lt;/h2&gt;&lt;h3 id="kubernetes"&gt;&lt;a href="#kubernetes" class="header-anchor"&gt;&lt;/a&gt;kubernetes
&lt;/h3&gt;&lt;p&gt;官方的金丝雀发布方式&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://kubernetes.io/zh/docs/concepts/cluster-administration/manage-deployment/#canary-deployments" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/zh/docs/concepts/cluster-administration/manage-deployment/#canary-deployments&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Deployment滚动更新策略实现金丝雀发布&lt;/p&gt;
&lt;p&gt;利用Deployment的滚动更新策略maxSurge和maxUnavailable设置最大可超期望的节点数和最大不可用节点数可实现简单的金丝雀发布。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rollingUpdate.maxSurge&lt;/code&gt;最大可超期望的节点数，百分比 10% 或者绝对数值 5&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rollingUpdate.maxUnavailable&lt;/code&gt;最大不可用节点数，百分比或者绝对数值&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;extensions/v1beta1&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;demo-deployment&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hello-deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RollingUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rollingUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxSurge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="l"&gt;%&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxUnavailable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;demo-deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;webserver&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx:1.14&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;containerPort:80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ingress-Nginx配置Ingress Annotations实现金丝雀发布&lt;/p&gt;
&lt;p&gt;Ingress-Nginx 支持配置 Ingress Annotations 来实现不同场景下的金丝雀发布。Nginx Annotations 支持以下 4 种 Canary 规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nginx.ingress.kubernetes.io/canary-by-header&lt;/code&gt;：基于 Request Header 的流量切分，适用于灰度发布以及 A/B 测试。当 Request Header 设置为 always时，请求将会被一直发送到 Canary 版本；当 Request Header 设置为 never时，请求不会被发送到 Canary 入口；对于任何其他 Header 值，将忽略 Header，并通过优先级将请求与其他金丝雀规则进行优先级的比较。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nginx.ingress.kubernetes.io/canary-by-header-value&lt;/code&gt;：要匹配的 Request Header 的值，用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 Request Header 设置为此值时，它将被路由到 Canary 入口。该规则允许用户自定义 Request Header 的值，必须与上一个 annotation (即：canary-by-header）一起使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nginx.ingress.kubernetes.io/canary-weight&lt;/code&gt;：基于服务权重的流量切分，适用于蓝绿部署，权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求。权重为 100 意味着所有请求都将被发送到 Canary 入口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nginx.ingress.kubernetes.io/canary-by-cookie&lt;/code&gt;：基于 Cookie 的流量切分，适用于灰度发布与 A/B 测试。用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的cookie。当 cookie 值设置为 always时，它将被路由到 Canary 入口；当 cookie 值设置为 never时，请求不会被发送到 Canary 入口；对于任何其他值，将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/009-2fab79ea.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;注意&lt;/code&gt;：金丝雀规则按优先顺序进行如下排序：&lt;code&gt;canary-by-header&lt;/code&gt; - &amp;gt; &lt;code&gt;canary-by-cookie&lt;/code&gt; - &amp;gt; &lt;code&gt;canary-weight&lt;/code&gt;很显然&lt;/p&gt;
&lt;p&gt;&lt;code&gt;canary-weight&lt;/code&gt;是一种随机策略。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;canary-by-cookie&lt;/code&gt;和&lt;code&gt;canary-by-header-value&lt;/code&gt;适合后端金丝雀发布实现&lt;/p&gt;
&lt;p&gt;&lt;code&gt;canary-by-cookie&lt;/code&gt;适合前端金丝雀发布实现。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;extensions/v1beta1&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Ingress&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;demo-canary&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; 
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kubernetes.io/ingress.class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nginx.ingress.kubernetes.io/canary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nginx.ingress.kubernetes.io/canary-by-header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;canary&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nginx.ingress.kubernetes.io/canary-by-cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;canary&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;demo-api.fulu.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;serviceName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;demo-api-canary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;servicePort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体流程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果是第一次发布，必须是正常版本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果发布金丝雀版本，则先检测是否有&lt;code&gt;-canary&lt;/code&gt;后缀的ingress、service、deployment，如果有则替换金丝雀版本的镜像，如果没有则创建&lt;code&gt;-canary&lt;/code&gt;后缀的ingress、service、deployment。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果发布正常版本，则先检测是否有&lt;code&gt;-canary&lt;/code&gt;后缀的ingress、service、deployment，如果有则先删除它们，再替换正常版本的镜像。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2022-04-19-hui-du-fa-bu-lan-l-bu-shu-jin-si-que-dou-shi-sha/010-8de89c6e.png"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;蓝绿部署实现： &lt;a class="link" href="https://www.cnblogs.com/itzgr/p/14602827.html" target="_blank" rel="noopener"
 &gt;https://www.cnblogs.com/itzgr/p/14602827.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上这些方式只是实现了一种非常简单的金丝雀发布流程，是没有办法做更精细，比如说按用户信息去灰度的规则的。对于同一个用户，也有可能一次请求到了金丝雀中，下一次请求又到了正式环境中。假如需要更加精细的灰度规则，可以考虑采用spring cloud, istio等工具&lt;/p&gt;
&lt;h3 id="istio"&gt;&lt;a href="#istio" class="header-anchor"&gt;&lt;/a&gt;istio
&lt;/h3&gt;&lt;p&gt;Kubernetes 中的金丝雀部署&lt;/p&gt;
&lt;p&gt;假设我们有一个已部署的 helloworld 服务 v1 版本，我们想要测试（或简单上线）新版本 v2。使用 Kubernetes，您可以通过简单地更新服务的 [Deployment] 中的镜像并自动进行部署来[上线]新版本的 helloworld 服务。如果我们特能够小心保证在启动并且在仅启动一个或两个 v2 副本[暂停]上线时有足够的 v1 副本运行，则能够保持金丝雀发布对系统的影响非常小。后续我们可以观察效果，或在必要时进行[回滚]。最好，我们也能够对 Deployment 设置 [HPA]，在上线过程中减少或增加副本以处理流量负载时，也能够保持副本比例一致。&lt;/p&gt;
&lt;p&gt;尽管这种机制能够很好工作，但这种方式只适用于部署的经过适当测试的版本，也就是说，更多的是蓝/绿发布，又称红/黑发布，而不是 “蜻蜓点水“ 式的金丝雀部署。实际上，对于后者（例如，并没有完全准备好或者无意对外暴露的版本），Kubernetes 中的金丝雀部署将使用具有[公共 pod 标签]的两个 Deployment 来完成。在这种情况下，我们不能再使用自动缩放器，因为是有由两个独立的自动缩放器来进行控制，不同负载情况下，副本比例（百分比）可能与所需的比例不同。&lt;/p&gt;
&lt;p&gt;无论我们使用一个或者两个部署，使用 Docker，Mesos/Marathon 或 Kubernetes 等容器编排平台进行的金丝雀发布管理都存在一个根本问题：使用实例扩容来管理流量；版本流量分发和副本部署在上述平台中并独立。所有 pod 副本，无论版本如何，在 &lt;code&gt;kube-proxy&lt;/code&gt; 循环池中都被一视同仁地对待，因此管理特定版本接收的流量的唯一方法是控制副本比例。以小百分比维持金丝雀流量需要许多副本（例如，1％ 将需要至少 100 个副本）。即使我们可以忽略这个问题，部署方式功能仍然非常有限，因为它只支持简单（随机百分比）金丝雀部署。如果我们想根据某些特定规则将请求路由到金丝雀版本上，我们仍然需要另一种解决方案。&lt;/p&gt;
&lt;p&gt;使用 Istio，流量路由和副本部署是两个完全独立的功能。服务的 pod 数量可以根据流量负载灵活伸缩，与版本流量路由的控制完全正交。这在自动缩放的情况下能够更加简单地管理金丝雀版本。事实上，自动缩放管理器仍然独立运行，其在响应因流量路由导致的负载变化与其他原因导致负载变化的行为上没有区别。&lt;/p&gt;
&lt;p&gt;Istio 的[路由规则]也带来了其他的便利；你可以轻松实现细粒度控制流量百分比（例如，路由 1％ 的流量而不需要 100 个 pod），当然也可以使用其他规则来控制流量（例如，将特定用户的流量路由到金丝雀版本）。作为展示，让我们看一下采用这种方式部署 helloworld 服务的简单便捷。&lt;/p&gt;
&lt;p&gt;首先我们定义 helloworld 服务，和普通 Kubernetes 服务一样，如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Service&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后我们添加 2 个 Deployment，分别为版本 v1 和 v2，这两个版本都包含服务选择标签 &lt;code&gt;app：helloworld&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld-v1&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld-v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;extensions/v1beta1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld-v2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;28&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;29&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld-v2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;30&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;需要注意的是，这与使用普通 Kubernetes 进行[金丝雀部署]的方式完全相同，但是在 Kubernetes 方式下控制流量分配需要调整每个 Deployment 的副本数目。例如，将 10％ 的流量发送到金丝雀版本（v2），v1 和 v2 的副本可以分别设置为 9 和 1。&lt;/p&gt;
&lt;p&gt;但是在[启用 Istio] 的集群中，我们可以通过设置路由规则来控制流量分配。如将 10％ 的流量发送到金丝雀版本本，我们可以使用 &lt;code&gt;kubectl&lt;/code&gt; 来设置以下的路由规则：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;networking.istio.io/v1alpha3&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;VirtualService&lt;/span&gt;&lt;span class="w"&gt;
&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="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&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;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;90&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;networking.istio.io/v1alpha3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;DestinationRule&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;helloworld&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;28&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;29&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;30&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;31&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;32&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;33&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;EOF&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;34&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当规则设置生效后，Istio 将确保只有 10% 的请求发送到金丝雀版本，无论每个版本的运行副本数量是多少。&lt;/p&gt;
&lt;p&gt;以上是使用istio 进行的金丝雀部署，当然蓝绿也是类似的。&lt;/p&gt;
&lt;h3 id="spring-cloud"&gt;&lt;a href="#spring-cloud" class="header-anchor"&gt;&lt;/a&gt;spring cloud
&lt;/h3&gt;&lt;p&gt;spring cloud gateway也可以实现灰度发布，另外还有一款 spring cloud 的增强组件，可以实现灰度、蓝绿等功能（Discovery: &lt;a class="link" href="https://github.com/Nepxion/Discovery" target="_blank" rel="noopener"
 &gt;https://github.com/Nepxion/Discovery&lt;/a&gt;）&lt;/p&gt;
&lt;h3 id="网关"&gt;&lt;a href="#%e7%bd%91%e5%85%b3" class="header-anchor"&gt;&lt;/a&gt;网关
&lt;/h3&gt;&lt;p&gt;利用云原生网关比如 APISIX ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://apisix.apache.org/zh/docs/apisix/plugins/traffic-split/#" target="_blank" rel="noopener"
 &gt;https://apisix.apache.org/zh/docs/apisix/plugins/traffic-split/#&lt;/a&gt;蓝绿发布&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://apisix.apache.org/zh/docs/apisix/plugins/traffic-split/#" target="_blank" rel="noopener"
 &gt;https://apisix.apache.org/zh/docs/apisix/plugins/traffic-split/#&lt;/a&gt;灰度发布&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://cloud.tencent.com/developer/article/1835861" target="_blank" rel="noopener"
 &gt;https://cloud.tencent.com/developer/article/1835861&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.infoq.cn/article/lei4vsfpiw5a6en-aso4" target="_blank" rel="noopener"
 &gt;https://www.infoq.cn/article/lei4vsfpiw5a6en-aso4&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://zhuanlan.zhihu.com/p/42671353" target="_blank" rel="noopener"
 &gt;https://zhuanlan.zhihu.com/p/42671353&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.cnblogs.com/fulu/p/15648351.html" target="_blank" rel="noopener"
 &gt;https://www.cnblogs.com/fulu/p/15648351.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/]%28https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/" target="_blank" rel="noopener"
 &gt;https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/](https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://cloud.tencent.com/developer/article/1835861]%28https://cloud.tencent.com/developer/article/1835861" target="_blank" rel="noopener"
 &gt;https://cloud.tencent.com/developer/article/1835861](https://cloud.tencent.com/developer/article/1835861&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://istio.io/latest/zh/blog/2017/0.1-canary/" target="_blank" rel="noopener"
 &gt;https://istio.io/latest/zh/blog/2017/0.1-canary/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.zerchin.xyz/2020/08/10/K8s-1-18-6" target="_blank" rel="noopener"
 &gt;https://www.zerchin.xyz/2020/08/10/K8s-1-18-6&lt;/a&gt;版本基于-ingress-nginx-实现金丝雀发布（灰度发布）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.cnblogs.com/Courage129/p/14498788.html" target="_blank" rel="noopener"
 &gt;https://www.cnblogs.com/Courage129/p/14498788.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://cloud.tencent.com/developer/article/1620795" target="_blank" rel="noopener"
 &gt;https://cloud.tencent.com/developer/article/1620795&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>istio 原理简介</title><link>https://xiaobox.github.io/p/2021-11-19-istio-yuan-li-jian-jie/</link><pubDate>Fri, 19 Nov 2021 07:46:22 +0000</pubDate><guid>https://xiaobox.github.io/p/2021-11-19-istio-yuan-li-jian-jie/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/cover.jpg" alt="Featured image of post istio 原理简介" /&gt;&lt;h2 id="前导"&gt;&lt;a href="#%e5%89%8d%e5%af%bc" class="header-anchor"&gt;&lt;/a&gt;前导
&lt;/h2&gt;&lt;p&gt;由于 istio 自 1.5 版本以后架构上有了较大变化，控制面从多组件变成了单体的 istiod 组件，所以下文会先介绍 1.5 之前的架构，再介绍 1.5 之后的，是一个由繁到简的过程。&lt;/p&gt;
&lt;h2 id="istio-15-之前架构"&gt;&lt;a href="#istio-15-%e4%b9%8b%e5%89%8d%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;istio 1.5 之前架构
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/001-2f8acfd8.jpg"&gt;&lt;/p&gt;
&lt;h3 id="istio-的架构分为控制平面和数据平面"&gt;&lt;a href="#istio-%e7%9a%84%e6%9e%b6%e6%9e%84%e5%88%86%e4%b8%ba%e6%8e%a7%e5%88%b6%e5%b9%b3%e9%9d%a2%e5%92%8c%e6%95%b0%e6%8d%ae%e5%b9%b3%e9%9d%a2" class="header-anchor"&gt;&lt;/a&gt;Istio 的架构分为控制平面和数据平面
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;数据平面：由一组智能代理（Envoy）以 sidecar 模式部署，协调和控制所有服务之间的网络通信。&lt;/li&gt;
&lt;li&gt;控制平面：负责管理和配置代理路由流量，以及在运行时执行的政策。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/002-c780b396.jpg"&gt;&lt;/p&gt;
&lt;p&gt;可以看到控制面（control plane ）组件众多，下图是 1.1 版本所包含的组件：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/003-cbe3c492.jpg"&gt;&lt;/p&gt;
&lt;h2 id="istio-工作原理"&gt;&lt;a href="#istio-%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;istio 工作原理
&lt;/h2&gt;&lt;p&gt;我们先按照 1.5 版本之前的架构描述&lt;/p&gt;
&lt;h3 id="sidecar--注入-envoy"&gt;&lt;a href="#sidecar--%e6%b3%a8%e5%85%a5-envoy" class="header-anchor"&gt;&lt;/a&gt;Sidecar 注入 (envoy)
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/004-b660503b.jpg"&gt;&lt;/p&gt;
&lt;p&gt;详细的注入过程可以参考：https://blog.yingchi.io/posts/2020/6/istio-sidecar-injection.html&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/005-8acc110b.jpg"&gt;&lt;/p&gt;
&lt;h3 id="连接-pilot"&gt;&lt;a href="#%e8%bf%9e%e6%8e%a5-pilot" class="header-anchor"&gt;&lt;/a&gt;连接 （pilot）
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/006-a038f2bd.jpg"&gt;&lt;/p&gt;
&lt;h3 id="控制--观测-mixer-telemetrymixer-policy"&gt;&lt;a href="#%e6%8e%a7%e5%88%b6--%e8%a7%82%e6%b5%8b-mixer-telemetrymixer-policy" class="header-anchor"&gt;&lt;/a&gt;控制 &amp;amp;&amp;amp; 观测 （mixer telemetry、mixer policy）
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/007-7860d606.jpg"&gt;&lt;/p&gt;
&lt;h3 id="保护citadel"&gt;&lt;a href="#%e4%bf%9d%e6%8a%a4citadel" class="header-anchor"&gt;&lt;/a&gt;保护（citadel）
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/008-3d80397e.jpg"&gt;&lt;/p&gt;
&lt;h3 id="配置"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;配置
&lt;/h3&gt;&lt;p&gt;Galley 原来仅负责进行配置验证，1.1 后升级为整个控制面的配置管理中心，除了继续提供配置验证功能外，Galley 还负责配置的管理和分发，Galley 使用 网格配置协议 (Mesh Configuration Protocol) 和其他组件进行配置的交互。&lt;/p&gt;
&lt;p&gt;提供 istio 中的配置管理服务，验证 Istio 的 CRD 资源的合法性&lt;/p&gt;
&lt;h2 id="istio-各组件功能及作用"&gt;&lt;a href="#istio-%e5%90%84%e7%bb%84%e4%bb%b6%e5%8a%9f%e8%83%bd%e5%8f%8a%e4%bd%9c%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;istio 各组件功能及作用
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;istio-polit: 服务发现，向数据平面下发规则，包括 VirtualService、DestinationRule、Gateway、ServicEntry 等流量治理规则，也包括认证授权等安全规则。&lt;/li&gt;
&lt;li&gt;istio-telemetry: 专门收集遥测数据的 mixer 服务组件。&lt;/li&gt;
&lt;li&gt;Istio-policy: 另外一个 mixer 服务，可以对接如配额、授权、黑白名单等不同的控制后端，对服务间的访问进行控制。&lt;/li&gt;
&lt;li&gt;Istio-citadel: 核心安全组件，提供了自动生成、分发、轮换与撤销秘钥和证书的功能。&lt;/li&gt;
&lt;li&gt;Istio-galley: 配置管理的组件，验证配置信息的格式和内容的正确性，并将这些配置信息提供给管理面的 Pilot 和 Mixer 使用。&lt;/li&gt;
&lt;li&gt;Istio-sidecar-injector: 负责自动注入的组件。&lt;/li&gt;
&lt;li&gt;Istio-proxy: 数据面的轻量代理。&lt;/li&gt;
&lt;li&gt;Istio-ingressgateway: 入口处的 gateway。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="istio-15-之后架构"&gt;&lt;a href="#istio-15-%e4%b9%8b%e5%90%8e%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;istio 1.5 之后架构
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-11-19-istio-yuan-li-jian-jie/009-ed896fd9.jpg"&gt;&lt;/p&gt;
&lt;p&gt;之前版本的 istio 对组件进行了很好的解耦，组件们各司其职，当然也带来了组件比较多的问题。可以看到新版本将众多组件包装在了一起叫 istiod&lt;/p&gt;
&lt;p&gt;所以新版本 istio 核心组件就只剩下一个：istiod&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.infoq.cn/article/dtfjv1lu8fifvfqxmseh" target="_blank" rel="noopener"
 &gt;https://www.infoq.cn/article/dtfjv1lu8fifvfqxmseh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.yingchi.io/posts/2020/6/istio-sidecar-injection.html" target="_blank" rel="noopener"
 &gt;https://blog.yingchi.io/posts/2020/6/istio-sidecar-injection.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://istio.io/" target="_blank" rel="noopener"
 &gt;https://istio.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>血泪经验：使用SkyWalking 和 Envoy 访问日志服务对 istio 进行观察（一）</title><link>https://xiaobox.github.io/p/2021-06-25-xue-lei-jing-yan-shi-yong-skywalking-he-envoy-fang-wen-ri-zh/</link><pubDate>Fri, 25 Jun 2021 11:37:02 +0000</pubDate><guid>https://xiaobox.github.io/p/2021-06-25-xue-lei-jing-yan-shi-yong-skywalking-he-envoy-fang-wen-ri-zh/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-25-xue-lei-jing-yan-shi-yong-skywalking-he-envoy-fang-wen-ri-zh/cover.jpg" alt="Featured image of post 血泪经验：使用SkyWalking 和 Envoy 访问日志服务对 istio 进行观察（一）" /&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="350px" data-flex-grow="145" height="480" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xiaobox.github.io/p/2021-06-25-xue-lei-jing-yan-shi-yong-skywalking-he-envoy-fang-wen-ri-zh/001-51060090.jpg" width="700"&gt;&lt;/p&gt;
&lt;h3 id="分享一个宝贵的经验"&gt;&lt;a href="#%e5%88%86%e4%ba%ab%e4%b8%80%e4%b8%aa%e5%ae%9d%e8%b4%b5%e7%9a%84%e7%bb%8f%e9%aa%8c" class="header-anchor"&gt;&lt;/a&gt;分享一个宝贵的经验
&lt;/h3&gt;&lt;p&gt;我们想利用 &lt;code&gt;skywalking&lt;/code&gt; 收集 &lt;code&gt;istio&lt;/code&gt; 的 &lt;code&gt;envoy&lt;/code&gt; 日志，进而利用 &lt;code&gt;skywalking&lt;/code&gt; 查看 &lt;code&gt;istio&lt;/code&gt; 的 &lt;code&gt;trace&lt;/code&gt;、&lt;code&gt;log&lt;/code&gt;等。&lt;/p&gt;
&lt;p&gt;但这里面有个坑，就是 &lt;code&gt;istio&lt;/code&gt; 和 &lt;code&gt;skywalking&lt;/code&gt; 的版本问题。我们 &lt;code&gt;istio&lt;/code&gt; 使用的是1.3版本，&lt;code&gt;skywalking&lt;/code&gt; 8.3 。&lt;/p&gt;
&lt;p&gt;经过华为和 skywalking 核心开发者的确认，版本对应关系如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;istio&lt;/code&gt; 1.3     不支持生产 &lt;code&gt;skywalking&lt;/code&gt; 使用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;istio&lt;/code&gt; 1.7以上  &lt;code&gt;skywalking&lt;/code&gt; 链路拓扑可以商用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;istio&lt;/code&gt; 1.8     &lt;code&gt;skywalking&lt;/code&gt; 日志商用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;istio&lt;/code&gt; 1.11    &lt;code&gt;trace&lt;/code&gt; 商用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以结论是得升级 &lt;code&gt;istio&lt;/code&gt;，然后再去集成 &lt;code&gt;skywalking&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;后续随着 &lt;code&gt;istio&lt;/code&gt; 的升级将继续结合 &lt;code&gt;skywalking&lt;/code&gt; 进行操作，并输出具有更多细节的文章。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="258" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://xiaobox.github.io/p/2021-06-25-xue-lei-jing-yan-shi-yong-skywalking-he-envoy-fang-wen-ri-zh/002-608d629a.gif" width="258"&gt;&lt;/p&gt;
&lt;p&gt;关注公众号 获取更多精彩内容&lt;/p&gt;</description></item><item><title>上了 istio 的贼船之 API Gateway</title><link>https://xiaobox.github.io/p/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/</link><pubDate>Mon, 21 Jun 2021 05:02:18 +0000</pubDate><guid>https://xiaobox.github.io/p/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/cover.jpg" alt="Featured image of post 上了 istio 的贼船之 API Gateway" /&gt;&lt;h1 id="上了-istio-的贼船之-api-gateway"&gt;&lt;a href="#%e4%b8%8a%e4%ba%86-istio-%e7%9a%84%e8%b4%bc%e8%88%b9%e4%b9%8b-api-gateway" class="header-anchor"&gt;&lt;/a&gt;上了 istio 的贼船之 API Gateway
&lt;/h1&gt;&lt;h2 id="现状"&gt;&lt;a href="#%e7%8e%b0%e7%8a%b6" class="header-anchor"&gt;&lt;/a&gt;现状
&lt;/h2&gt;&lt;p&gt;下图是我们系统的架构现状，大致介绍一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基础设施在华为云上&lt;/li&gt;
&lt;li&gt;基本上是基于 &lt;code&gt;istio on k8s&lt;/code&gt; 架构。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;istio&lt;/code&gt; 版本为 1.3，所以组件较多（&lt;code&gt;galley、pilot、citadel、telemetry&lt;/code&gt;&amp;hellip;&amp;hellip;）&lt;/li&gt;
&lt;li&gt;微服务后端用 &lt;code&gt;spring boot&lt;/code&gt; 单体，前端有 &lt;code&gt;nodejs、vue&lt;/code&gt;等&lt;/li&gt;
&lt;li&gt;应用的链路监控主要基于 &lt;code&gt;skywalking&lt;/code&gt;, &lt;code&gt;istio&lt;/code&gt; 的通讯层面利用 &lt;code&gt;kiali&lt;/code&gt;可视化调用链&lt;/li&gt;
&lt;li&gt;其他比较传统&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/001-abd5152c.jpg"&gt;&lt;/p&gt;
&lt;p&gt;历史架构&lt;/p&gt;
&lt;p&gt;主要介绍下作为服务通讯基础设施的 &lt;code&gt;istio&lt;/code&gt; 在这里的作用&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;服务间通讯，依赖 &lt;code&gt;envoy sidecar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;注册中心，依赖 &lt;code&gt;istio&lt;/code&gt; 控制面&lt;/li&gt;
&lt;li&gt;服务治理（熔断、超时、重试）&lt;em&gt;这部分还没有完完全全切干净，还有些 &lt;code&gt;spring boot&lt;/code&gt; 应用依赖 &lt;code&gt;hystrix&lt;/code&gt;，后面会全部改成利用 &lt;code&gt;istio&lt;/code&gt;&lt;/em&gt;。&lt;/li&gt;
&lt;li&gt;流量管理（&lt;code&gt;ingress gateway&lt;/code&gt;、&lt;code&gt;egress gateway&lt;/code&gt;、负载均衡）&lt;/li&gt;
&lt;li&gt;测试（错误注入）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过将传统微服务架构的这些控制面功能解耦到 istio,可以让微服务应用本身专注于业务开发，是一个比较简的单体 springboot 应用。再结合 k8s 的高扩展性，研发整体的迭代速度和运维效率还是比较高的，缺点是无论是 k8s 还是 istio ，学习成本偏高，需要团队至少 2 人具有专业知识，对于招聘成本、系统升级都有风险。&lt;/p&gt;
&lt;h2 id="上了贼船"&gt;&lt;a href="#%e4%b8%8a%e4%ba%86%e8%b4%bc%e8%88%b9" class="header-anchor"&gt;&lt;/a&gt;上了贼船
&lt;/h2&gt;&lt;p&gt;坦白讲，如果系统最初的设计是我来做，是不会用如此“激进”的方案的，会转而用 &lt;code&gt;spring cloud&lt;/code&gt; 为基础的架构，当然，&lt;code&gt;k8s&lt;/code&gt; 是非常可能会使用的。但可惜我是中间接手，也想过换架构，但迫于公司业务和迭代的压力，再加上人手有限，再换架构的风险会非常高，所以既然上了 &lt;code&gt;istio&lt;/code&gt; 的贼船，就只能走下去了，等什么时候时机成熟再并行其他架构，或切换回合适的架构。这里我要强调的是，做架构选择或者选型不是为了技术而技术，一定是要非常适合当时公司的发展现状、业务场景、团队能力、招聘成本等等，综合多种条件而得出的结论。 巧合的是 istio 的 logo 也是一个帆船的样子，果真是上了贼船 &lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/002-5ae55d6c.png"&gt;&lt;/p&gt;
&lt;h2 id="api-gateway"&gt;&lt;a href="#api-gateway" class="header-anchor"&gt;&lt;/a&gt;API Gateway
&lt;/h2&gt;&lt;p&gt;终于说到本文的重点 &lt;code&gt;API Gateway&lt;/code&gt; 了，对于这个话题，之前写过一篇文章，读者可以先脱离现在的架构从功能层面来了解下 &lt;code&gt;API Gateway&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; [![Image](https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/003-65589640.png)API 网关选型及包含 BFF 的架构设计](http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484717&amp;amp;idx=1&amp;amp;sn=8162d7957b29504162490780e8d3763d&amp;amp;chksm=eb6dbaabdc1a33bd14c244069e44e3b84dfea8bae546c09facfa42bb5dbf90c1c70421efa6dc&amp;amp;scene=21#wechat_redirect)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回到我们现在的架构，你会发现，虽然我们有前置的 &lt;code&gt;openResty&lt;/code&gt;,但应用层这边并没有一个担当 &lt;code&gt;API Gateway&lt;/code&gt; 角色的服务。而无论是 &lt;code&gt;openResty&lt;/code&gt; 或者是 &lt;code&gt;nginx&lt;/code&gt; 对于云原生 &lt;code&gt;API Gateway&lt;/code&gt; 的需求是不能完全满足的。&lt;/p&gt;
&lt;p&gt;当然了解 &lt;code&gt;istio&lt;/code&gt; 的读者可能会问：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;istio ingress gateway&lt;/code&gt; 不也具有网关的功能吗 ？&lt;/li&gt;
&lt;li&gt;为什么没有用 &lt;code&gt;nginx ingress controller&lt;/code&gt; ？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先，我承认基于 &lt;code&gt;k8s ingress&lt;/code&gt; 实现的各种 &lt;code&gt;ingress controller&lt;/code&gt; 功能越来越完善，如果我们没有用 &lt;code&gt;istio&lt;/code&gt; 可能会采用这种方案，但我们使用了，那么再结合 &lt;code&gt;k8s ingress&lt;/code&gt; 就会有如如何为服务网格选择入口网关[1]中说的如下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;K8s Ingress&lt;/code&gt; 是独立在 &lt;code&gt;Istio&lt;/code&gt; 体系之外的，需要单独采用 &lt;code&gt;Ingress rule&lt;/code&gt; 进行配置，导致系统入口和内部存在两套互相独立的路由规则配置，运维和管理较为复杂。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;K8s Ingress rule&lt;/code&gt; 的功能较弱，不能在入口处实现和网格内部类似的路由规则，也不具备网格 &lt;code&gt;sidecar&lt;/code&gt; 的其它能力，导致难以从整体上为应用系统实现灰度发布、分布式跟踪等服务管控功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其次，没错 &lt;code&gt;istio ingress gateway&lt;/code&gt; 除了基础的通讯功能之外，还有一些其他的应用层功能。但我们综合来比较下 &lt;code&gt;k8s ingress&lt;/code&gt;、&lt;code&gt;istio ingress gateway&lt;/code&gt; 和我们理想中的 &lt;code&gt;API Gateway&lt;/code&gt;，就会发现它还不够完善,主要是对于 &lt;code&gt;API&lt;/code&gt; 管理的这部分功能欠缺。&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/004-920af72e.jpg"&gt;&lt;/p&gt;
&lt;h2 id="未来"&gt;&lt;a href="#%e6%9c%aa%e6%9d%a5" class="header-anchor"&gt;&lt;/a&gt;未来
&lt;/h2&gt;&lt;p&gt;前文已经对各种 &lt;code&gt;API Gateway&lt;/code&gt;的实现方案进行了讨论，结论是在目前难以找到一个同时具备&lt;code&gt;API Gateway&lt;/code&gt;和&lt;code&gt;Isito Ingress&lt;/code&gt;能力的网关。那么再回顾一下我们的需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们使用 istio&lt;/li&gt;
&lt;li&gt;我们需要 API Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，经过思考，我们未来的方案设计如下图：&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2021-06-21-shang-le-istio-de-zei-chuan-zhi-api-gateway/005-af72412a.jpg"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仍然利用 &lt;code&gt;istio ingress gateway&lt;/code&gt;作为入口&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;istio ingress gateway&lt;/code&gt;接到 &lt;code&gt;LB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;API Gateway&lt;/code&gt;纳入到&lt;code&gt;istio cluster&lt;/code&gt;管理的范畴当中，即拥有&lt;code&gt;sidecar proxy&lt;/code&gt;，可被&lt;code&gt;istio&lt;/code&gt;控制面控制。&lt;code&gt;API Gateway&lt;/code&gt;的选型很有可能使用云原生应用网关，如 &lt;code&gt;API SIX&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;应用层微服务不会利用如 spring cloud gateway 编码一个服务网关&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结：使用&lt;code&gt;API Gateway&lt;/code&gt;和&lt;code&gt;Sidecar Proxy&lt;/code&gt;一起为服务网格提供外部流量入口。&lt;/p&gt;
&lt;h3 id="还有没有问题"&gt;&lt;a href="#%e8%bf%98%e6%9c%89%e6%b2%a1%e6%9c%89%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;还有没有问题？
&lt;/h3&gt;&lt;p&gt;有的，根据 Service Mesh 和 API Gateway关系深度探讨[2]上述方案的优势在于&lt;code&gt;API Gateway&lt;/code&gt;和&lt;code&gt;Sidecar&lt;/code&gt;独立部署，职责明确，架构清晰。但是，和&lt;code&gt;Service Mesh&lt;/code&gt;使用&lt;code&gt;sidecar&lt;/code&gt;被质疑多一跳会造成性能开销影响效率一样，&lt;code&gt;API Gateway&lt;/code&gt;使用&lt;code&gt;Sidecar&lt;/code&gt;也被同样的质疑：多了一跳……&lt;/p&gt;
&lt;p&gt;对了多了这一跳，从整个架构每一段的网络耗时及其作用来看，这一跳多出的时间，几乎可以忽略不计。&lt;/p&gt;
&lt;h3 id="性能如何"&gt;&lt;a href="#%e6%80%a7%e8%83%bd%e5%a6%82%e4%bd%95" class="header-anchor"&gt;&lt;/a&gt;性能如何？
&lt;/h3&gt;&lt;p&gt;作为 &lt;code&gt;sidecar&lt;/code&gt; 的 &lt;code&gt;envoy&lt;/code&gt;的性能应该是毋庸置疑了。至于&lt;code&gt;istio ingress gateway&lt;/code&gt;虽然官方给出的数据也不错，但还是要在实践中观察。而作为 &lt;code&gt;Cloud Native API Gateway&lt;/code&gt; 比如 &lt;code&gt;API SIX&lt;/code&gt; 我对它有足够的信心，至少在我司现阶段业务体量以及未来百倍增长规模下都不会担心性能问题。&lt;/p&gt;
&lt;h3 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h3&gt;&lt;p&gt;[1]&lt;/p&gt;
&lt;p&gt;如何为服务网格选择入口网关？: &lt;em&gt;&lt;a class="link" href="https://zhaohuabing.com/post/2019-03-29-how-to-choose-ingress-for-service-mesh/#k8s-ingress" target="_blank" rel="noopener"
 &gt;https://zhaohuabing.com/post/2019-03-29-how-to-choose-ingress-for-service-mesh/#k8s-ingress&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;[2]&lt;/p&gt;
&lt;p&gt;Service Mesh和API Gateway关系深度探讨: &lt;em&gt;&lt;a class="link" href="https://www.servicemesher.com/blog/service-mesh-and-api-gateway/" target="_blank" rel="noopener"
 &gt;https://www.servicemesher.com/blog/service-mesh-and-api-gateway/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>2020 小盒子的年度总结</title><link>https://xiaobox.github.io/p/2020-12-27-2020-xiao-he-zi-de-nian-du-zong-jie/</link><pubDate>Sun, 27 Dec 2020 12:41:24 +0000</pubDate><guid>https://xiaobox.github.io/p/2020-12-27-2020-xiao-he-zi-de-nian-du-zong-jie/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2020-12-27-2020-xiao-he-zi-de-nian-du-zong-jie/cover.jpg" alt="Featured image of post 2020 小盒子的年度总结" /&gt;&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2020-12-27-2020-xiao-he-zi-de-nian-du-zong-jie/001-8e93a35d.png"&gt;&lt;/p&gt;
&lt;p&gt;这一年过得真快，转眼还有 4 天 2020 年就过去了。&lt;/p&gt;
&lt;p&gt;这一年发生了好多事，有好的也有坏的。&lt;/p&gt;
&lt;p&gt;昨天看到网友的年度总结，十分感慨，想来今年我们都度过了十分特殊的一年，仅以此文，寥做总结，希望这是未来 10 年中最差的一年。&lt;/p&gt;
&lt;h2 id="健康"&gt;&lt;a href="#%e5%81%a5%e5%ba%b7" class="header-anchor"&gt;&lt;/a&gt;健康
&lt;/h2&gt;&lt;p&gt;今年可以说是身体上出状况最多的一年，去年的湿疹刚好，夏天时突然骨折，骨折养到一半又突发肾结石。在吾妻悉心的照顾下，还好并无大碍。&lt;/p&gt;
&lt;p&gt;今年应该是我最胖的一年，很多人没见过我大学时清瘦的模样，我想也回不到从前了。上半年还挣扎过，跟体重较了几个月的劲，下半年就放弃了。无它，我认了，健康就好。&lt;/p&gt;
&lt;h2 id="感情"&gt;&lt;a href="#%e6%84%9f%e6%83%85" class="header-anchor"&gt;&lt;/a&gt;感情
&lt;/h2&gt;&lt;p&gt;吾妻这两年由于各种事情的原因回归家庭，照顾我、照顾猫。其实距离我们婚礼举行也就一年多，婚礼的誓词还时常萦绕在耳边，但总感觉像老夫老妻一样，越来越默契了，也许是一起经历过太多的事情。在生活面前，共同经历多少真刀真枪的兵荒马乱，就有多少难舍难分的情深意重。&lt;/p&gt;
&lt;h2 id="工作"&gt;&lt;a href="#%e5%b7%a5%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;工作
&lt;/h2&gt;&lt;p&gt;岁末年初的时候创业失败，疫情期间离京在家过着与世隔绝的日子，夏初入职履新，后被拖欠工资，再求职，又履新。&lt;/p&gt;
&lt;p&gt;新工作老板、同事、业务都算靠谱，从架构师做到技术总监，最近一个月没有一天 9点前下过班。我知道我没有什么天赋，所以勤奋是必备素质。&lt;/p&gt;
&lt;h2 id="财务"&gt;&lt;a href="#%e8%b4%a2%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;财务
&lt;/h2&gt;&lt;p&gt;今年确实没攒什么钱，经济压力比较大，加上不顺的事情太多，有些抑郁。初秋的时候和吾妻谈过一次，感觉这一年没真正开心过，最近一两月好多了。然而也收获到了金钱买不到的东西，我们夫妻的感情更好了，我也更沉着和更有耐心了。今后希望通过努力，将来我和我的家人再不用被金钱所迫。&lt;/p&gt;
&lt;h2 id="输出"&gt;&lt;a href="#%e8%be%93%e5%87%ba" class="header-anchor"&gt;&lt;/a&gt;输出
&lt;/h2&gt;&lt;p&gt;由于最近确实忙到飞起，公众号和专栏有一个月停更了。后续公司的事情走上正轨，会回归正常输出频率的。(文末有我今年的精选文章列表，欢迎大家查阅) 感谢很多圈内大佬的支持，感谢 APISIX、小林coding和耗子哥的关注。还有那些打赏、点赞的朋友们。&lt;/p&gt;
&lt;p&gt;出书的计划确实被搁置了，不过也是好事，我想再储备储备，有些东西还是要深入浅出，有了更多的实践，尽可能不误人子弟。&lt;/p&gt;
&lt;h2 id="技术"&gt;&lt;a href="#%e6%8a%80%e6%9c%af" class="header-anchor"&gt;&lt;/a&gt;技术
&lt;/h2&gt;&lt;h3 id="架构"&gt;&lt;a href="#%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;架构
&lt;/h3&gt;&lt;p&gt;今年换了两个架构，以 spring cloud 为主的 docker 集群，和 k8s on istio 架构。新公司的 k8s on istio 直到现在我仍然认为是激进的，后期会根据实际情况进行合理调整。&lt;/p&gt;
&lt;h3 id="基础"&gt;&lt;a href="#%e5%9f%ba%e7%a1%80" class="header-anchor"&gt;&lt;/a&gt;基础
&lt;/h3&gt;&lt;p&gt;说来奇怪，做技术的时间越长，好奇心越重，从年初读完《上帝掷骰子吗？》开始，对很多东西产生了越发浓厚的兴趣。还记得我入行的前几年，曾一度自我怀疑，我到底适不适合干这行？很多东西真的很难，很枯燥。现在却觉得越来越有意思，也许我没什么天赋，但至少没有放弃。坚持可能才是最难的。&lt;/p&gt;
&lt;h2 id="未来"&gt;&lt;a href="#%e6%9c%aa%e6%9d%a5" class="header-anchor"&gt;&lt;/a&gt;未来
&lt;/h2&gt;&lt;p&gt;由于缺憾导致人有更强烈的欲望，面对未来我想做一个更加坚毅、果敢、勇往直前的人。&lt;/p&gt;
&lt;h2 id="最后"&gt;&lt;a href="#%e6%9c%80%e5%90%8e" class="header-anchor"&gt;&lt;/a&gt;最后
&lt;/h2&gt;&lt;p&gt;明明自己生活也过得不如人意却还是见不得这人间疾苦。2020 年就要过去了，我一点儿都不怀念它。&lt;/p&gt;
&lt;p&gt;2020年度精选文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484975&amp;amp;idx=1&amp;amp;sn=56966ec7600b75558bb9f62fce1db069&amp;amp;chksm=eb6db9a9dc1a30bfafe7372d0e7c143080830625a0dddbcf006aa315925dfa504989e0163013&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;转载）从MySQL InnoDB 物理文件格式深入理解索引&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484864&amp;amp;idx=1&amp;amp;sn=3bba0506e348d595ab2698edb9f19d38&amp;amp;chksm=eb6dba46dc1a3350e15498053859fd9aab10ddd07164f866cfc380cd8f89277a1a68916b98fc&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;我对 MySQL 锁、事务、MVCC 的一些认识&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484849&amp;amp;idx=1&amp;amp;sn=a050a4997703383fe959de72df035dc3&amp;amp;chksm=eb6dba37dc1a3321e2f0697fafcce56cb38fea1c6cb80cf55b50214172370baf362f68eaca44&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;分布式事务：从理论到实践（三）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484828&amp;amp;idx=1&amp;amp;sn=06b7a0ac80937e7958d15628eb3303d0&amp;amp;chksm=eb6dba1adc1a330c97d2f97575ceedfd592f1186a6ce159a09e63d7879d7353ef8b605e23784&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;分布式事务：从理论到实践（二）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484799&amp;amp;idx=1&amp;amp;sn=5be388a7fe885ce4dd26b921a3f86ebe&amp;amp;chksm=eb6dbaf9dc1a33ef372547b3d9f817508e01f7e3d033a58dde3cd155ad3ed26feea637f4daa9&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;分布式事务：从理论到实践（一）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484717&amp;amp;idx=1&amp;amp;sn=8162d7957b29504162490780e8d3763d&amp;amp;chksm=eb6dbaabdc1a33bd14c244069e44e3b84dfea8bae546c09facfa42bb5dbf90c1c70421efa6dc&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;API 网关选型及包含 BFF 的架构设计&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484703&amp;amp;idx=1&amp;amp;sn=a04891e4a2167c8a75ff34d68cf5adce&amp;amp;chksm=eb6dba99dc1a338f56a7542326d0d529b23c65a5aba0124a7c3bc9198798b817b4d126f8bcf7&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;如何使用skywalking 进行全链路监控&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484448&amp;amp;idx=1&amp;amp;sn=c926061378addf6f9d9a91b440c7c9d8&amp;amp;chksm=eb6dbba6dc1a32b02ec0362bc70343705ab8cd8960052d7a167ed103809a81c9c04165db2f3f&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;APM 组件选型&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484343&amp;amp;idx=1&amp;amp;sn=0c0ac16161f09cadd00483addbf6e598&amp;amp;chksm=eb6dbc31dc1a35278931f76fce310d6ead4aba125fc2370aeb52a03b2dc4a78c0d4d95fae420&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;彻底搞懂AQS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484249&amp;amp;idx=1&amp;amp;sn=fddb98d346845cb42740b8fdc5bb05fe&amp;amp;chksm=eb6dbcdfdc1a35c90a0e31c43ad9a1a9378685801b4ad632b276c7682f1f5da8b6ee64c183a9&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;一次性搞定HashMap面试&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484244&amp;amp;idx=1&amp;amp;sn=6df3488ca359fac892456fabdeb6520a&amp;amp;chksm=eb6dbcd2dc1a35c406ff444c029edb87aa8db8abc83b9e53dde392b113c3093cf3187cf25342&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;经典面试题之HashMap(二)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247484239&amp;amp;idx=1&amp;amp;sn=370298f66cfb9b85df7420cb09a5ce2e&amp;amp;chksm=eb6dbcc9dc1a35df77495c0718c3b59f6eae1eef449ab3f0ad23884533a8173de073458cf2d3&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;经典面试题之HashMap(一)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247483861&amp;amp;idx=1&amp;amp;sn=278c2cf7be8e779a0ffa103f335fa9dd&amp;amp;chksm=eb6dbe53dc1a374529eef6505d9922aa45aeb5c1004f27cb1c7efed6848af03b182e00890144&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;十大经典排序算法（四）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247483857&amp;amp;idx=1&amp;amp;sn=480985f7a3547226b0febf5f409fc831&amp;amp;chksm=eb6dbe57dc1a37410b6cf8dd1105cd4edb557bf92acd40c3cbcca0b6442fe2d8daf19a23df9f&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;十大经典排序算法（三）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247483852&amp;amp;idx=1&amp;amp;sn=452fb838414c626059b9ef68b622e489&amp;amp;chksm=eb6dbe4adc1a375c8f9ec120a7d53c1a7630c551e1b93a85ad42fe11ae5413aa62a7c64b8194&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;十大经典排序算法（二）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://mp.weixin.qq.com/s?__biz=MzI3Njk5ODg4OQ==&amp;amp;mid=2247483844&amp;amp;idx=1&amp;amp;sn=af2a74158fd83d15f51c8e70da5d69c2&amp;amp;chksm=eb6dbe42dc1a3754150255bad083ba5f7155911a9144978ce4a76e219987f55a6e9200db3b6d&amp;amp;scene=21#wechat_redirect" target="_blank" rel="noopener"
 &gt;十大经典排序算法（一）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2020-12-27-2020-xiao-he-zi-de-nian-du-zong-jie/002-a2fb3490.gif"&gt;&lt;/p&gt;
&lt;p&gt;关注公众号 获取更多精彩内容&lt;/p&gt;</description></item><item><title>持续演进的Cloud Native (读书笔记05)</title><link>https://xiaobox.github.io/p/2020-03-10-chi-xu-yan-jin-de-cloud-native-du-shu-bi-ji-05/</link><pubDate>Tue, 10 Mar 2020 16:00:00 +0000</pubDate><guid>https://xiaobox.github.io/p/2020-03-10-chi-xu-yan-jin-de-cloud-native-du-shu-bi-ji-05/</guid><description>&lt;img src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2020-03-10-chi-xu-yan-jin-de-cloud-native-du-shu-bi-ji-05/cover.jpg" alt="Featured image of post 持续演进的Cloud Native (读书笔记05)" /&gt;&lt;p&gt;&lt;strong&gt;未来值得关注的方向&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Serverless&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无服务器架构是基于互联网的系统，它的应用开发不使用常规的服务进程。相反，它仅依赖于第三方服务（例如 AWS Lambda 服务），是客户端逻辑和服务托管远程过程调用的组合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;什么是Serverless&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Service Mesh&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Service Mesh是用于处理服务到服务通信的专用基础架构层。Cloud Native有着复杂的服务拓扑，它负责可靠地传递请求。实际上，Service Mesh 通常作为一组轻量级网络代理实现，这些代理与应用程序代码部署在一起，应用程序无感知。随着Cloud Native的崛起，Service Mesh逐步发展为一个独立的基础设施层。在Cloud Native架构下，单个应用程序可能由数百个服务组成；每个服务可能有数千个实例；并且这些实例中的每一个实例都可能处于不断变化的状态，因为它们是由诸如Kubernetes之类的资源调度系统动态调度的。这个世界中的服务通信不仅非常复杂，而且是运行时行为的普遍和基本部分，管理它对于确保端到端的性能和可靠性至关重要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;什么是Service Mesh&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;研发流程&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;十二因子&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基准代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一份基准代码，多份部署&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 GIT 或者 SVN 管理代码，并且有明确的版本信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依赖&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;显式声明依赖关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如Java中我们可以使用Maven或者Gradle管理依赖包&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在环境中存储配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第一，可以将应用的配置存储于环境变量中；第二，可以将应用的配置存储于分布式配置中心。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后端服务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把后端服务当作附加资源&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;构建、发布、运行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;严格分离构建和运行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;十二因子强调通过CI/CD（持续集成/持续布置）工具实现整个过程，例如使用Jenkins。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以一个或多个无状态进程运行应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;端口绑定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过端口绑定提供服务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;并发&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过进程模型进行扩展&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;易处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;快速启动和优雅终止可最大化健壮性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开发环境与线上环境等价&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尽可能保持开发、预发布、线上环境相同&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;日志&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把日志当作事件流&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;管理进程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把后台管理任务当作一次性进程运行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code Review的意义&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code Review，顾名思义，就是针对一名开发人员完成的代码，让团队其他开发人员检查的过程。很多公司都在开展 Code Review，但是绝大多数公司只是流于形式，并没有形成一种文化。Code Review更多依靠的是小团队的工匠精神和程序员个人的主观能动性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code Review的原则&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以发现问题为目标&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不设置惩罚 而应该采用正向激励的做法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不论资历&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code Review的过程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用工具 线上+线下结合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代码即设计&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;架构设计包含两方面，一是架构，二是设计。在敏捷开发中，架构并没有被抛弃，架构的思考可能发生在你理解需求的过程中，也可能来自你的经验；架构的结果可能是一个白板上简单的图，也可能需要详细调研，这与架构师的能力有关。设计需要耗费大量的时间和精力去做，设计会转移、分配到整个研发流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整个进化设计需要简单的架构+持续集成+重构+整个研发流程的设计来保证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;敏捷研发流程模糊阶段性的理由是：业务需求太多和技术变化速度太快。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这种设计上的转变实际上非常适合小规模、有强大战斗力的团队&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;团队文化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;高效的会议&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缩小会议范围&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;常规会议不应该超过45分钟&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;限制“意见领袖”的发言时长&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提供平等的会议氛围&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;会议中的分歧不应该延伸到会议之外&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何留下你想要的人&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;充分沟通&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;给予尊重&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;肯定工作成绩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设定合适的岗位&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设定更大的挑战&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://pub-f29bf2b53160470c9a85250116509a24.r2.dev/post/2020-03-10-chi-xu-yan-jin-de-cloud-native-du-shu-bi-ji-05/001-bf98d7fd.jpg"&gt;&lt;/p&gt;
&lt;p&gt;关注公众号 获取更多精彩内容&lt;/p&gt;</description></item></channel></rss>