最近在准备面试,发现服务网格,也就是Service Mesh,是现在云原生领域,很热门的话题,也是面试中,经常被问到的问题。尤其是,Istio、Linkerd、Consul,这三个主流的服务网格,它们的区别,各自的优缺点,适用场景,更是面试中的高频考点。

今天这篇文章,就来整理一下,服务网格对比的面试题,聊聊什么是服务网格,为什么需要服务网格,以及,Istio、Linkerd、Consul,这三个主流服务网格的对比,还有,一些常见的面试题,和参考答案。

一、基础概念面试题

先从基础概念开始,这些是面试中,最常被问到的基础问题。

面试题1:什么是服务网格(Service Mesh)?

参考答案:

服务网格,是一个,专门用于处理服务间通信的,基础设施层,它的核心,是,在服务之间,实现可靠的,快速的,安全的通信。

服务网格,通常,是由,一组,和应用服务,一起部署的,轻量级网络代理,也就是,Sidecar,和,一组,管理这些代理的,控制平面,组成的。代理,负责,处理服务之间的,所有网络通信,包括,服务发现,负载均衡,熔断,限流,重试,超时,安全认证,可观测性,等等。控制平面,负责,管理和配置,所有的代理,把策略,下发给代理,让代理,按照策略,来执行。

简单来说,服务网格,就是,把服务间通信的,这些通用功能,从应用代码中,抽离出来,放到,基础设施层,由服务网格,来统一处理,这样,应用开发者,就不用,再关心,这些通用的,通信相关的功能,可以,专注于,业务逻辑的开发。

服务网格,这个概念,最早,是由,Buoyant公司的CEO,William Morgan,在2016年,提出的,他也是,Linkerd的创始人。后来,随着,微服务和云原生的发展,服务网格,越来越受到关注,成为了,云原生技术栈中,重要的一环。

面试题2:为什么需要服务网格?它解决了什么问题?

参考答案:

随着,微服务架构的普及,一个应用,会被拆分成,很多个,小的服务,这些服务之间,需要,互相调用,才能,完成业务功能。当服务的数量,越来越多,服务之间的,调用关系,越来越复杂,就会,出现很多问题,比如:

  1. 服务发现:服务的数量很多,地址,经常变化,怎么,动态地,发现服务,调用服务,是一个问题。
  2. 负载均衡:同一个服务,有多个实例,怎么,在多个实例之间,做负载均衡,怎么,处理实例的,上下线,健康检查,是一个问题。
  3. 熔断和限流:当某个服务,出现故障,或者,流量太大,怎么,熔断,怎么限流,防止,故障扩散,防止,系统被打垮,是一个问题。
  4. 重试和超时:网络,是不可靠的,调用,可能会失败,怎么,重试,怎么,设置超时,保证,调用的可靠性,是一个问题。
  5. 安全认证:服务之间的调用,怎么,认证,怎么,授权,怎么,加密,保证,通信的安全,是一个问题。
  6. 可观测性:服务很多,调用关系复杂,怎么,监控,怎么,追踪,怎么,日志,怎么,排查问题,是一个问题。

这些问题,在微服务架构中,是普遍存在的,也是,必须解决的。

传统的解决方案,是,在应用代码中,引入,各种SDK,或者,库,来处理这些问题,比如,用,Netflix的OSS,包括,Eureka,Ribbon,Hystrix,等等,来处理,服务发现,负载均衡,熔断,等等。

但是,这种方案,有很多问题:

  1. 和语言绑定:SDK,通常,是针对,特定的语言,比如,Java,其他语言,比如,Go,Python,Node.js,就用不了,或者,需要,重新实现,很麻烦。
  2. 侵入性强:SDK,需要,集成到应用代码中,和业务代码,耦合在一起,升级,维护,都很麻烦,而且,不同的服务,可能,用的SDK版本,不一样,很难统一管理。
  3. 重复开发:每个服务,都要,集成这些SDK,都要,处理这些通用的功能,重复开发,浪费精力。
  4. 治理困难:这些功能,都在应用代码里,很难,统一治理,统一配置,统一监控,出了问题,也很难排查。

服务网格,就是,为了解决这些问题,而出现的。它把,这些通用的,通信相关的功能,从应用代码中,抽离出来,放到,Sidecar代理里,由,服务网格,来统一处理,统一治理。

