1 关于云原生

云原生计算基金会(Cloud Native Computing Foundation, CNCF)的官方描述是:

云原生是一类技术的统称,通过云原生技术,我们可以构建出更易于弹性扩展、极具分布式优势的应用程序。这些应用可以被运行在不同的环境当中,比如说 私有云、公有云、混合云、还有多云场景。云原生包含了 容器、微服务(涵盖服务网格)、Serverless、DevOps,API管理、不可变基础架构等能力。通过云原生技术构建出来的应用程序,对

底层基础架构的耦合很低,易于迁移,可以充分地利用云所提供的能力,因此云原生应用的研发、部署、管理相对于传统的应用程序更加高效和便捷。

1.1 微服务

微服务是一种架构模式,是面向服务的体系结构(SOA)软件架构模式的一种演变,

它提倡将单一应用程序划分成一组松散耦合的细粒度小型服务,辅助轻量级的协议,互相协调、互相配合,为用户提供最终价值。

具有 单一职责、轻量级通信、独立性、进程隔离、混合技术栈和混合部署方式、简化治理 等特点。

1.2 DevOps

DevOps 作为一种工程模式,本质上是通过对开发、运维、测试,配管等角色职责的分工,实现工程效率最大化,进而满足业务的需求。

1.3 持续交付

在不影响用户使用服务的前提下频繁把新功能发布给用户使用,要做到这点比较难。需要强大的流量管理能力,动态的服务扩缩容为平滑发布、ABTesting提供保障。

1.4 容器化

容器化的好处在于运维的时候不需要再关心每个服务所使用的技术栈了,每个服务都被无差别地封装在容器里,可以被无差别地管理和维护,现在比较流行的技术是docker和k8s。

2 关于ServiceMesh

2.1 什么是ServiceMesh

ServiceMesh 是最新一代的微服务架构,作为一个基础设施层,能够与业务解耦,主要解决复杂网络拓扑下微服务与微服务之间的通信,其实现形态一般为轻量级网络代理,并与应用SideCar部署,同时对业务应用透明。



如果从一个单独链路调用可以得到以下的结构图:



如果我们从一个全局视角来看,绿色的为应用服务,蓝色的为SideCar,就会得到如下部署图:

2.2 相较传统微服务的区别

以SpringCloud与Dubbo为代表的微服务开发框架非常受欢迎。但我们发现,他有优秀的服务治理能力,也有明显的痛点:

1. 侵入性强。 想要集成SDK的能力,除了需要添加相关依赖,业务层中入侵的代码、注解、配置,与治理层界限不清晰。可以想想Dubbo、SpringCloud 等的做法

2. 升级成本高。 每次升级都需要业务应用修改SDK版本,重新进行功能回归测试,并对每一台服务进行部署上线,与快速迭代开发相悖。

3. 版本碎片化严重。 由于升级成本高,而中间件版本更新快,导致线上不同服务引用的SDK版本不统一、能力参差不齐,造成很难统一治理。

4. 中间件演变困难。 由于版本碎片化严重,导致中间件向前演进的过程中就需要在代码中兼容各种各样的老版本逻辑,带着"枷锁”前行,无法实现快速迭代。

5. 内容多、门槛高。 依赖组件多,学习成本高。

6. 治理功能不全。 不同于RPC框架,SpringCloud作为治理全家桶的典型,也不是万能的,诸如协议转换支持、多重授权机制、动态请求路由、故障注入、灰度发布等高级功能并没有覆盖到。

2.3 ServiceMesh的价值 — 赋能基础架构

  1. 统一解决多语言框架问题,降低开发成本
  2. 降低测试成本,提升质量
  3. 控制逻辑集中到控制面
  4. 为新架构演进提供支持,如Serverless
  5. 网格半覆盖 转 统一覆盖(弥补service-center并逐渐过度)
  6. 完整的闭环微服务统筹和管理能力

