您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 开发技术 > 正文

一篇聊透云原生中的服务网格

发表于:2024-05-09 作者:demo123567 来源:海燕技术栈

服务网格

服务网格是一种软件架构模式,用于管理和连接微服务架构中的服务。它提供了一种方法,使得微服务之间的通信变得更加可靠、安全和灵活。服务网格通常由一组轻量级的代理程序组成,这些代理程序负责处理服务之间的通信,管理流量、安全性、监控和其他相关的任务。它们还可以提供诸如负载均衡、故障转移和自动伸缩等功能,从而帮助确保整个微服务架构的可靠性和可伸缩性。Istio 和 Linkerd 是两个常见的服务网格实现。

图片
 

图片

特点

作为应用程序间通信的中间层

  • 服务网格充当了应用程序之间通信的中间层。它们位于微服务架构中服务之间的通信路径上,负责管理和控制所有的通信流量。
  • 这种中间层的存在使得服务之间的通信变得更加可靠,因为它们可以处理通信中的许多复杂性,例如负载均衡、故障转移和安全性等。

轻量级网络代理

  • 服务网格通常由轻量级的网络代理组成,这些代理直接嵌入到应用程序或者与应用程序运行在同一主机上。
  • 这些代理负责拦截和处理服务之间的所有通信,执行所需的功能,例如流量管理、安全性、监控等。

应用程序无感知

  • 服务网格的设计目标之一是使得应用程序无需感知网格的存在。应用程序可以专注于自己的业务逻辑,而无需处理底层的通信细节。
  • 这种无感知性意味着在将应用程序部署到服务网格中时,不需要对应用程序进行任何修改。

解耦应用程序的重试/超时、监控、追踪和服务发现

  • 服务网格解耦了与通信相关的许多关注点,包括重试、超时、监控、追踪和服务发现等。
  • 通过将这些功能从应用程序中抽象出来并集中管理,服务网格可以提供统一的解决方案来处理这些问题,从而降低了应用程序开发人员的负担,并提高了整个架构的可维护性和可靠性。

功能

服务发现

  • 服务网格可以自动发现和注册微服务实例,并将它们的位置信息存储在服务注册表中。这使得其他服务能够动态地找到并与所需的服务进行通信,而无需硬编码服务的位置信息。

负载均衡

  • 服务网格可以根据预先定义的负载均衡策略,将请求均匀地分配到可用的服务实例上。这有助于提高系统的性能和可伸缩性,确保每个服务实例都能够有效地处理流量。

加密通信

  • 通过加密通信功能,服务网格可以确保微服务之间的通信是安全的。它可以使用诸如TLS(传输层安全性)等加密协议来加密通信流量,以防止敏感数据在传输过程中被窃取或篡改。

观察与追踪微服务之间的拓扑

  • 服务网格可以提供观察和追踪微服务之间通信拓扑的功能。这包括监控服务之间的通信模式、识别潜在的性能瓶颈和故障点,并提供实时的监控指标和分析报告。

服务之间访问的鉴权与授权

  • 通过鉴权与授权功能,服务网格可以确保只有经过授权的服务和用户才能够访问特定的服务。它可以实施访问控制策略,例如基于角色的访问控制(RBAC)或令牌验证,以确保服务之间的安全通信。

熔断机制

  • 熔断机制是服务网格提供的一种故障处理机制,用于防止故障的传播和影响系统的稳定性。当检测到某个服务出现故障或响应时间超过阈值时,熔断机制可以暂时停止将流量发送到该服务,以避免对整个系统产生负面影响。

数据平面

通过接收控制面发送的路由与控制信息来定向转发或处理数据。

当谈到服务网格时,这些特点是其核心功能之一,它们通过数据面和控制面的配合来实现。

服务发现

  • 服务网格通过服务发现功能来发现后端服务实例中哪些是可用的。这意味着当新的服务实例被部署或旧的实例被移除时,服务网格能够自动检测到这些变化并更新服务发现的信息。

健康检查

  • 健康检查功能允许服务网格定期向服务发送心跳,以检测服务实例是否存活。如果服务实例未能及时响应健康检查请求,服务网格将其标记为不可用,并停止将流量发送到该实例。

鉴权

  • 通过鉴权功能,服务网格可以对访问请求进行加解密验证,以确保只有经过授权的请求才能够访问服务。这有助于保护服务免受未经授权的访问或攻击。

负载均衡

  • 负载均衡功能使服务网格能够对多个下游服务进行流量的均衡分配。这确保了在负载增加时,流量能够被有效地分发到各个服务实例上,从而提高了系统的性能和可用性。