这样,应用代码,就不用,再关心,这些通用的功能,可以,专注于,业务逻辑,而且,服务网格,是,语言无关的,不管,你的服务,是用什么语言写的,都能,使用服务网格的,所有功能,也不用,集成任何SDK,没有侵入性。

而且,服务网格,有统一的控制平面,可以,统一配置,统一治理,统一监控,所有的服务,都能,按照统一的策略,来执行,出了问题,也能,通过,统一的监控和追踪,快速排查。

所以,服务网格,解决了,微服务架构中,服务间通信的,各种通用问题,让,微服务的治理,变得,更简单,更统一,更可靠。

面试题3:服务网格的核心组件有哪些?Sidecar和控制平面,分别是什么?

参考答案:

服务网格,通常,分为,两个部分,数据平面(Data Plane),和,控制平面(Control Plane)。

数据平面,就是,由,一组,Sidecar代理,组成的。每个应用服务,旁边,都会,部署一个,Sidecar代理,这个代理,会,拦截,这个服务的,所有入站和出站的,网络流量,然后,按照,控制平面,下发的策略,来处理这些流量,包括,服务发现,负载均衡,熔断,限流,重试,超时,安全认证,可观测性,等等。

Sidecar,这个词,意思是,摩托车的边三轮,就是,在摩托车旁边,加一个,小斗,用来,载人,或者,装东西。在服务网格里,Sidecar代理,就像,这个边三轮,和应用服务,一起部署,一起运行,但是,又,独立于应用服务,不影响应用服务的代码。

常见的Sidecar代理,有,Envoy,Linkerd2的代理,Nginx,等等,其中,Envoy,是现在,最流行的,高性能的,可编程的,网络代理,很多服务网格,包括,Istio,都是,用Envoy,作为Sidecar代理。

控制平面,就是,用来,管理和配置,所有Sidecar代理的,一组组件。控制平面,不直接,处理网络流量,而是,负责,把,用户配置的,策略,规则,转换成,Sidecar代理,能理解的,配置,然后,下发给,所有的Sidecar代理,让它们,按照配置,来执行。

控制平面,通常,包括,这些组件:

  1. 服务发现组件:负责,管理,所有服务的,实例信息,地址,端口,健康状态,等等,让Sidecar代理,能,动态地,发现服务。
  2. 配置管理组件:负责,管理,用户配置的,各种策略,规则,比如,路由规则,熔断规则,限流规则,安全规则,等等。
  3. 证书管理组件:负责,管理,服务之间,通信的,证书,密钥,实现,自动的,mTLS,双向认证,保证,通信的安全。
  4. 可观测性组件:负责,收集,所有Sidecar代理的,指标,日志,追踪数据,然后,提供,统一的,监控,查询,可视化的能力。

控制平面,和数据平面,是,分开的,控制平面,只负责,管理和配置,不处理流量,数据平面,也就是Sidecar代理,负责,处理所有的流量,这样,架构,更清晰,更可靠,也更容易,扩展和维护。

二、三大服务网格对比

接下来,是核心部分,Istio、Linkerd、Consul,这三个主流服务网格的对比,这也是面试中,最常被问到的。

面试题4:简单介绍一下Istio?它的架构和特点是什么?

参考答案:

Istio,是现在,最流行,功能最丰富的,服务网格,是由,Google、IBM、Lyft,三家公司,联合开发的,开源项目,2017年,发布了第一个版本,现在,已经,非常成熟,社区,也很活跃,是,服务网格领域,事实上的标准。

Istio的架构,也是,分为,控制平面,和,数据平面。

数据平面,Istio,用的是,Envoy,作为Sidecar代理,Envoy,是Lyft公司,开源的,高性能的,可编程的,网络代理,用C++写的,性能很好,功能很丰富,支持,很多高级的,网络功能,Istio,把Envoy,作为Sidecar,注入到,每个服务的Pod里,拦截,所有的入站和出站流量。

控制平面,Istio的控制平面,在1.5版本之前,是,由,多个组件,组成的,包括,Pilot,Mixer,Citadel,Galley,等等,每个组件,负责,不同的功能。在1.5版本之后,Istio,把这些组件,合并成了,一个,单体的,二进制,叫做,istiod,简化了,架构,也简化了,部署和维护。