2.4 ServiceMesh的价值 — 赋能业务

  • 框架与业务解耦,减少业务限制。
  • 简化服务所依赖SDK版本管理。
  • 依托热升级能力,版本召回周期短。
  • SDK瘦身,减少业务依赖冲突。
  • 丰富的流量治理、安全策略、分布式Trace、日志监控,下沉服务治理底座,让业务专注业务。

3 ServiceMesh 核心能力

3.1 流量治理

微服务应用最大的痛点就是处理服务间的通信,而这一问题的核心其实就是流量管理。

3.1.1 请求路由

将请求路由到服务的版本,应用根据 HTTP 请求 header 的值、Uri的值 路由流量到不同的地方。匹配规则可以是流量端口、header字段、URI等内容。

RuleMatch参考

3.1.2 流量转移

当微服务的一个版本逐步迁移到另一个版本时,我们可以将流量从旧版本迁移到新版本。如下图,使用weight参数进行权重分配,

这个很典型的应用场景就是灰度发布或者ABTesting。

3.1.3 负载均衡

同3.1.2的图,Service B 有多个实例,所以可以另外制定负载均衡策略。

负载均衡策略支持简单的负载策略(ROUND_ROBIN、LEAST_CONN、RANDOM、PASSTHROUGH)、一致性 Hash 策略和区域性负载均衡策略。

3.1.4 超时

对上游的请求设置,设置一个一定时长(0.5s)的超时,请求超过这个时间不响应,可以直接fallback。目标还是过载保护。

3.1.5 重试

当请求在固定的时间内没有返回正确值的时候,可以配置重试次数。设置如果服务在 1 秒内没有返回正确的返回值,就进行重试,重试的条件为返回码为5xx,重试 3 次。

分布式环境下,重试是高可用的重要技术,重试方案慎用。

retries:
attempts: 3
perTryTimeout: 1s
retryOn: 5xx

3.1.6 熔断/限流/降级

熔断的策略比较多,可以配置 最大连接数、连接超时时间、最大请求数、请求重试次数、请求超时时间等,我们都可以给他熔断掉,fallback回去。

但是目前看,Istio 对更灵活、更细粒度的限流、降级等能力支持的还不够好,合理应该有漏斗池算法(如阿里开源限流框架Sentinel)或者令牌桶算法(如 Google Guava 提供的限流工具类 RateLimiter)这样的灵活做法。

但是可以采用其他方式处理,比如可以通过流量转发将部分流量流动到默认服务去,该服务启用默认的fallback,但是需要控制好采样时间、熔断半开的策略。

3.1.7 离群检测(Outlier Detection)

当集群中的服务故障的时候,其实我们最优先的做法是先进行离群,然后再检查问题,处理问题并恢复故障。所以,能否快速的离群对系统的可用性很重要。

Outlier Detection 允许你对上游的服务进行扫描,然后根据你设置的参数来判断是否对服务进行离群。

下面的配置表示每秒钟扫描一次上游主机,连续失败 2 次返回 5xx 错误码的所有主机会被移出负载均衡连接池 3 分钟,上游被离群的主机在集群中占比不应该超过10%。

但无论比例多少,只要你集群下的服务实例>=2个,都将弹出至少1个主机。它有很详细的配置,参考这边

注意:3分钟之后回群,如果再被离群,则为上次离群时间+本次离群时间,即 3+3;默认超过50%(可调整比例)被离群,进入恐慌模式。

outlierDetection:
consecutiveErrors: 2
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 10

3.1.8 故障注入

就是用来模拟上游服务对请求返回指定异常码时,当前的服务是否具备处理能力。系统上线前,可以配置注入的httpStatus和比例,来验证下游服务对故障的处理能力。

3.1.9 流量镜像(Mirroring)

这个也叫做影子流量。是指通过一定的配置将线上的真实流量复制一份到镜像服务中去,可以设置流量比例,只转发不响应。

个人觉得这个还是比较有用的,好处是 完整的线上正式环境模拟、流量分析、压力测试;全真的线上问题再现,方便问题排查。

3.2 可观察性

3.2.1 监控与可视化