流量统计

  • 通过流量统计功能,服务网格可以对每个请求的流量进行统计,并生成相应的监控数据和追踪信息。这些统计数据可以用于分析系统的性能、诊断问题和优化服务架构。

熔断限流

  • 熔断限流功能允许服务网格确定最大的查询率(QPS)、最大并发数等限制,并在达到这些限制时拒绝新的请求。这有助于保护后端服务免受过载的影响,并提高整个系统的稳定性和可靠性。

数据面和控制面的配合

  • 数据面主要负责接收系统中的每个请求和包,并根据预先配置的规则和策略来处理流量。常见的数据面包括Envoy、HAProxy、Nginx等。
  • 控制面则负责管理和配置数据面,包括配置服务发现、健康检查、鉴权规则、负载均衡策略等。常见的控制面包括Istio、SmartStack等。控制面与数据面的配合使得服务网格能够灵活地管理和控制服务之间的通信,实现高度可靠和可扩展的微服务架构。

控制面

服务网格的控制面是指服务网格架构中负责管理和配置数据面的部分。它通常由一组组件组成,这些组件负责实现服务发现、流量管理、安全控制、监控、故障处理等功能。控制面的主要任务是为数据面提供所需的配置信息,以确保服务网格能够按照预期的方式运行,并满足各种业务需求和运维要求。

图片
 

图片

服务发现

管理和维护服务注册表,跟踪服务实例的可用性和位置,以便数据面能够将流量正确地路由到目标服务。

流量管理

配置负载均衡、路由规则、限流策略等,以确保流量能够按照预期的方式在服务之间进行传输,并保证服务的可用性和性能。

安全控制

实施安全策略,例如认证、授权、加密解密等,以保护服务之间的通信安全,并防止未经授权的访问和数据泄露。

监控和指标收集

收集和分析服务之间的通信数据、性能指标和错误信息,以便进行故障诊断、性能优化和资源规划。

故障处理

实施故障检测、熔断、重试等机制,以确保在服务发生故障或不可用时能够及时地进行处理,保障整个系统的稳定性和可靠性。

常见的服务网格控制面包括 Istio、Linkerd 控制平面等。这些控制面组件通常以集群部署方式运行,与数据面组件(如 Envoy、HAProxy 等)协同工作,共同构建出高度可靠和高度可扩展的服务网格架构。

服务网格的优点

解耦微服务业务架构和服务控制

服务网格实现了微服务业务逻辑与底层服务控制的解耦。微服务只需专注于实现自己的业务逻辑,而不必在代码中繁琐配置与服务通信相关的依赖库和配置项。这种解耦使得微服务开发更加简洁和高效。

抽象共性需求,统一实现

服务网格将微服务中常见的共性需求(如流量统计、trace埋点、限流控制等)抽象出来,作为统一的实现层。这些功能由基础架构团队负责实现,并通过服务网格的统一部署方式,为所有微服务提供支持。这样一来,不同微服务间不再需要重复编码这些通用功能,极大地提高了开发效率和代码复用性。

业务开发者专注于业务逻辑

有了服务网格,业务开发者不再需要分心关注微服务的共性需求和底层服务控制,可以更专注地投入到业务逻辑的实现上。这使得开发人员能够更快速、高效地迭代业务功能,加速产品上线和迭代。

统一升级和维护

服务网格的统一实现层由基础架构团队负责升级和维护,业务开发者无需担心底层服务控制的变化和更新。这降低了微服务的维护成本,同时保证了整个微服务架构的稳定性和可靠性。

提升组织效率

通过将共性需求抽象为服务网格的统一实现层,并由基础架构团队统一维护,服务网格提高了组织的整体效率。业务开发者能够更专注于业务功能的实现,基础架构团队则负责提供稳定可靠的底层服务控制,使得整个组织能够更快速、高效地实现业务目标。

服务网格的技术栈

服务网格的技术栈通常包括以下几个方面的技术和工具

代理和数据面

  • 代理和数据面组件负责处理服务之间的通信流量,执行负载均衡、安全性、监控等功能。

Envoy

HAProxy

NGINX

控制面

  • 控制面负责管理和配置数据面,实现服务发现、流量管理、安全控制、监控等功能。

Istio

Linkerd

Consul

监控和指标收集

  • 监控和指标收集组件用于收集和分析服务之间的通信数据、性能指标和错误信息。

Prometheus

Grafana

Zipkin

Jaeger

安全性和鉴权

  • 安全性和鉴权组件用于实现对服务之间通信的加密、认证和授权。

JWT(JSON Web Token)

OAuth2

SPIFFE(Secure Production Identity Framework for Everyone)