istiod,主要,负责,这些功能:

  1. 流量管理:通过,Pilot组件,负责,服务发现,路由配置,负载均衡,熔断,限流,重试,超时,等等,把这些配置,转换成,Envoy能理解的,xDS协议,下发给,所有的Envoy代理。
  2. 安全:通过,Citadel组件,负责,证书和密钥的管理,自动的,为每个服务,签发证书,实现,服务之间的,mTLS,双向认证,保证,通信的安全,也支持,基于角色的,访问控制,RBAC。
  3. 可观测性:通过,Mixer组件,负责,收集,所有Envoy代理的,指标,日志,追踪数据,然后,对接,Prometheus,Grafana,Jaeger,Zipkin,等等,提供,统一的,监控,查询,可视化的能力。

Istio的特点,主要有:

  1. 功能最丰富:Istio,是所有服务网格中,功能最丰富的,支持,几乎所有的,服务网格的功能,包括,高级的,流量管理,比如,灰度发布,A/B测试,流量镜像,故障注入,等等,也支持,强大的,安全策略,和,可观测性。
  2. 社区最活跃:Istio,有Google、IBM、Lyft,这些大公司,背书,社区,非常活跃,贡献者很多,版本迭代很快,文档,也很完善,生态,也很丰富。
  3. 和Kubernetes深度集成:Istio,最初,就是,为Kubernetes设计的,和Kubernetes,深度集成,部署,很简单,通过,自动注入,就能,把Sidecar,注入到,Pod里,不用,修改应用代码。
  4. 多平台支持:虽然,Istio,和Kubernetes深度集成,但是,它也支持,非Kubernetes的环境,比如,虚拟机,裸金属服务器,甚至,其他的容器编排平台,能,实现,跨平台的,服务网格。
  5. 性能开销较大:因为,Istio的功能,很丰富,所以,它的,性能开销,也比较大,Sidecar代理,占用的,CPU和内存,比较多,而且,控制平面,也比较重,部署和维护,相对复杂。
  6. 学习曲线陡峭:Istio的功能,很多,概念,也很多,配置,也比较复杂,学习起来,有一定的难度,需要,花时间,去理解,它的架构,和,各种配置。

总的来说,Istio,适合,功能需求多,团队,有一定的,技术能力,能,驾驭它的,复杂度的,中大型企业,或者,对,服务网格的,功能,要求很高的场景。

面试题5:简单介绍一下Linkerd?它的架构和特点是什么?

参考答案:

Linkerd,是,世界上,第一个,服务网格,是由,Buoyant公司,在2016年,开源的,也是,服务网格这个概念的,提出者。Linkerd,现在,有两个大版本,Linkerd 1.x,和,Linkerd 2.x,现在,主流的,是Linkerd 2.x,也就是,Linkerd2,它是,完全重写的,和1.x,架构完全不同。

Linkerd2,也是,CNCF,云原生计算基金会的,毕业项目,和Kubernetes、Prometheus、Envoy等,一样,是,CNCF的,顶级项目,说明,它的成熟度,和,社区的认可度,都很高。

Linkerd2的架构,也是,分为,控制平面,和,数据平面。

数据平面,Linkerd2,没有,用Envoy,作为Sidecar代理,而是,自己,用Rust语言,开发了,一个,轻量级的,高性能的,代理,叫做,linkerd2-proxy,这个代理,是,专门为,服务网格,设计的,很轻量,性能很好,占用的资源,很少。每个服务,旁边,都会,部署一个,这个代理,作为Sidecar,拦截,所有的入站和出站流量。

控制平面,Linkerd2的控制平面,是,用Go语言写的,由,多个组件,组成的,包括:

  1. Controller:负责,整体的,控制逻辑,管理,所有的代理,和,配置。
  2. Destination:负责,服务发现,告诉代理,目标服务的,地址,和,相关的策略。
  3. Identity:负责,证书和密钥的管理,自动的,为每个服务,签发证书,实现,mTLS,双向认证。
  4. Proxy Injector:负责,自动的,把Sidecar代理,注入到,Kubernetes的Pod里,不用,手动修改。
  5. Tap:负责,实时的,查看,服务之间的,调用情况,流量情况,方便,调试和排查问题。
  6. Web:提供,一个,简单的,Web界面,用来,查看,服务网格的,状态,和,指标。