Prometheus(标配,默认抓取指标数据)、kiali监控(服务视图,Istion链路的可观察性) 、Grafana(BI报表)(数据面、控制面、xDS Service 各健康指标)

后续章节会逐一展开...

3.2.2 访问日志

ELK、EFK (Envoy记录AccessLog,包含SideCard的InBound、OutBound记录)

后续章节会详细展开...

3.2.3 分布式追踪

本质上查找多个HTTP请求之间的相关性的一种方法是使用相关性ID。该ID应该传递给所有请求,以便跟踪平台知道哪些请求属于同一请求。如下图:



尽管Istio利用Envoy的分布式跟踪功能提供开箱即用的跟踪集成,但是其实这是一个误解,我们的应用程序需要做一些工作。应用程序需要传播以下header:

  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • x-ot-span-context



Istio Sidecar内的Envoy代理接收这些标头,并将它们传递给配置的tracing系统。所以实际上,Istio中服务追踪默认只会追踪到2级,

例如A -> B -> C, 在Istio中会出现2条追踪链路:A -> B 和B -> C,而不会出现我们期望的A -> B -> C的形式,如果想要服务串联起来,需要对服务间调用进行改造,

在Istio中应用程序通过传播http header来将span关联到同一个trace。

3.3 安全机制

  • Service Mesh可以在服务间通信中引入双向TLS加密,确保数据在传输过程中不被篡改和窃听。控制平面负责管理和分发证书,Sidecar Proxy在通信过程中进行加密和解密操作。
  • 通过引入身份认证和访问控制策略,可以细粒度地控制哪些服务可以访问其他服务。

3.4 策略执行

Service Mesh通过在每个服务实例旁边部署Sidecar Proxy,实现了对服务间通信的透明代理。这些代理负责拦截出入的所有流量,并根据控制平面下发的配置和策略执行相应的操作。具体工作原理如下:

3.4.1 服务发现:

当一个服务实例启动时,它会向服务注册中心注册自己的信息。控制平面负责管理这些服务实例信息,并将更新的服务列表分发给所有Sidecar Proxy。

3.4.2 流量管理:

当一个服务需要与另一个服务通信时,流量首先经过本地的Sidecar Proxy。代理根据配置的路由规则和负载均衡策略,将流量转发到目标服务实例。

控制平面可以动态更新这些路由规则,实现蓝绿部署、金丝雀发布等高级流量管理功能。

3.4.3 安全认证:

Service Mesh可以在服务间通信中引入双向TLS加密,确保数据在传输过程中不被篡改和窃听。控制平面负责管理和分发证书,Sidecar Proxy在通信过程中进行加密和解密操作。

通过引入身份认证和访问控制策略,可以细粒度地控制哪些服务可以访问其他服务。

3.4.4 可观察性:

Service Mesh中的代理会收集每个请求的日志、监控数据和追踪信息,并将这些数据发送到可观察性组件进行处理和存储。

运维人员可以通过控制平面提供的接口和仪表盘,实时监控服务间的流量情况、延迟、错误率等指标,并进行故障排查和性能优化。

4 总结

Service Mesh相比传统微服务框架以下几方面有明显优势:

  • 解耦应用程序和通信逻辑
  • 提供增强的服务治理能力
  • 提高可观察性和可调试性
  • 支持多语言和协议以
  • 提高系统可靠性和可扩展性