服务发现

  • 服务发现组件用于发现和注册微服务实例,以便其他服务能够动态地找到并与它们进行通信。常见的服务发现工具包括

Consul

etcd

ZooKeeper

流量管理

  • 流量管理组件用于配置负载均衡、路由规则、限流策略等,以确保流量能够按照预期的方式在服务之间进行传输。

Kong

Traefik

Ambassador

熔断和故障处理

  • 熔断和故障处理组件用于实现故障检测、熔断、重试等机制,以确保在服务出现故障或不可用时能够进行适当的处理。

Hystrix

Istio Circuit Breaker

我们来总结一下,服务网格的技术栈涵盖了代理和数据面、控制面、监控和指标收集、安全性和鉴权、服务发现、流量管理以及熔断和故障处理等方面的技术和工具。

技术栈图

我们可以使用plantuml画出对应的用例图


@startuml


left to right direction


actor 用户 as User


package "服务网格技术栈" {
    usecase "代理和数据面" as Proxy
    usecase "控制面" as ControlPlane
    usecase "监控和指标收集" as Monitoring
    usecase "安全性和鉴权" as Security
    usecase "服务发现" as ServiceDiscovery
    usecase "流量管理" as TrafficManagement
    usecase "熔断和故障处理" as CircuitBreaker


    User --> Proxy : 发送请求
    User --> ControlPlane : 配置服务规则
    User --> Monitoring : 查看监控数据
    User --> Security : 进行认证和授权
    User --> ServiceDiscovery : 发现可用服务
    User --> TrafficManagement : 配置负载均衡
    User --> CircuitBreaker : 设置故障处理策略


    ControlPlane --> Proxy : 下发配置
    ControlPlane --> Monitoring : 收集指标
    ControlPlane --> Security : 实施安全策略
    ControlPlane --> ServiceDiscovery : 更新服务列表
    ControlPlane --> TrafficManagement : 配置路由规则
    ControlPlane --> CircuitBreaker : 触发熔断


    Proxy --> ControlPlane : 上报状态
    Proxy --> Monitoring : 发送监控数据
    Proxy --> Security : 执行安全操作
    Proxy --> ServiceDiscovery : 查询服务列表
    Proxy --> TrafficManagement : 处理流量策略
    Proxy --> CircuitBreaker : 进行故障检测


    Monitoring --> ControlPlane : 提供监控数据
    Monitoring --> Proxy : 收集代理状态
    Monitoring --> Security : 记录安全事件
    Monitoring --> ServiceDiscovery : 分析服务拓扑
    Monitoring --> TrafficManagement : 分析流量分布
    Monitoring --> CircuitBreaker : 监控故障情况
}


@enduml
 

图片
 

图片

这个用例图描述了服务网格技术栈中各个组件之间的交互关系以及用户如何使用这些技术来实现不同的功能。

用户

表示使用服务网格的终端用户或系统用户,他们通过与不同的技术组件进行交互,来达到他们的目标。

代理和数据面

代表了处理服务之间通信流量的组件。它们与用户交互,处理用户发送的请求,并向控制面报告状态。同时,它们也与控制面、监控和指标收集、安全性和鉴权、服务发现、流量管理以及熔断和故障处理等组件进行交互,以执行相应的功能。

控制面

负责管理和配置数据面,实现服务发现、流量管理、安全控制、监控等功能。它接收来自用户的配置请求,并将配置信息下发到数据面,同时收集来自数据面的状态和监控信息,以便进行相应的调整和优化。

监控和指标收集

负责收集和分析服务之间的通信数据、性能指标和错误信息。它与用户交互,提供监控数据给用户查看,并与控制面、代理和数据面等组件进行交互,以实现监控和诊断功能。

安全性和鉴权

实施对服务之间通信的加密、认证和授权。它与用户进行交互,执行安全操作,并与控制面、代理和数据面等组件进行交互,以保护服务之间的通信安全。

服务发现

负责发现和注册微服务实例,以便其他服务能够动态地找到并与它们进行通信。它与用户交互,提供服务发现功能,并与控制面、代理和数据面等组件进行交互,以更新服务列表和服务拓扑。

流量管理

负责配置负载均衡、路由规则、限流策略等,以确保流量能够按照预期的方式在服务之间进行传输。它与用户进行交互,提供流量管理功能,并与控制面、代理和数据面等组件进行交互,以配置和调整流量策略。

熔断和故障处理

负责实施故障检测、熔断、重试等机制,以确保在服务出现故障或不可用时能够进行适当的处理。它与用户进行交互,提供熔断和故障处理功能,并与控制面、代理和数据面等组件进行交互,以监控和处理故障情况。