从三万英尺看全链路灰度

news2024/12/23 14:40:40

作者:卜比

全链路灰度是微服务领域,很实用的企业级场景下的技术能力。

从本期开始,我们将通过《全链路灰度:自顶向下的方法》的系列文章,由远及近的剖析全链路灰度全貌,系列文章分为 4 篇:

《从三万英尺看全链路灰度》:介绍微服务的基础概念、主流的部署模式。

《从三千英尺看全链路灰度》:介绍全链路灰度和涉及的组件,以及如何组装成全链路灰度的能力。

《从三百英尺看全链路灰度》:从技术细节入手,分享如何实现路由能力和灰度能力。

《总结篇》:总结全链路灰度,目的是更加高效支持好业务同学,进一步保证线上稳定性。

微服务架构的优势

划分微服务层次结构,拆分复杂度

在微服务架构出现之前,更多的业务采用的是单体架构。单体架构在复杂业务场景下,每一个开发人员都无法准确的评估复杂度:每一个修改都需要遍历代码库,确定这个修改不会影响其他功能。

在微服务架构出现后,通过 RPC、消息队列等技术,我们可以很好的划分出微服务体系结构(microservices hierarchy):架构师关注业务逻辑;业务开发者关注微服务内的业务自洽;中间件开发者关注基础设施的高效和稳定。分离、拆分了复杂度。

高内聚低耦合,让业务更加聚焦

在单体架构中,代码的模块化一般是通过 package、namespace 等语言特性来实现的,但这种模块化的实现,会有各种各样的问题:

  • package、namespace 等特性是语言相关的,如果出现跨语言的情况,需要重新组织代码结构
  • 模块化划分没有标准。以 Java 为例,是以 controller、service 等组件类型来划分 package?还是以各个业务域来划分 package?
  • package 划分缺少强制工具。即使我们定了划分标准,但 package 仍不能强制限定模块化,业务同学写出了跨模块的调用,仍然能通过测试、上线。

面对上述问题,亚马逊提出了 API-first、FaceBook 开源了 Thrift、Google 开源了 gRPC,帮助开源社区构建了微服务基础设施。

限制不好的架构设计,让代码能够无负担进化

在单体架构时代,经常遇到一些比较难看的设计,但是改动这些代码,总是会遇到兼容性问题,不能彻底移除。

拆分成微服务后,每个微服务都可以有自己的开发语言、设计模式,即使出现了设计问题,我们也能够将这些糟糕的设计限定在每个服务内部,阻止了架构的腐化和失控。

微服务的基础概念

在这里插入图片描述

微服务生态图

上面这张图很好的展示了微服务体系下,我们需要依赖的基础设施以及相关开源项目,下面我们分模块简要介绍下:

  • 微服务之间要能够互相发现、互相调用,就需要注册中心。
  • 微服务的部署需要标准化,方便迁移、扩缩容,业界比较流行的部署模式有 Kubernetes。
  • 微服务的问题排查、监控等,需要可观测组件。
  • 微服务体系需要引入外部流量、鉴权等,需要微服务网关。
  • 微服务的数据存储,根据存取的方式、成本不同,可以使用 MySQL 或者 Redis 等。
  • 需要实现全链路灰度、API 管理等微服务治理功能,就需要治理中心。

微服务的拆分

技术层面上,微服务的拆分,通常可以按照业务模块、业务场景等进行拆分,尽量确保服务逻辑自洽、对外其他比较少,做到高内聚低耦合。紧密关联的业务逻辑,放在一个微服务内,避免在服务与服务之间共享数据。

从组织结构层面上,微服务解决的根本问题是团队分工问题,详见康威定律,这是大型软件发展的必然,不因为人的喜好而改变。当你读懂康威定律,就会发现“服务拆分粒度难以准确把握”根本不是本质问题。

你有几个 2 pizza 团队,最好就拆成几个微服务。举一个现实的例子:只有一个开发人员时,尽量就做单体应用,不要没事找刺激拆成 10 个微服务,最终这个开发人员还会把他合成一个。微服务要求纵向的 2 pizza 团队(无数个小团队,包含开发、测试、运维),当然我们也实施过一些传统大型企业,但团队还是处在横向结构的场景下(开发、运维、测试各是一个团队),拆分微服务让他们很痛苦,尤其是运维团队。

在这里插入图片描述

微服务的部署