Linkerd2的特点,主要有:

  1. 轻量级,性能好:Linkerd2,最大的特点,就是,轻量级,它的Sidecar代理,用Rust写的,非常轻量,占用的CPU和内存,很少,比Envoy,小很多,而且,控制平面,也很轻量,部署,很简单,资源开销,很小。
  2. 简单易用,学习曲线平缓:Linkerd2,的设计理念,就是,简单,易用,它的,功能,没有Istio那么多,但是,核心的功能,都有,而且,配置,很简单,概念,也不多,学习起来,很容易,上手很快。
  3. 默认安全:Linkerd2,默认,就开启了,mTLS,双向认证,服务之间的通信,默认,就是,加密的,安全的,不用,额外的配置,这一点,比Istio,更方便,Istio,默认,是,不开启mTLS的,需要,手动配置。
  4. 可观测性好:Linkerd2,自带了,很好的,可观测性,默认,就收集了,服务之间的,调用指标,成功率,延迟,流量,等等,而且,自带了,一个,简单的Web界面,能,直观地,看到,所有服务的,状态,和,调用关系,不用,额外部署,Prometheus、Grafana,当然,也能,对接这些工具。
  5. 专注Kubernetes:Linkerd2,主要,是,为Kubernetes设计的,和Kubernetes,深度集成,部署,很简单,但是,它,对,非Kubernetes的环境,支持,不如Istio,基本上,只能,在Kubernetes上用。
  6. 功能相对较少:Linkerd2,的功能,没有Istio那么丰富,一些高级的功能,比如,复杂的,路由规则,流量镜像,故障注入,等等,支持得,不如Istio,或者,需要,通过,其他的方式,来实现。
  7. 社区相对较小:Linkerd2,的社区,虽然,也很活跃,但是,和Istio比,还是,小一些,贡献者,少一些,版本迭代,也慢一些,生态,也不如Istio丰富。

总的来说,Linkerd2,适合,想要,简单,轻量,易用的,服务网格,不需要,太复杂的功能,团队,不想,花太多时间,去研究,复杂的配置,的,中小型企业,或者,刚开始,接触服务网格的团队。

面试题6:简单介绍一下Consul?它的架构和特点是什么?

参考答案:

Consul,是,HashiCorp公司,开源的,一个,服务网格,和,服务发现,的工具,HashiCorp,是,一家,很有名的,基础设施软件公司,他们,还开源了,Terraform,Vault,Nomad,Packer,等等,很多,很有名的,基础设施工具。

Consul,最初,是,一个,服务发现,和,配置管理的工具,后来,在1.2版本之后,加入了,服务网格的功能,叫做,Consul Connect,通过,Sidecar代理,来实现,服务间的,安全通信,和,流量管理,所以,现在,Consul,也是,一个,完整的,服务网格。

Consul的架构,也是,分为,控制平面,和,数据平面。

数据平面,Consul,支持,多种Sidecar代理,默认,用的是,Envoy,作为Sidecar代理,和Istio一样,也支持,其他的代理,比如,内置的代理,或者,自己开发的代理。每个服务,旁边,都会,部署一个,代理,作为Sidecar,拦截,所有的入站和出站流量。

控制平面,Consul的控制平面,是,由,Consul Server,和,Consul Agent,组成的。

  1. Consul Server:负责,存储,所有的,服务信息,配置信息,状态信息,负责,服务发现,健康检查,配置管理,安全策略,等等,是,Consul的,核心组件。Consul Server,通常,部署,3到5个,组成,一个集群,通过,Raft协议,选举,一个Leader,来保证,数据的一致性,和,高可用。
  2. Consul Agent:部署在,每个节点上,负责,和,本机的服务,交互,注册服务,健康检查,转发,服务发现的请求,到,Consul Server,也负责,管理,本机的Sidecar代理,把,配置,下发给代理。