ServiceMesh 1:大火的云原生微服务网格,究竟好在哪里?的更多相关文章

  1. .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  2. NodeJS 基于 Dapr 构建云原生微服务应用,从 0 到 1 快速上手指南

    Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架.Dapr 确保开发人员专注 ...

  3. Solon 1.8.0 发布,云原生微服务开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  4. Solon 1.8.3 发布,云原生微服务开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  5. 基于云原生DevOps服务自动化部署前端项目学习总结

    本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...

  6. 【连载】微服务网格Istio(一)

    Istio基础 服务网格是用于描述构成应用程序的微服务网络以及应用之间的交互,服务网格的功能包括服务发现.负载均衡.故障恢复.指标和监控以及更加复杂的运维工作,例如A/B测试.金丝雀发布.限流.访问控 ...

  7. 基于华为云CSE微服务接口兼容常见问题

    微服务接口兼容常见问题 在进行微服务持续迭代开发的过程中,由于新特性在不停的加入,一些过时的特性在不停的修改,接口兼容问题面临巨大的挑战,特别是在运行环境多版本共存(灰度发布)的情况下.本章节主要描述 ...

  8. Java微服务 vs Go微服务,究竟谁更强!?

    前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...

  9. 云图说丨初识华为云微服务引擎CSE

    摘要:微服务引擎(Cloud Service Engine,CSE),是用于微服务应用的云中间件,为用户提供注册发现.服务治理.配置管理等高性能和高韧性的企业级云服务能力 本文分享自华为云社区< ...

  10. 腾讯 Techo 开发者大会首发来袭!云原生中间件技术实践等你来!

    腾讯 Techo 开发者大会是由腾讯云发起的面向全球开发者和技术爱好者的年度盛会,2019 年 11 月 6 日 - 7 日将在北京嘉里大酒店首次召开. 作为一个专注于前沿技术研讨的非商业大会,Tec ...

随机推荐

  1. ArchSummit回顾:从云原生到实时数据湖,架构如何支撑业务发展

    [点击了解更多网易热点] 数字化.自动化.智能化的主旋律下,架构的进化也在提速.在近日举办的ArchSummit全球架构师峰会上,网易数帆高级技术专家.资深架构师裴斐和网易数帆高级技术专家周劲松分别分 ...

  2. [rCore学习笔记 04]安装SSH

    因为每一个老嵌入式都喜欢使用他的老windows进行开发,因此我决定使用SSH来开发rust,这样也不用在虚拟机里边再装一个vscode. 参考博客 如何在windows下使用vscode连接linu ...

  3. RestSharp编写api接口测试,并实现异步调用(不卡顿)

    首先,确保你已经安装了RestSharp NuGet包.如果没有安装,可以通过以下命令安装: bash Install-Package RestSharp 然后,在你的C#代码中,你可以按照以下步骤操 ...

  4. 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

    引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...

  5. 【.bat】IISExpress配置通过IP访问程序

    本页只记录便携运行方式脚本 详细IISExpress配置方法请看: VS的IISExpress配置通过IP访问程序 网络信息:192.168.1.45:8378 Run.bat :: run as a ...

  6. 一款基于Fluent设计风格、现代化的WPF UI控件库

    前言 今天大姚给大家分享一款基于Fluent设计风格.开源(MIT License).现代化的WPF UI控件库,它提供直观的设计.主题.导航和全新的沉浸式控件,全部都是原生且无缝地集成在一起:WPF ...

  7. 【JavaScript】文件上传下载问题

    问题原因 一般文件上传前端甚至可以不涉及JS来实现 input标签套在form标签,由form标签直接发送请求就可以实现上传功能 但是现在很多项目都使用前后端分离,AJAX一刀切所有. input标签 ...

  8. 某宝上搞来的电子书,经典的量化投资书籍,《Advances in Financial Machine Learning》—— 《金融机器学习的进展》、《量化投资与机器学习》、《金融机器学习研究进展》

    英文书名: <Advances in Financial Machine Learning> 经典的量化投资书籍,某宝上6元搞来的电子版:

  9. conda环境下Python报错:raise MissingCUDAException("CUDA_HOME does not exist, unable to compile CUDA op(s)") CUDA_HOME does not exist, unable to compile CUDA op(s)

    conda环境下Python报错: (pytorch) devil@Monster:~$ pip install deepspeed Collecting deepspeed Using cached ...

  10. 使用 Apache DolphinScheduler 进行 EMR 任务调度

    By AWS Team 前言 随着企业规模的扩大,业务数据的激增,我们会使用 Hadoop/Spark 框架来处理大量数据的 ETL/聚合分析作业,⽽这些作业将需要由统一的作业调度平台去定时调度. 在 ...