从大体上来看,微服务至少需要部署在线上和测试环境。但需要注意的是,开发口中的环境和此处的环境会很容易混淆,所以我们借用 K8s 命名空间的概念,使用命名空间来防止混淆。

在线上命名空间中,我们能够保证代码都是经过 review 的、数据库都是线上数据。线上的应用版本,一般分为 prod(生产版本)、gray(灰度版本,少部分线上流量进入)、pre(预发版本,仅内部人员可用)。

在测试命名空间中,测试同学和开发同学发起流量进行测试和开发。在测试环境中,一般每个应用都部署了 stable 版本,提供一个稳定的测试环境;根据项目、开发流程的不同,相关的应用也会部署一些 project1 版本等。

另外,对于注册中心、Kubernetes 集群、消息队列等基础组件,也应当在不同的部署环境中单独部署一套。比如线上命名空间中的注册中心,和测试命名空间中的注册中心,应当分开部署,做到硬性隔离。

微服务流量灰度路由

对于不同的命名空间,不同的部署版本,我们都要考虑到流量是怎么路由的,不合理的流量轻则困扰研发、测试进度,重则导致线上事故。

线上流量

对于大部分用户和流量,都应该路由到 prod 版本上。

对于符合灰度要求(比如百分比规则、特定用户等),应该路由到 gray 版本上。

对于内部验证账号,应该路由到 pre 版本上,验证功能是否正常。

测试环境流量

对于属于项目环境中的流量,自然应该路由到对应的项目环境中。

对于不属于任何项目环境中的流量,我们将其路由到 stable 版本中。

总结

下面这张图能够反映出恰当的生产、测试部署环境下,整体微服务的部署、流量走向、环境隔离:

在这里插入图片描述

至此,我们对微服务全链路灰度有了一个全局(且粗糙)的认知,我们当然需要了解全链路灰度是如何实现的,如何让流量根据不同的特征,路由到不同的节点。这些内容就是下一篇文章要讲的 《全链路灰度原理——从三千英尺看全链路灰度》 ,敬请期待!

点击此处,前往微服务引擎官网查看更多详情~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无需数据库的笔记flatnotes

本文完成于 10 月底; 什么是 flatnotes? flatnotes 是一个自托管的、无数据库的笔记 Web 应用程序,它利用文件夹存储 Markdown 文件。 官方演示站点:https://demo.flatnotes.io/ 前言 本文介绍的软件很简单,但是有两…

保姆级教学——Python+Pygame怎么实现吃豆豆游戏

耽搁十几天的时间,我顺利的从阳转阴啦, 以后的日子一切恢复正常,好好工作,积极分享。希望在座的小伙伴阳了的全部健康转阴,没阳的全部不会变阳,新的一年,一切顺顺利利。 不知道最近大家学习得怎…

前端大屏常用的几种适配方案

方 案实现方式优点缺点vm vh1.按照设计稿的尺寸,将px按比例计算转为vw和vh1.可以动态计算图表的宽高,字体等,灵活性较高 2.当屏幕比例跟 ui 稿不一致时,不会出现两边留白情况1.每个图表都需要单独做字体、间距、位移的适配&#x…

磨金石教育摄影技能干货分享|看看大师们如何把“树”拍成艺术品

树,可以说是我们生活中最为常见的物种了。 在不同的地域,不同的气候环境下,生长着不同的树种。 北方的白桦树、杨树、梅花;南方的凤凰花、榕树、梧桐等等。 无论哪个地方的树,都有别样的姿态。 1、相机作画 白雪没有覆…

python实验实践【2】深度学习的python包

python包的管理是使用python进行实验过程中最为重要的一环,很多时候运行他人代码失败的原因是没能按照对方的要求配置python包库。本篇博客重点介绍深度学习场景中python包的管理。 目录python包版本选择python包安装python包版本选择 使用pytorch进行深度学习训练…

AndroidRN的混合集成 下载不了RN的依赖可以看看 好使

一、混合开发 App 混合开发,指的是一个 App 部分功能用 Native 构建,其他功能使用跨端框架进行构建,最常见的场景是,Native 作为一个可工程,其实业务开发使用垮端框架进行开发。目前,比较流行的跨端框架有…

ORB-SLAM3算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中,因此在tracking中没有为imu模式设置单独的初始化函数,而IMU的初始化是在localMapping中实现的。 很有用的参考链接:https://cloud.tencent.com/developer/article/1761043 1双目…

Python 基础教程(1)