Consul的特点,主要有:

  1. 多平台支持,跨云,跨环境:Consul,最大的特点,就是,多平台支持,它,不依赖,Kubernetes,能,在,任何环境,运行,包括,虚拟机,裸金属服务器,容器,Kubernetes,甚至,混合云,多云,都能,用,而且,能,实现,跨环境的,服务发现,和,服务网格,这一点,比Istio和Linkerd,都强,Istio和Linkerd,主要,是,为Kubernetes设计的。
  2. 服务发现,是核心优势:Consul,最初,就是,做服务发现的,所以,它的,服务发现功能,非常强大,非常成熟,支持,多种,服务注册的方式,支持,多种,健康检查的方式,支持,多数据中心,能,实现,跨数据中心的,服务发现,这是,它的,核心优势。
  3. 和HashiCorp生态集成:Consul,和,HashiCorp的,其他工具,比如,Terraform,Vault,Nomad,等等,集成得,很好,如果你,已经在用,HashiCorp的,其他工具,那么,用Consul,会,很方便,很顺畅。
  4. 企业版支持:Consul,有,开源版,和,企业版,企业版,提供了,更多的,高级功能,比如,更高级的,安全策略,审计日志,技术支持,等等,适合,对,企业级功能,有需求的,大型企业。
  5. 服务网格功能,相对较新:Consul的,服务网格功能,也就是,Consul Connect,是,后来,才加入的,相对,较新,功能,不如Istio丰富,也不如Istio成熟,一些高级的,流量管理功能,支持得,不如Istio。
  6. Kubernetes集成,不如Istio和Linkerd:虽然,Consul,也支持,Kubernetes,也能,在Kubernetes上,部署,但是,它和Kubernetes的,集成度,不如Istio和Linkerd,毕竟,它,不是,专门为Kubernetes设计的,一些,Kubernetes原生的,功能,支持得,不如Istio和Linkerd。
  7. 学习曲线,中等:Consul的,学习曲线,介于,Istio和Linkerd之间,比Linkerd,难一些,比Istio,简单一些,它的,概念,和,配置,也不少,但是,没有Istio那么复杂。

总的来说,Consul,适合,有多平台,跨云,跨环境,需求的,企业,尤其是,已经在用,HashiCorp生态的,工具的,企业,或者,对,服务发现,有很强需求的,场景。

面试题7:Istio、Linkerd、Consul,三者的核心区别是什么?怎么选型?

参考答案:

这是,面试中,最常被问到的,核心问题,三者的核心区别,主要,体现在,这几个方面:

1. 设计理念不同

  • Istio:设计理念,是,功能全面,强大,灵活,想要,成为,服务网格的,万能解决方案,支持,几乎所有的,功能,和,场景,但是,也因此,比较重,比较复杂。
  • Linkerd:设计理念,是,简单,轻量,易用,专注于,核心的,服务网格功能,把,核心功能,做到,极致的简单,和,好用,不追求,大而全,但是,也因此,功能,相对较少。
  • Consul:设计理念,是,多平台,跨环境,通用的,服务发现,和,服务网格,不绑定,Kubernetes,能,在任何环境,运行,而且,服务发现,是它的,核心优势。

2. 架构和性能不同

  • Istio:数据平面,用Envoy,功能强,但是,比较重,资源开销,较大;控制平面,istiod,也比较重,部署和维护,相对复杂。
  • Linkerd:数据平面,用自己开发的,Rust代理,非常轻量,资源开销,很小,性能很好;控制平面,也很轻量,部署简单,维护方便。
  • Consul:数据平面,默认用Envoy,和Istio类似,资源开销,中等;控制平面,Consul Server集群,架构,比较成熟,高可用,做得很好。

3. 功能丰富度不同

  • Istio:功能,最丰富,支持,高级的,流量管理,比如,灰度发布,A/B测试,流量镜像,故障注入,复杂的路由规则,等等,也支持,强大的,安全策略,和,可观测性,是,三者中,功能最强的。
  • Linkerd:功能,相对较少,核心的,服务发现,负载均衡,熔断,重试,超时,mTLS,可观测性,都有,但是,一些高级的,流量管理功能,支持得,不如Istio,或者,需要,其他方式实现。
  • Consul:功能,介于,两者之间,服务发现,是它的强项,服务网格的,核心功能,也都有,但是,高级的,流量管理功能,不如Istio丰富,而且,相对较新。

4. 平台支持不同

  • Istio:主要,为Kubernetes设计,和Kubernetes深度集成,但是,也支持,非Kubernetes环境,比如,虚拟机,能,实现,跨平台的,服务网格。
  • Linkerd:主要,为Kubernetes设计,和Kubernetes深度集成,对,非Kubernetes环境,支持,很有限,基本上,只能,在Kubernetes上用。
  • Consul:不依赖,Kubernetes,能,在任何环境,运行,包括,虚拟机,裸金属,容器,Kubernetes,混合云,多云,而且,跨环境的,服务发现,和,服务网格,做得,最好。

5. 社区和生态不同

  • Istio:社区,最活跃,有Google、IBM、Lyft,背书,贡献者最多,版本迭代最快,文档最完善,生态最丰富,是,服务网格领域,事实上的标准。
  • Linkerd:社区,也很活跃,是CNCF毕业项目,但是,和Istio比,社区,小一些,贡献者少一些,生态,也不如Istio丰富。
  • Consul:社区,也很活跃,有HashiCorp背书,但是,主要,集中在,服务发现,和,基础设施领域,服务网格的,社区,和生态,不如Istio。