1.翻转字符串 def reverseWords(input):# 通过空格将字符串分隔符,把各个单词分隔为列表inputWords input.split(" ")# 翻转字符串# 假设列表 list [1,2,3,4], # list[0]1, list[1]2 ,而 -1 表示最后一个元素 list[-1]4 ( 与 list[3]4 一样…

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST 安装LibTorch 进入pytorch官网地址,选则LibTorch版本将LibTorch安装包解压到libtorch-path目录中,libtorch-path是自定义的LibTorch安装目录。

【SpringCloud Alibaba】Sentinel持久化结合Nacos

在前面学习完Sentinel的流控规则以及Nacos时,就是最后的Sentinel持久化了。需要持久化的原因是因为每次启动Sentinel都会使之前配置的规则就清空了,这样每次都要再去设定规则显得非常的麻烦。 思路就是:将流控规则配置进Nacos服务注册中心中&…

【实时数仓】DWS层之关键词主题表(FlinkSQL)、数据可视化接口、Sugar数据大屏、总成交金额接口实现

文章目录一 DWS层-关键词主题表(FlinkSQL)1 过滤数据2 利用UDTF进行拆分(1)拆分结果(2)Join 表函数 (UDTF)(3)代码3 分组、开窗、聚合计算4 转换为流并写入ClickHouse(1)在ClickHous…

大数据网站攻击实时项目架构

随着互联网的流行,网站安全问题就日益突出,但绝大多数的网站开发与建设公司只考虑正常用户的稳定使用,而对于网站安全方面了解甚少,发现网站安全存在问题和漏洞,其修补方式只能停留在页面代码的删除或者是恢复网站备份…

SpringBoot系列之SpringBoot启动流程详解

文章目录前言一、SpringBoot流程分析-初始化二、SpringBoot流程分析-run总结前言 SpringBoot的启动流程在我们面试的时候会经常被问,接下来我们根据源码来分析了解下SpringBoot是怎么启动的 一、SpringBoot流程分析-初始化 首先对SpringBoot主启动类进行debug&…

通用企业智能制造ERP源码 制造业通用ERP系统源码 工厂ERP源码C# web ASP.NET 源码

管理控制台 一,基础档案 客户档案、 供应商档案 、外协档案 、 物料档案、 产品档案 产品BOM 、 模具档案、 工价档案 、 人员档案 二,样品开发 产品开发 样品登记 产品开发:开发编号、设计来源、系列号、中英文设计名称、最后期限、…

Nginx由浅入深

一、Nginx简介 1、Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新…

医院医疗信息管理系统源码 成熟EMR电子病历系统源码

医院医疗信息管理系统源码 成熟EMR电子病历系统源码 多家二甲医院在用,功能模块如下所示: 1.住院医生站 2.住院护士站 3.病案浏览工作站 4.质量控制工作站 5.系统维护工作站 开发环境 :VS2010 C# ORACLE 系统简介: 1各种记…

漏洞发现之操作系统

漏洞发现之操作系统1.系统漏洞1.1.系统漏洞介绍1.2.系统漏洞危害1.3.系统漏洞防范2.名词介绍2.1.CVSS2.2.CVE2.3.POC/EXP3.探针3.1.探针介绍3.2.探针工具介绍3.3.Goby3.3.1.Goby介绍3.3.2.下载地址3.3.3.Goby使用3.3.3.1.切换中英文3.3.3.2.建立扫描任务3.3.3.3.资产内容3.3.3.…

深入理解 FilterChainProxy【源码篇】

目录FilterChainProxy源码分析FilterChainProxy 源码-全局属性doFilter 方法doFilterInternal 方法VirtualFilterChain最后RequestRejectedHandler引用FilterChainProxy 在一个 Web 项目中,请求流程大概如下图所示: 请求从客户端发起(例如浏…

TechG年度科技行业盛会来袭,深兰科技展台亮点抢先看!

2022年12月29日——31日,科技行业盛会「上海国际消费电子技术展(TechG)将在南京举办,深兰科技机器人产业集团将携人工智能机器人产品“家族”亮相展会,全面展示先进的人工智能机器人技术,呈现安全、高效、新潮的机器人应用场景。 …

D. Lucky Chains edu139 div2

Problem - D - Codeforces 题意是给你a和b,要求__gcd(ak,bk)1的k最多可以增加多少个1 分析: 遇到这种的最大公约数的问题,有很大概率都是推公式,以及使用筛法去把所有的质数筛出来利用质因子去缩短时间 这题就是一个推公式的题…