怎么选型?

选型的时候,主要,根据,自己的,需求,和,场景,来决定:

  • 如果,你需要,功能丰富,强大的,服务网格,团队,有技术能力,能驾驭复杂度,主要,在Kubernetes上,或者,有跨平台需求,那么,选Istio,它是,最成熟,功能最强的,选择。
  • 如果,你想要,简单,轻量,易用的,服务网格,不需要,太复杂的功能,团队,不想花太多时间,研究复杂配置,主要,在Kubernetes上,那么,选Linkerd,它是,最简单,最轻量的,选择,上手很快。
  • 如果,你有,多平台,跨云,跨环境的需求,尤其是,有很多,虚拟机,或者,非Kubernetes的服务,或者,已经在用,HashiCorp的生态,那么,选Consul,它的,跨平台能力,和,服务发现,是最强的。

当然,这只是,一个,大致的,选型建议,具体,还要,根据,自己的,实际情况,来决定,最好,是,都试用一下,做个,POC,验证一下,看看,哪个,更适合,自己的场景。

三、其他常见面试题

最后,再整理几个,其他常见的,服务网格面试题。

面试题8:服务网格和API网关,有什么区别?它们是什么关系?

参考答案:

服务网格,和API网关,是,两个,不同的东西,但是,又有,一些,相似的功能,很多人,容易,混淆。

它们的区别,主要是:

  1. 位置不同:API网关,是,在,系统的,边界上,也就是,南北向的流量,从,外部,到,内部的,流量,经过API网关,它是,外部流量,进入系统的,入口。而,服务网格,是,在,系统的,内部,也就是,东西向的流量,服务之间的,互相调用的,流量,经过服务网格,它管理的,是,内部服务之间的,通信。
  2. 功能侧重不同:API网关,的功能,侧重,在,边界上的,治理,比如,认证,授权,限流,熔断,协议转换,请求路由,缓存,日志,等等,它,主要,是,管理,外部的,请求,怎么,进入系统,怎么,转发到,内部的服务。而,服务网格,的功能,侧重,在,内部服务之间的,通信治理,比如,服务发现,负载均衡,熔断,限流,重试,超时,mTLS,可观测性,等等,它,主要,是,管理,内部服务之间,怎么,互相调用,怎么,保证,通信的,可靠,安全,可观测。
  3. 部署方式不同:API网关,通常,是,一个,集中式的,组件,部署,在,系统的,入口,所有的,外部流量,都经过,这一个,网关。而,服务网格,是,分布式的,每个服务,旁边,都有一个,Sidecar代理,所有的,内部流量,都经过,对应的,Sidecar代理。

它们的关系,是,互补的,不是,互斥的。在一个,完整的,微服务架构中,通常,会,同时,有,API网关,和,服务网格,API网关,负责,南北向的,流量治理,也就是,外部流量,进入系统的,治理,服务网格,负责,东西向的,流量治理,也就是,内部服务之间,通信的治理,两者,配合,共同,完成,整个系统的,流量治理。

而且,现在,也有一些,融合的趋势,比如,Istio,也支持,Ingress Gateway,也就是,入口网关,能,实现,API网关的,一些功能,而,一些API网关,比如,Kong,也开始,支持,服务网格的,功能,但是,总体来说,两者,还是,各有侧重,配合使用,是,最好的。

面试题9:服务网格的性能开销,怎么样?会不会影响系统性能?

参考答案:

服务网格,因为,在,服务之间,加了,一层,Sidecar代理,所有的流量,都要,经过代理,所以,肯定,会有,一定的,性能开销,主要,体现在,延迟的增加,和,资源的占用。

延迟方面:因为,流量,要,多经过,一层,代理,所以,每次调用,都会,增加,一点,延迟,一般,是,几毫秒,到,十几毫秒,具体,取决于,代理的性能,和,配置。对于,大多数,应用来说,这点,延迟,是,可以接受的,因为,业务逻辑的,处理时间,通常,比这个,大得多,这点,延迟,占比,很小。但是,对于,对延迟,非常敏感的,应用,比如,高频交易,实时系统,等等,这点,延迟,可能,就需要,考虑了。

资源方面:每个服务,都要,部署一个,Sidecar代理,这个代理,会,占用,一定的,CPU和内存,一般,每个代理,占用,几十MB,到,几百MB的内存,和,一定的CPU,具体,取决于,代理的类型,和,流量的大小。如果,服务的数量,很多,比如,几百个,几千个服务,那么,所有的Sidecar代理,加起来,占用的资源,还是,很可观的,需要,考虑,集群的,资源容量。

不同的,服务网格,性能开销,也不一样:

  • Linkerd:因为,用的是,自己开发的,轻量级的,Rust代理,所以,性能开销,最小,延迟,最低,资源占用,最少。
  • Consul:默认,用Envoy,性能开销,中等,和Istio类似。
  • Istio:用Envoy,功能多,配置复杂,所以,性能开销,相对,较大,但是,也在,可接受的范围内,而且,Istio,也在,不断地,优化性能,每个版本,性能,都有提升。

总的来说,服务网格的,性能开销,是,存在的,但是,对于,大多数,应用来说,是,可以接受的,而且,服务网格,带来的,好处,比如,统一的,流量治理,安全,可观测性,等等,远远,大于,这点,性能开销的,代价。

当然,在,引入服务网格之前,最好,是,做一下,性能测试,评估一下,性能开销,对,自己的系统,有没有,大的影响,然后,再决定,要不要引入。

面试题10:引入服务网格,有什么挑战?需要注意什么?

参考答案:

引入服务网格,虽然,有很多好处,但是,也有,很多挑战,需要,注意:

  1. 复杂度增加:服务网格,本身,是一个,复杂的,基础设施,引入之后,系统的,复杂度,会,增加很多,需要,团队,学习,和,掌握,服务网格的,架构,概念,配置,等等,对,团队的,技术能力,有,一定的要求。
  2. 运维成本增加:服务网格,需要,部署,维护,升级,监控,等等,会,增加,运维的成本,和,复杂度,需要,有,专门的,团队,或者,人员,来,负责,服务网格的,运维。
  3. 性能开销:如前面所说,服务网格,会有,一定的,性能开销,包括,延迟的增加,和,资源的占用,需要,评估,对,自己系统的,影响。
  4. 排障难度增加:引入服务网格之后,调用链,更长了,出了问题,排查起来,更复杂了,需要,熟悉,服务网格的,原理,和,排障方法,不然,出了问题,很难,找到原因。
  5. 兼容性问题:服务网格,和,现有的,系统,工具,框架,可能,会有,兼容性问题,比如,和,现有的,服务发现,负载均衡,安全框架,等等,可能,会有,冲突,需要,做好,兼容性测试。
  6. 迁移成本:如果,现有的系统,已经,用了,其他的,服务治理方案,比如,Spring Cloud,Dubbo,等等,那么,迁移到,服务网格,会有,一定的,迁移成本,需要,逐步,迁移,不能,一步到位。

所以,引入服务网格,不能,盲目,要,根据,自己的,实际情况,评估,需求,和,成本,看看,是不是,真的,需要,服务网格,然后,再,决定,要不要引入,引入哪个。

而且,引入的时候,最好,是,先,从,非核心的,服务,开始,逐步,试点,积累经验,然后,再,逐步,推广到,核心服务,不要,一下子,全量,引入,避免,出问题,影响,线上业务。

四、写在最后

服务网格,是现在,云原生领域,很热门的技术,也是,微服务治理的,未来趋势,越来越多的公司,开始,引入,服务网格,来,治理,微服务的,通信。

Istio、Linkerd、Consul,是,现在,三个,主流的,服务网格,各有,各的,特点,各有,各的,优势,也各有,各的,适用场景,没有,绝对的,谁好谁坏,只有,适合不适合,自己的场景。

面试的时候,关于,服务网格的问题,也越来越多,尤其是,这三个,服务网格的,对比,更是,高频考点,希望,这篇文章,整理的,这些面试题,和,参考答案,能给,正在准备面试的朋友,一些,参考和帮助。

当然,这些,只是,我个人的,理解,和,整理,可能,有,不对的,地方,欢迎大家,指正,也欢迎大家,在评论区,分享,你们的,理解,和,经验,一起交流,一起进步。

最后,希望大家,都能,学好,服务网格,用好,服务网格,在,云原生的,时代,跟上,技术的,潮流,提升,自己的,技术能力,和,竞争力。

愿我们,都能,在技术的,道路上,不断学习,不断进步,成为,更好的,工程师。